Skip to content

feat(agents): allow optimization agents to configure models - #1159

Merged
BrianNewsom merged 16 commits into
mainfrom
plugin-model-pairs/brnewsom
Aug 7, 2026
Merged

feat(agents): allow optimization agents to configure models#1159
BrianNewsom merged 16 commits into
mainfrom
plugin-model-pairs/brnewsom

Conversation

@BrianNewsom

@BrianNewsom BrianNewsom commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR makes the Analyst, Eval Author, and Experimentalist use the models selected through nemo setup. It replaces plugin-specific endpoints, credentials, hardcoded model names, and Experimentalist's three-tier model configuration with one Platform-native pair: default_model for quality-oriented work and fast_model for latency-oriented work, with fast falling back to default.

Before this change, each optimization plugin configured inference independently. Setup-selected models and credentials in Platform Secrets were not reused, so OpenAI-compatible providers required manual plugin configuration and Anthropic could not be selected in setup and consumed through its native Messages contract.

Changes

Platform-native model selection

nemo setup now stores two workspace-qualified Model Entity references in the active CLI context:

default_model: default/gpt-5
fast_model: default/gpt-5-mini

Shared logic in nemo_platform_plugin reads the pair, resolves each entity through the existing Platform SDK, uses its actual served model name/provider route/backend format/Platform headers, constructs the corresponding Nooa/LiteLLM client, and activates those clients for the agent run.

Backend selection comes from the Model Entity rather than model-name heuristics:

  • OPENAI_CHAT uses the OpenAI-compatible Chat Completions contract.
  • ANTHROPIC_MESSAGES uses Anthropic's native Messages contract.

The plugins do not translate request or response bodies. Provider credentials stay in Platform Secrets and are never passed into the optimization agents.

Consistent agent roles

  • default_model is the existing quality-oriented default and replaces the previous smart role.
  • fast_model is used only for deliberately latency-sensitive or high-volume work, such as summarization and control steps.
  • Experimentalist's former mid-tier uses are assigned to default or fast based on their quality requirements; setup does not try to infer a third provider-independent capability tier.
  • Individual plugins only request the active default or fast client; Model Entity parsing, served-name lookup, routing headers, backend selection, and client lifetime are centralized.

Experimentalist's checked-in models.yaml remains separate: it controls model mutations for the agent under test, not the models running the optimizer itself. Application and benchmark credentials such as AUT_MODEL_NAME, OPENAI_API_KEY, and OPENAI_BASE_URL may therefore still be required by the evaluated workload.

Setup and compatibility

Interactive setup asks for a default and fast model. The fast prompt defaults to the chosen default, so users who want one model can press Enter twice without understanding the internal role mapping.

nemo setup --auto preserves main's behavior:

  • Use NEMO_DEFAULT_MODEL when set; otherwise select the alphabetically first discovered Model Entity.
  • Use NEMO_FAST_MODEL when set; otherwise reuse the effective default.

Existing contexts that only contain default_model remain compatible because fast automatically falls back to default.

For CI, containers, and other environments that cannot read the host CLI context, the pair can be overridden with Model Entity references:

export NEMO_DEFAULT_MODEL=default/gpt-5
export NEMO_FAST_MODEL=default/gpt-5-mini

The referenced entities and providers must already exist on the target Platform.

Removed optimizer-specific configuration

The optimization agents no longer consume:

  • AUTHOR_API_BASE, AUTHOR_API_KEY, or AUTHOR_*_MODEL_NAME
  • NEMO_EXPERIMENTALIST_API_BASE or NEMO_EXPERIMENTALIST_API_KEY
  • NEMO_EXPERIMENTALIST_MODELS_SMART, NEMO_EXPERIMENTALIST_MODELS_MID, or NEMO_EXPERIMENTALIST_MODELS_FAST
  • INFERENCE_API_KEY as an optimization-agent credential

Scheduled Analyst runs

nemo insights analysis enable now persists the effective pair in the server-side analysis config. The controller does not need access to the operator's local ~/.config/nmp/config.yaml. Re-run analysis enable after changing the pair; previously enabled records must also be re-enabled once to capture it.

Anthropic setup's auth_header_format fix is intentionally isolated in #1158.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with documentation updates
  • Documentation only
  • Contributor tooling or automation
  • CI, build, or test infrastructure

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Documentation updated for user-visible behavior
  • Documentation not applicable — justification:

Verification

  • Pull request title follows the repository's Conventional Commit format
  • Every commit includes an appropriate Signed-off-by: trailer
  • uv run pre-commit run -a passes, or any blocked checks are identified below
  • Targeted tests pass, or tests are marked not applicable above
  • No secrets, API keys, or credentials are included

Targeted validation:

  • uv run --frozen pytest packages/nemo_platform_ext/tests/cli/commands/test_setup.py -q — 229 passed.
  • uv run --frozen pytest sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/test_setup.py -q — 229 passed.
  • Shared adapter + Analyst + Eval Author + Experimentalist scope before the latest main sync — 2,386 passed, 3 intentional live-test skips.
  • Latest main conflict-resolution scope — Experimentalist: 618 passed; Eval Author: 43 passed, 3 intentional live-test skips; focused cross-plugin regression set: 25 passed; targeted ty: passed.
  • Latest main sync (ff047d2a57) — preserved the new SDK/bootstrap/mise documentation and the model-pair setup text; relevant file-level pre-commit hooks passed.
  • uv run pre-commit run -a after the latest main sync — Ruff, formatting, ty, config docs, Helm docs, copyright, UI, import-boundary, and merge-conflict checks passed. uv-lock-check is blocked because uv lock adds newly published wheel metadata despite no dependency-input change; that generated drift is excluded, and the committed lock resolves successfully with uv run --frozen.
  • make docs-check — passed; 216 MDX files parsed cleanly and no published-to-gated links found.
  • make docs-broken-links — command exited successfully but reported five existing broken links in unchanged pages (telemetry-and-privacy.mdx, using-authentication.mdx, and studio/index.mdx). None are in this pull request's changed documentation.

Live provider validation:

  • Analyst completed against an internal NVIDIA inference model (default/openai-openai-gpt-5-5) and created two Insights from 19 observed sessions. Separate Analyst runs completed with native Anthropic models and with an OpenAI default + Anthropic fast pair.
  • Eval Author's live repair canary completed with distinct configured models and invoked the direct OpenAI default/gpt-5-mini fast path.
  • Experimentalist completed a full one-round Tau3 optimization with the internal GPT-5.5 default and direct OpenAI GPT-5 Mini fast model. Platform logs recorded 39 successful default calls and one successful fast call; the candidate won held-out validation with reward 0.5.

Summary by CodeRabbit

  • New Features

    • Added separate default and fast model selection through setup, including discovery, fallback, and validation.
    • Analysis configurations now persist and use both selected models.
    • Eval Author, Experimentalist, and Analyst now use centrally configured Platform models.
  • Documentation

    • Updated setup guides, examples, troubleshooting, and configuration references.
    • Replaced legacy provider-specific model and credential instructions.
  • Bug Fixes

    • Improved model routing, resource cleanup, preflight checks, and scheduled-analysis model propagation.

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
@github-actions github-actions Bot added the feat label Aug 7, 2026
@BrianNewsom
BrianNewsom marked this pull request as ready for review August 7, 2026 05:45
@BrianNewsom
BrianNewsom requested review from a team as code owners August 7, 2026 05:45
@BrianNewsom BrianNewsom changed the title feat(agents): use setup-selected model pairs feat(agents): allow optimization agents to configure models Aug 7, 2026
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR moves Insights, Experimentalist, and Eval Author to Platform-managed default and fast model pairs. Setup persists and resolves both models. Runtime integrations share routed clients with scoped cleanup. Insights stores model pairs for scheduled analysis. Legacy credential and tier configuration is removed.

Changes

Platform-managed model routing

Layer / File(s) Summary
Model-pair setup and context resolution
packages/nemo_platform_ext/...
nemo setup selects provider-scoped default and fast models, persists both values, supports environment overrides, and falls back from fast to default.
Shared model clients
packages/nemo_platform_plugin/...
Platform model entities resolve to OpenAI- or Anthropic-compatible clients with scoped activation, deduplication, and cleanup.
Plugin runtime integration
plugins/nemo-experimentalist/..., plugins/nemo-eval-author/..., plugins/nemo-insights/...
Plugin components and runners use shared default and fast clients. Legacy credential and tier handling is removed.

Insights persistence and execution

Layer / File(s) Summary
Analysis enable contract
plugins/nemo-insights/src/nemo_insights_plugin/schema.py, service.py, sdk_resources/...
Enable requests require and persist non-empty default and fast model references. Re-enabling replaces the stored pair.
Scheduled analysis execution
plugins/nemo-insights/src/nemo_insights_plugin/controller.py, jobs/analyze.py, analyst/run.py
Scheduled jobs pass persisted model references to Analyst execution through Platform task SDK clients.
Preflight and validation
plugins/nemo-insights/src/nemo_insights_plugin/preflight.py, plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/preflight.py
Preflight checks configured models instead of plugin-owned credentials. Missing configuration returns setup guidance.

Supporting configuration and documentation

Layer / File(s) Summary
Guides and examples
README.md, SETUP.md, docs/..., plugins/*/README.md, .env.example files
Documentation describes Platform model entities, default/fast selection, overrides, provider credentials, and model-pair persistence.
CI and testbed setup
.github/workflows/..., plugins/nemo-insights/testbed/...
Test jobs run nemo setup and start model-routing services instead of requiring plugin-owned inference credentials.
Legacy configuration removal
docs/set-up/config-reference.mdx, script/generate_config_docs.py, plugins/nemo-experimentalist/benchmarks/...
Experimentalist configuration sections and tiered model entries are removed from configuration and generated documentation.

Possibly related PRs

Suggested labels: breaking

Suggested reviewers: svvarom

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 34.22% 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
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: optimization agents now use configurable models through the shared setup flow.
✨ 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 plugin-model-pairs/brnewsom

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: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
plugins/nemo-insights/examples/research-agent/README.md (1)

75-80: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not combine --auto with prompt instructions.

--auto uses automatic setup behavior. It does not support “press Enter at the fast prompt.” Remove --auto for interactive selection, or revise the text to describe automatic selection.

🤖 Prompt for 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.

In `@plugins/nemo-insights/examples/research-agent/README.md` around lines 75 -
80, Update the setup instructions around the `nemo setup` command so they no
longer combine `--auto` with interactive prompt guidance. Either remove `--auto`
to preserve the documented Enter-to-reuse behavior, or revise the surrounding
text to describe automatic model selection.
🧹 Nitpick comments (2)
packages/nemo_platform_ext/src/nemo_platform_ext/config/config.py (1)

75-78: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Model resolution logic is duplicated.

resolve() and _create_default_config() now contain the same three-step precedence chain. Extract a small helper so a future precedence change updates one place.

Also applies to: 489-492, 501-501, 551-559

🤖 Prompt for 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.

In `@packages/nemo_platform_ext/src/nemo_platform_ext/config/config.py` around
lines 75 - 78, Extract the duplicated three-step model precedence chain from
resolve() and _create_default_config() into a shared helper, then reuse that
helper at all affected call sites. Preserve the existing precedence and ensure
future model-resolution changes only require updating the helper.
packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/setup.py (1)

2251-2262: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

NEMO_FAST_MODEL is dropped when no default model resolves.

If discovery returns nothing and NEMO_DEFAULT_MODEL is unset, the else branch runs and neither model is persisted, even when the user exported NEMO_FAST_MODEL. Persist the fast model in that case, or state in the warning that the fast override is ignored without a default.

🤖 Prompt for 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.

In `@packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/setup.py`
around lines 2251 - 2262, Update the model persistence flow around ModelPair and
the default_model fallback so an explicitly configured NEMO_FAST_MODEL is not
discarded when default_model is unavailable. Persist the fast override in the
no-default branch using the existing model configuration mechanism, or
explicitly warn that it is ignored; preserve the current behavior when a default
model resolves.
🤖 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 @.github/workflows/insights-testbed.yml:
- Around line 117-121: Update the NEMO_DEFAULT_MODEL fallback to the
provider-discovered ID default/openai-gpt-5-5, and remove NEMO_FAST_MODEL when
it matches the default so _run_auto_mode supplies the fallback.

In `@docs/get-started/example-agent.mdx`:
- Around line 168-169: Add the clone-mode warning immediately before the
Git-backed command containing NEMO_DEFAULT_MODEL and NEMO_FAST_MODEL, explaining
that clone mode is an integrity boundary rather than a confidentiality boundary.
Keep the existing later local-only warning unchanged.

In `@packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/setup.py`:
- Around line 390-414: Update _configure_local_connection so setup never
overwrites an existing context named by _LOCAL_CONTEXT_NAME. Before
Config.write, detect whether that context already exists and reject the
operation or use a distinct dedicated context, preserving the existing context’s
endpoint and credentials while retaining the local no-auth setup behavior.

In `@packages/nemo_platform_plugin/src/nemo_platform_plugin/nooa_model_client.py`:
- Around line 47-51: Update NooaModelClient.aclose to always attempt closing
fast when it is distinct from default, even if default.aclose fails. In the
model-resolution failure path around resolved, close every already-created
client before re-raising the original resolution error. Add failure-path tests
covering both cleanup scenarios in
packages/nemo_platform_plugin/src/nemo_platform_plugin/nooa_model_client.py:47-51
and :159-167.

In `@plugins/nemo-experimentalist/benchmarks/run.py`:
- Around line 345-348: Update the summary aggregation logic around the job field
validation to validate raw payload or stats values before calling int(). Reject
booleans explicitly, along with floats and numeric strings, and preserve the
field name in the TypeError; only convert values after they pass the strict
integer check.

In
`@plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/run.py`:
- Around line 106-136: Preserve the selected default and fast model references
returned by resolve_model_clients in the run flow, and expose or pass them to
the benchmark caller alongside the result summary. Update the benchmark
persistence path, including benchmarks/run.py and its summary.json generation,
to record both resolved references in addition to the existing ModelSpec fields.

In `@plugins/nemo-insights/examples/research-agent/tests/test_analyst_e2e.py`:
- Around line 152-154: Update the credential check in the E2E fixture to require
TAVILY_API_KEY and accept either NVIDIA_API_KEY or NEMO_DEFAULT_INFERENCE_KEY as
the model-provider credential. Ensure the missing-key message reports the model
credential requirement without skipping when only the alternate credential is
present.

---

Outside diff comments:
In `@plugins/nemo-insights/examples/research-agent/README.md`:
- Around line 75-80: Update the setup instructions around the `nemo setup`
command so they no longer combine `--auto` with interactive prompt guidance.
Either remove `--auto` to preserve the documented Enter-to-reuse behavior, or
revise the surrounding text to describe automatic model selection.

---

Nitpick comments:
In `@packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/setup.py`:
- Around line 2251-2262: Update the model persistence flow around ModelPair and
the default_model fallback so an explicitly configured NEMO_FAST_MODEL is not
discarded when default_model is unavailable. Persist the fast override in the
no-default branch using the existing model configuration mechanism, or
explicitly warn that it is ignored; preserve the current behavior when a default
model resolves.

In `@packages/nemo_platform_ext/src/nemo_platform_ext/config/config.py`:
- Around line 75-78: Extract the duplicated three-step model precedence chain
from resolve() and _create_default_config() into a shared helper, then reuse
that helper at all affected call sites. Preserve the existing precedence and
ensure future model-resolution changes only require updating the helper.
🪄 Autofix

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: c5ee37ee-7c42-46bd-9f55-4a7d4633abbd

📥 Commits

Reviewing files that changed from the base of the PR and between 20e39e0 and c883a04.

⛔ Files ignored due to path filters (5)
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/manifest_registry.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/cli/commands/setup.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/config/config.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/config/models.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/vendored/nemo_platform_ext/cli/commands/test_setup.py is excluded by !sdk/**
📒 Files selected for processing (88)
  • .github/actions/insights-intake-stack/action.yml
  • .github/workflows/insights-testbed.yml
  • README.md
  • SETUP.md
  • docs/agents/insight-driven-optimization.mdx
  • docs/get-started/example-agent.mdx
  • docs/get-started/setup.mdx
  • docs/set-up/config-reference.mdx
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/manifest_registry.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/cli/commands/setup.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/config/config.py
  • packages/nemo_platform_ext/src/nemo_platform_ext/config/models.py
  • packages/nemo_platform_ext/tests/cli/commands/test_setup.py
  • packages/nemo_platform_plugin/src/nemo_platform_plugin/nooa_model_client.py
  • packages/nemo_platform_plugin/tests/test_nooa_model_client.py
  • plugins/nemo-eval-author/.env.example
  • plugins/nemo-eval-author/README.md
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/cli.py
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/eval_author/agent.py
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/eval_author/run.py
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/model_config.py
  • plugins/nemo-eval-author/tests/conftest.py
  • plugins/nemo-eval-author/tests/test_eval_author_repair_e2e.py
  • plugins/nemo-eval-author/tests/test_eval_author_run.py
  • plugins/nemo-eval-author/tests/test_model_config.py
  • plugins/nemo-eval-author/tests/test_plugin_boundary.py
  • plugins/nemo-experimentalist/AGENTS.md
  • plugins/nemo-experimentalist/README.md
  • plugins/nemo-experimentalist/benchmarks/README.md
  • plugins/nemo-experimentalist/benchmarks/configs/tau3-quality.yaml
  • plugins/nemo-experimentalist/benchmarks/configs/tau3-smoke.yaml
  • plugins/nemo-experimentalist/benchmarks/configs/terminal-bench-quality.yaml
  • plugins/nemo-experimentalist/benchmarks/configs/terminal-bench-smoke.yaml
  • plugins/nemo-experimentalist/benchmarks/run.py
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/.env.example
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/record_tau_airline_traces.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/cli.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/config.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/analyzer.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/cards.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/coder.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/goal_tree.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/loop.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/model_config.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/proposer.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/rationalizer.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/terminator.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/trace_analyzer.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/trace_scorer.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/run.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/preflight.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/settings.py
  • plugins/nemo-experimentalist/tests/conftest.py
  • plugins/nemo-experimentalist/tests/experimentalist/test_model_config.py
  • plugins/nemo-experimentalist/tests/experimentalist/test_terminator.py
  • plugins/nemo-experimentalist/tests/experimentalist/test_tools.py
  • plugins/nemo-experimentalist/tests/test_cli_profile.py
  • plugins/nemo-experimentalist/tests/test_experiment_cli.py
  • plugins/nemo-experimentalist/tests/test_experimentalist_benchmark.py
  • plugins/nemo-experimentalist/tests/test_experimentalist_run.py
  • plugins/nemo-experimentalist/tests/test_preflight.py
  • plugins/nemo-experimentalist/tests/test_resolve.py
  • plugins/nemo-insights/README.md
  • plugins/nemo-insights/examples/research-agent/README.md
  • plugins/nemo-insights/examples/research-agent/tests/test_analyst_e2e.py
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/agent.py
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/model_config.py
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/run.py
  • plugins/nemo-insights/src/nemo_insights_plugin/cli.py
  • plugins/nemo-insights/src/nemo_insights_plugin/config.py
  • plugins/nemo-insights/src/nemo_insights_plugin/controller.py
  • plugins/nemo-insights/src/nemo_insights_plugin/entities.py
  • plugins/nemo-insights/src/nemo_insights_plugin/jobs/analyze.py
  • plugins/nemo-insights/src/nemo_insights_plugin/preflight.py
  • plugins/nemo-insights/src/nemo_insights_plugin/schema.py
  • plugins/nemo-insights/src/nemo_insights_plugin/sdk_resources/analysis_configs.py
  • plugins/nemo-insights/src/nemo_insights_plugin/service.py
  • plugins/nemo-insights/testbed/README.md
  • plugins/nemo-insights/testbed/cli.py
  • plugins/nemo-insights/testbed/eval/stack.py
  • plugins/nemo-insights/tests/test_analysis_config_contract.py
  • plugins/nemo-insights/tests/test_analyst_agent.py
  • plugins/nemo-insights/tests/test_analyst_run.py
  • plugins/nemo-insights/tests/test_cli_profile.py
  • plugins/nemo-insights/tests/test_periodic_analysis.py
  • plugins/nemo-insights/tests/test_preflight.py
  • plugins/nemo-insights/tests/testbed/test_cli.py
  • script/generate_config_docs.py
💤 Files with no reviewable changes (16)
  • docs/set-up/config-reference.mdx
  • plugins/nemo-eval-author/src/nemo_eval_author_plugin/model_config.py
  • plugins/nemo-insights/src/nemo_insights_plugin/analyst/model_config.py
  • plugins/nemo-experimentalist/tests/test_experimentalist_benchmark.py
  • plugins/nemo-experimentalist/benchmarks/configs/terminal-bench-quality.yaml
  • plugins/nemo-experimentalist/benchmarks/configs/tau3-smoke.yaml
  • plugins/nemo-insights/src/nemo_insights_plugin/config.py
  • plugins/nemo-insights/testbed/cli.py
  • plugins/nemo-experimentalist/tests/experimentalist/test_model_config.py
  • plugins/nemo-insights/tests/test_analyst_agent.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/model_config.py
  • plugins/nemo-experimentalist/benchmarks/configs/tau3-quality.yaml
  • plugins/nemo-eval-author/tests/test_model_config.py
  • plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/settings.py
  • script/generate_config_docs.py
  • plugins/nemo-experimentalist/benchmarks/configs/terminal-bench-smoke.yaml

Comment thread .github/workflows/insights-testbed.yml Outdated
Comment thread docs/get-started/example-agent.mdx
Comment thread packages/nemo_platform_plugin/src/nemo_platform_plugin/nooa_model_client.py Outdated
Comment thread plugins/nemo-experimentalist/benchmarks/run.py Outdated
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
…newsom

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>

# Conflicts:
#	docs/get-started/example-agent.mdx
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 31601/40224 78.6% 63.2%
Integration Tests 18382/38176 48.1% 20.8%

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>

@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 `@docs/cli/reference.mdx`:
- Around line 50-51: Move the setup-text changes from the generated
docs/cli/reference.mdx output into its source document, then run the designated
documentation generation command to regenerate the reference page and commit the
updated generated output.
🪄 Autofix

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: 8770a6e6-6dbb-4903-8374-3d69eec5cc62

📥 Commits

Reviewing files that changed from the base of the PR and between 64add97 and d0f1aed.

📒 Files selected for processing (1)
  • docs/cli/reference.mdx

Comment thread docs/cli/reference.mdx
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
Comment thread SETUP.md

@gaiadilorenzo gaiadilorenzo 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.

Looks good to me but I'm missing a lot of nemo platform context

Comment thread script/generate_config_docs.py
Comment thread plugins/nemo-experimentalist/examples/tau3-nooa-agent/.env.example
Comment thread packages/nemo_platform_plugin/src/nemo_platform_plugin/nooa_model_client.py Outdated
schuellc-nvidia added a commit that referenced this pull request Aug 7, 2026
The Configuration section documented `NEMO_EXPERIMENTALIST_API_BASE`,
`_API_KEY`, and the smart/mid/fast tiers. #1159 deletes `settings.py`
outright, so every one of those variables goes away: the optimizer now
resolves a default/fast pair of Platform Model Entities selected by
`nemo setup`, and reads no endpoint, provider key, or provider model
name of its own.

Rewrites the section against that PR's code rather than its prose, so
the tier mapping is accurate -- the trajectory scorer moves from mid to
fast, and the architecture doc from mid to default. Updates the sandbox
`sbx exec --env` block to the two overrides that replace the six, and
the secret-handling caution that assumed keys were among them.

Also names the bounded sub-problem optimization loop in the round
walkthrough. It was missing, and `implement` runs it before the
integration check rather than inside it (coder.py:680-686).

Review feedback from @gaiadilorenzo on #1165.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Christian Schüller <cschueller@nvidia.com>
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
…newsom

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>

# Conflicts:
#	plugins/nemo-eval-author/src/nemo_eval_author_plugin/eval_author/agent.py
#	plugins/nemo-eval-author/src/nemo_eval_author_plugin/eval_author/run.py
#	plugins/nemo-eval-author/tests/test_eval_author_run.py
#	plugins/nemo-experimentalist/README.md
#	plugins/nemo-experimentalist/examples/tau3-nooa-agent/.env.example
#	plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/loop.py
#	plugins/nemo-experimentalist/src/nemo_experimentalist_plugin/experimentalist/components/terminator.py
#	plugins/nemo-experimentalist/tests/experimentalist/test_model_config.py
…newsom

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
…newsom

Signed-off-by: Brian Newsom <brnewsom@nvidia.com>

# Conflicts:
#	README.md
Comment thread .github/workflows/insights-testbed.yml
Signed-off-by: Brian Newsom <brnewsom@nvidia.com>
callingmedic911 added a commit that referenced this pull request Aug 7, 2026
Review feedback on #1116. #1159 moves the optimization agents onto the models
chosen in `nemo setup` and drops `INFERENCE_API_KEY` as an agent credential,
so naming that variable, the gateway, and Claude Opus 4.8 would go stale the
day it lands. State the requirement instead — the Analyst needs a model to run
on — and let `analyst doctor` be the authority on whether it is satisfied,
which is true before and after that change.

Also from review:

- Frame the skill as analyzing behavior and producing Insights rather than
  "finding what an agent keeps getting wrong".
- Describe `--agent-spec` by what it gives the Analyst: the intent behind the
  agent, which is not recoverable from code or traces. Per the AGENT-SPEC
  design doc, that is its whole job. (The proposed ETHOS.md rename has not
  landed, so the filename stays.)
- Drop `--base-url` from the run example; it defaults to `NMP_BASE_URL`. The
  wider `NMP_*` rename is ASE-815 — 414 files reference those variables, so it
  is not a skill-PR change.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
@BrianNewsom
BrianNewsom added this pull request to the merge queue Aug 7, 2026
callingmedic911 added a commit that referenced this pull request Aug 7, 2026
The previous commit wrote the credential story as #1159 will leave it, but
that PR has not landed: the analyst still reads INFERENCE_API_KEY directly
today, so "rather than any credential of its own" was false in the world this
ships into. Say only that the model configuration is in flux and that
pre-flight names what is missing — accurate before and after.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Merged via the queue into main with commit c0dbe85 Aug 7, 2026
61 checks passed
@BrianNewsom
BrianNewsom deleted the plugin-model-pairs/brnewsom branch August 7, 2026 18:02
callingmedic911 added a commit that referenced this pull request Aug 7, 2026
Review feedback on #1116. #1159 moves the optimization agents onto the models
chosen in `nemo setup` and drops `INFERENCE_API_KEY` as an agent credential,
so naming that variable, the gateway, and Claude Opus 4.8 would go stale the
day it lands. State the requirement instead — the Analyst needs a model to run
on — and let `analyst doctor` be the authority on whether it is satisfied,
which is true before and after that change.

Also from review:

- Frame the skill as analyzing behavior and producing Insights rather than
  "finding what an agent keeps getting wrong".
- Describe `--agent-spec` by what it gives the Analyst: the intent behind the
  agent, which is not recoverable from code or traces. Per the AGENT-SPEC
  design doc, that is its whole job. (The proposed ETHOS.md rename has not
  landed, so the filename stays.)
- Drop `--base-url` from the run example; it defaults to `NMP_BASE_URL`. The
  wider `NMP_*` rename is ASE-815 — 414 files reference those variables, so it
  is not a skill-PR change.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
callingmedic911 added a commit that referenced this pull request Aug 7, 2026
The previous commit wrote the credential story as #1159 will leave it, but
that PR has not landed: the analyst still reads INFERENCE_API_KEY directly
today, so "rather than any credential of its own" was false in the world this
ships into. Say only that the model configuration is in flux and that
pre-flight names what is missing — accurate before and after.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
schuellc-nvidia added a commit that referenced this pull request Aug 8, 2026
The README had grown into an operator runbook that duplicated the
Experimentalist skill and the docs site while never explaining what the
Experimentalist does. Refocus it on the plugin's function and link out for the
rest.

- Explain the optimization loop, the levers it can change, and the
  train-diagnoses / validation-selects split, matching the round order the
  implementation actually runs.
- Add a parameter table built from the CLI options, plus smoke-first guidance,
  run cost and duration, and resume-on-rerun.
- Document what ships in the box: the nooa and langchain-framework skills, the
  two example agents, and the canonical benchmark suites.
- Lead with the example-agent walkthrough so readers start from a worked run.
- Correct claims that did not hold against the source: the command is `nemo
  agents experimentalist doctor`; the evaluation container receives whatever
  each Harbor task's `task.toml` declares rather than a fixed forwarded set,
  with `AUT_MODEL_NAME` a convention of the example agents; NeMo Experiments
  receives a structure-only mirror; and the model table read as exhaustive
  when the fast model also drives sub-steps across most components.

Keep the "Recommended laptop isolation" heading, which the Experimentalist
skill links to by anchor, and carry forward the objective_function and
regression_metrics reference from #1159 under a task-oriented heading.

Signed-off-by: Christian Schüller <cschueller@nvidia.com>
ryana pushed a commit to ryana/nemo-platform that referenced this pull request Aug 12, 2026
* feat(skills): add nemo-analyst workflow

Add the platform-bundled nemo-analyst skill so coding agents have a
reliable route to `nemo agents analyst run` and the minimum correct
operating knowledge to use it.

The body stays lean and defers depth to
docs/agents/insight-driven-optimization.mdx rather than restating it.
It covers the Insight shape, the credential distinction from the
Experimentalist (the Analyst reads only INFERENCE_API_KEY), the doctor
pre-flight, the run, where Insights are stored, and a verification step.

Persistence is documented as it behaves after NVIDIA-NeMo#1054: Insights always go
to the platform, and --insights-file-output mirrors what was stored.

Routing tests follow the explicit/implicit/negative-control convention
already used by nemo-explore. Verified that all six analyst-intent
prompts resolve to nemo-analyst, that the skill introduces no new
failures elsewhere in the catalog, and that it wins no ties by sort
order.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Aditya Pandey <aditya@autospace.co>
Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* feat(skills): tighten nemo-analyst from journey findings

Drove the skill end to end in a container against a real LangGraph agent's
telemetry. It carried the workflow, so this sharpens what it left the driver
to work out rather than adding to it — net zero lines, paid for by cutting
redundancy from the storage and verify sections.

- `analyst doctor` takes no `--agent` flag, so it always reports a red
  profile line. Say that passing `--agent` makes that line noise instead of
  leaving the reader to reason past a red mark, or to write an
  `optimizer.yaml` it does not need.
- `agent_name` is carried on agent-level spans, not on their model and tool
  children, so the old "matches the `agent_name` on the spans" pointed at a
  query that undercounts.
- Every span came back `status=success` while the agent was badly broken, so
  state that the Analyst judges behavior rather than status or scores.
- Telemetry that captures only the shape of a run is a third cause of an
  empty result, alongside scoping and volume.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* feat(skills): decouple nemo-analyst from a specific model and credential

Review feedback on NVIDIA-NeMo#1116. NVIDIA-NeMo#1159 moves the optimization agents onto the models
chosen in `nemo setup` and drops `INFERENCE_API_KEY` as an agent credential,
so naming that variable, the gateway, and Claude Opus 4.8 would go stale the
day it lands. State the requirement instead — the Analyst needs a model to run
on — and let `analyst doctor` be the authority on whether it is satisfied,
which is true before and after that change.

Also from review:

- Frame the skill as analyzing behavior and producing Insights rather than
  "finding what an agent keeps getting wrong".
- Describe `--agent-spec` by what it gives the Analyst: the intent behind the
  agent, which is not recoverable from code or traces. Per the AGENT-SPEC
  design doc, that is its whole job. (The proposed ETHOS.md rename has not
  landed, so the filename stays.)
- Drop `--base-url` from the run example; it defaults to `NMP_BASE_URL`. The
  wider `NMP_*` rename is ASE-815 — 414 files reference those variables, so it
  is not a skill-PR change.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* fix(skills): don't claim nemo-analyst has no credential of its own

The previous commit wrote the credential story as NVIDIA-NeMo#1159 will leave it, but
that PR has not landed: the analyst still reads INFERENCE_API_KEY directly
today, so "rather than any credential of its own" was false in the world this
ships into. Say only that the model configuration is in flux and that
pre-flight names what is missing — accurate before and after.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* fix(skills): vendor nemo-analyst into the SDK

`lint-sdk-vendored` and `lint-cli` both fail on this branch because every
skill is mirrored into `sdk/python/nemo-platform` and this one never was —
it was the only skill missing from the vendored tree. Generated with
`make vendor`; as with every other skill, `tests.json` is not vendored.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* refactor(skills): ship nemo-analyst with the Insights plugin

Follow the pattern NVIDIA-NeMo#1088 settled on. That PR started with the Experimentalist
skill in the platform package and deliberately moved it into the plugin; this
one was written against the earlier shape.

The skill documents `nemo agents analyst`, which only exists when
nemo-insights is installed, so the platform package should not ship it. Moving
it also removes it from the vendored SDK tree — plugin-owned skills are
discovered through the `nemo.skills` entry point instead, which is what made
lint-sdk-vendored care about it in the first place.

Mirrors the Experimentalist layout: skills.py exposing skills_dir, a skills
README, and an entry-point test. `nemo skills list` now reports the skill with
source nemo-insights-plugin.

Also adds the nemo-analyst row to nemo-skill-selection, as NVIDIA-NeMo#1088 did for the
Experimentalist. The catalog already told agents to use the Experimentalist
"after `agents analyst` has created an Insight" while having no row that
routed there.

The description said "Produces the Insight that nemo-experimentalist
consumes". Now that both skills are in the catalog together, that literal
token made this skill win the Experimentalist's own explicit routing test —
scoring treats a hyphenated name as one token. Reworded to "the
Experimentalist", which keeps the loop context without the collision.
Catalog-wide: 47 failures both before and after, 12 more passes, and
nemo-analyst involved in no failure.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* docs(skills): note Analyst telemetry analysis as plugin-owned

Completes the NVIDIA-NeMo#1088 parallel: that PR appended the Experimentalist to the
plugin-owned skills sentence in both files once its skill moved into the
plugin. The Analyst now lives there too.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* fix(skills): verify the analyst run, not the stored Insight set

CodeRabbit review on NVIDIA-NeMo#1116. The Verify section contradicted the skill's own
premise: it said a successful run leaves at least one Insight, while "What it
produces" says filing nothing is a valid outcome. It also verified the wrong
thing — listing by `?agent=` returns every Insight for the agent, including
earlier runs', so it attests the store rather than this run.

Verify against what the run reports instead. `analyst_backend` emits a line
per operation (`- created: <title> [<id>]`, `- updated: <id>`, or `- no
insights created or updated`), so read those ids back individually via
`GET .../insights/<insight-id>`, and treat "no insights created or updated" as
the success it is.

Two smaller fixes from the same review:

- Keep the bearer token out of `curl`'s argv, where any process on the host
  can read it, by passing it through curl's config on stdin. Verified the
  header still arrives.
- The trigger `my agent keeps getting wrong` was missing its object; now
  `my agent keeps getting things wrong`. Routing is unchanged against a clean
  main baseline — 47 failures both sides, and nemo-analyst still fails none
  and steals none.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

* refactor(skills): drop the Insights skills README and entry-point test

Review feedback on NVIDIA-NeMo#1116. Neither file was pulling its weight.

skills/README.md is never read — the registry only looks at subdirectories
containing a SKILL.md — and with a single skill in the directory it restated
that skill's own frontmatter. The Experimentalist's equivalent earns its place
by disambiguating a user-facing skill from an internal one; this one had
nothing to disambiguate.

test_skills_entry_point.py guarded the `nemo.skills` declaration in
pyproject.toml. Without that entry the skill simply never appears in
`nemo skills list`, so the failure announces itself the first time anyone uses
the feature and does not need a regression test of its own.

Verified by hand instead: the entry point resolves and `nemo skills list`
reports nemo-analyst with source nemo-insights-plugin.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>

---------

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
ryana pushed a commit to ryana/nemo-platform that referenced this pull request Aug 12, 2026
…IA-NeMo#1165)

The README had grown into an operator runbook that duplicated the
Experimentalist skill and the docs site while never explaining what the
Experimentalist does. Refocus it on the plugin's function and link out for the
rest.

- Explain the optimization loop, the levers it can change, and the
  train-diagnoses / validation-selects split, matching the round order the
  implementation actually runs.
- Add a parameter table built from the CLI options, plus smoke-first guidance,
  run cost and duration, and resume-on-rerun.
- Document what ships in the box: the nooa and langchain-framework skills, the
  two example agents, and the canonical benchmark suites.
- Lead with the example-agent walkthrough so readers start from a worked run.
- Correct claims that did not hold against the source: the command is `nemo
  agents experimentalist doctor`; the evaluation container receives whatever
  each Harbor task's `task.toml` declares rather than a fixed forwarded set,
  with `AUT_MODEL_NAME` a convention of the example agents; NeMo Experiments
  receives a structure-only mirror; and the model table read as exhaustive
  when the fast model also drives sub-steps across most components.

Keep the "Recommended laptop isolation" heading, which the Experimentalist
skill links to by anchor, and carry forward the objective_function and
regression_metrics reference from NVIDIA-NeMo#1159 under a task-oriented heading.

Signed-off-by: Christian Schüller <cschueller@nvidia.com>
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.

4 participants