Skip to content

feat(agents): nest analyst, eval author, and experimentalist under nemo agents - #1026

Merged
nicot merged 3 commits into
mainfrom
nest-agent-clis-under-nemo-agents/ntonozzi
Jul 31, 2026
Merged

feat(agents): nest analyst, eval author, and experimentalist under nemo agents#1026
nicot merged 3 commits into
mainfrom
nest-agent-clis-under-nemo-agents/ntonozzi

Conversation

@nicot

@nicot nicot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary

The analyst, Eval Author, and experimentalist each had their own top-level command group, so nothing in the CLI signalled that they are agents rather than unrelated tools. They now register under the nemo.cli.agents entry-point group, which AgentsCLI already discovers and mounts, making nemo agents <agent> <verb> the canonical path.

Nothing breaks. The nemo.cli entries are untouched, so every existing top-level command still resolves.

Command inventory

Canonical Legacy (still works)
nemo agents analyst run nemo insights analyze
nemo agents analyst doctor nemo insights doctor
nemo agents eval-author {discover,audit,propose,run,doctor} nemo eval-author <verb>
nemo agents experimentalist {run,doctor} nemo experimentalist <verb>

Periodic-analysis management (nemo insights analysis {enable,disable,status}) and the analyze job (nemo agents analyze {run,submit,explain}) are unchanged. They drive scheduled runs rather than the analyst itself, so they stay where they are.

Implementation notes

  • Experimentalist and Eval Author dual-register the same class under both entry-point groups, so there is one command tree reachable from two mounts.
  • The analyst had no group of its own — it lived as nemo insights analyze. Its analyze and doctor callbacks move to module scope and a new AnalystCLI mounts them as run and doctor. Both trees register the same function objects, so the implementations cannot drift.
  • Eval Author's placeholder message now reports ctx.command_path instead of a hardcoded string, so it names whichever mount the caller actually used.

Tutorial cleanup

docs/get-started/example-agent.mdx now starts the platform with uv run nemo setup instead of sourcing config/local.env and passing --config config/local.yaml. Verified that neither is needed: the runner falls back to its bundled config, StudioService._get_static_files_path() resolves web/packages/studio/dist from the source checkout on its own, and the tau3 .env copied in step 3 already exports NMP_BASE_URL. nemo setup additionally registers the inference provider and picks a default model, which the manual block left to the reader.

ClickHouse remains a separate step — nothing in platform startup provisions it, and Intake returns 503 on trace ingest until it is reachable.

Test plan

  • pytest plugins/nemo-insights/tests plugins/nemo-eval-author/tests plugins/nemo-experimentalist/tests plugins/nemo-agents/tests/unit/test_cli_extensions.py — 1220 passed, 3 skipped
  • ruff check / ruff format --check clean across the three plugins
  • Every canonical, legacy, and unchanged path above resolves through the real nemo CLI
  • nemo agents analyst run executed end to end against a live platform and wrote insights
  • make docs-check passes; generated CLI reference is unchanged (plugin CLIs are excluded from generation)
  • Studio static-path fallback confirmed with NMP_CONFIG_FILE_PATH unset

Summary by CodeRabbit

  • New Features

    • Added nemo agents analyst run and nemo agents analyst doctor.
    • Added nemo agents experimentalist command support.
    • Added nemo agents eval-author with discover, audit, propose, run, and doctor subcommands.
    • Legacy command paths remain available for compatibility.
  • Documentation

    • Updated setup instructions to start ClickHouse separately and use nemo setup.
    • Updated examples, help text, and command references to use the new agent paths.

@nicot
nicot requested review from a team as code owners July 31, 2026 21:41
@github-actions github-actions Bot added the feat label Jul 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 5b53fce8-5a90-40b2-be1b-7a445a4f0003

📥 Commits

Reviewing files that changed from the base of the PR and between ad9e0d6 and fe949e2.

📒 Files selected for processing (12)
  • docs/get-started/example-agent.mdx
  • plugins/nemo-eval-author/pyproject.toml
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/cli.py
  • plugins/nemo-eval-author/tests/test_cli.py
  • plugins/nemo-experimentalist/AGENTS.md
  • plugins/nemo-experimentalist/pyproject.toml
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/cli.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/profile.py
  • plugins/nemo-experimentalist/tests/test_cli_profile.py
  • plugins/nemo-insights/pyproject.toml
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/cli.py
  • plugins/nemo-insights/src/nemo_insights_plugin/cli.py
🚧 Files skipped from review as they are similar to previous changes (12)
  • plugins/nemo-experimentalist/tests/test_cli_profile.py
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/cli.py
  • plugins/nemo-insights/pyproject.toml
  • plugins/nemo-experimentalist/pyproject.toml
  • plugins/nemo-eval-author/pyproject.toml
  • plugins/nemo-experimentalist/AGENTS.md
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/profile.py
  • docs/get-started/example-agent.mdx
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/cli.py
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/cli.py
  • plugins/nemo-insights/src/nemo_insights_plugin/cli.py
  • plugins/nemo-eval-author/tests/test_cli.py

📝 Walkthrough

Walkthrough

The PR registers Analyst, Experimentalist, and Eval Author under nemo agents. It preserves legacy paths, shares Insights callbacks, updates command references, and revises example-agent setup instructions.

Changes

Agent CLI migration

Layer / File(s) Summary
Analyst CLI and shared callbacks
plugins/nemo-insights/pyproject.toml, plugins/nemo-insights/src/nemo_insights_plugin/analyst/cli.py, plugins/nemo-insights/src/nemo_insights_plugin/cli.py
Registers AnalystCLI under nemo.cli.agents. Shared analyze and doctor callbacks serve both AnalystCLI and the legacy InsightsCLI.
Eval Author registration and compatibility
plugins/nemo-eval-author/pyproject.toml, plugins/nemo-eval-author/src/nemo_eval_author_plugin/cli.py, plugins/nemo-eval-author/tests/test_cli.py
Adds nemo agents eval-author. Placeholder commands report the invoked path. Tests cover canonical and legacy registrations.
Experimentalist command migration
plugins/nemo-experimentalist/pyproject.toml, plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/cli.py, plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/profile.py, plugins/nemo-experimentalist/tests/test_cli_profile.py, plugins/nemo-experimentalist/AGENTS.md
Registers Experimentalist under nemo.cli.agents and updates command references, messages, profiles, tests, and plugin guidance.
Getting-started command updates
docs/get-started/example-agent.mdx
The guide starts ClickHouse separately, runs nemo setup, and uses canonical Analyst and Experimentalist commands.

Possibly related PRs

Suggested reviewers: ryana

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes nesting the analyst, Eval Author, and experimentalist commands under nemo agents.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch nest-agent-clis-under-nemo-agents/ntonozzi

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@plugins/nemo-experimentalist/pyproject.toml`:
- Around line 24-26: The Experimentalist command path must consistently use
top-level nemo experimentalist rather than nested nemo agents experimentalist.
In plugins/nemo-experimentalist/pyproject.toml lines 24-26, remove the nested
entry-point registration; update the command references in
plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/cli.py lines 4-8,
58, 82, 120, and 235, the consumer command in
plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/profile.py lines
7-9, and the invocation in docs/get-started/example-agent.mdx line 105 to the
top-level path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: fff68b37-3e5a-494f-8a52-09d79a17fa8e

📥 Commits

Reviewing files that changed from the base of the PR and between e9feac9 and 93069e4.

📒 Files selected for processing (11)
  • docs/get-started/example-agent.mdx
  • plugins/nemo-eval-author/pyproject.toml
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/cli.py
  • plugins/nemo-eval-author/tests/test_cli.py
  • plugins/nemo-experimentalist/pyproject.toml
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/cli.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/profile.py
  • plugins/nemo-experimentalist/tests/test_cli_profile.py
  • plugins/nemo-insights/pyproject.toml
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/cli.py
  • plugins/nemo-insights/src/nemo_insights_plugin/cli.py

Comment thread plugins/nemo-experimentalist/pyproject.toml
@github-actions

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 29440/37448 78.6% 63.2%
Integration Tests 17382/36166 48.1% 20.6%

nicot added 3 commits July 31, 2026 15:25
…emo agents`

The three platform agents each had their own top-level command group, so the
CLI gave no hint that they are agents rather than unrelated tools. Register
them under the `nemo.cli.agents` entry-point group instead, which `AgentsCLI`
already discovers and mounts, making `nemo agents <agent> <verb>` the canonical
path.

Experimentalist and Eval Author dual-register the same class, so their verbs
are unchanged. The analyst had no command group of its own -- it lived as
`nemo insights analyze` -- so its `analyze` and `doctor` callbacks move to
module scope and a new `AnalystCLI` mounts them as `run` and `doctor`. Both
trees share the same function objects rather than duplicating an
implementation. Periodic-analysis management and the analyze job stay on
`nemo insights`: they drive scheduled runs, not the analyst.

Every existing top-level command keeps working; the `nemo.cli` entries are
untouched. Eval Author's placeholder message now reports the invoked path via
`ctx.command_path` so it names whichever mount the caller used.

Signed-off-by: Nico Tonozzi <ntonozzi@nvidia.com>
Step 2 sourced `config/local.env` and passed `--config config/local.yaml` to
`nemo services start`. Neither is needed: the runner falls back to its bundled
config, Studio resolves `web/packages/studio/dist` from the source checkout on
its own, and the tau3 `.env` copied in step 3 already exports `NMP_BASE_URL`.
`nemo setup` also registers the inference provider and picks a default model,
which the manual block left to the reader.

ClickHouse stays a separate step. Nothing in platform startup provisions it,
and Intake returns 503 on trace ingest until it is reachable.

Also point the analyst and experimentalist steps at the nested `nemo agents`
paths.

Signed-off-by: Nico Tonozzi <ntonozzi@nvidia.com>
…S.md

The 2026-07-24 rename log asserted that the command group is top-level
"rather than the eventual `nemo agents experimentalist`," because the
platform's `nemo.cli` entry-point group was flat at the time. That constraint
is gone -- `nemo.cli.agents` exists and `AgentsCLI` mounts it -- but the
paragraph reads as standing guidance, so review bots and coding agents cite it
to reject the nested path.

Add a dated entry for the move and correct the stale paragraph in place.

Signed-off-by: Nico Tonozzi <ntonozzi@nvidia.com>
@nicot
nicot force-pushed the nest-agent-clis-under-nemo-agents/ntonozzi branch from ad9e0d6 to fe949e2 Compare July 31, 2026 22:26
@nicot
nicot added this pull request to the merge queue Jul 31, 2026
Merged via the queue into main with commit 74225c4 Jul 31, 2026
61 checks passed
@nicot
nicot deleted the nest-agent-clis-under-nemo-agents/ntonozzi branch July 31, 2026 23:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants