docs: rewrite Configure Agents index and document external agent harnesses - #2311
docs: rewrite Configure Agents index and document external agent harnesses#2311ananthsub wants to merge 9 commits into
Conversation
|
🌿 Preview your docs: https://nvidia-preview-ananthsub-docs-agent-server-index.docs.buildwithfern.com/nemo/gym Here are the markdown pages you've updated: |
| | Agent | Use it when | | ||
| |---|---| | ||
| | [`simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/simple_agent) | You want general-purpose multi-step tool calling with a configurable step budget. Works with any Resources server, and is the usual starting point. | | ||
| | [`non_executing_simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/non_executing_simple_agent) | The tool call itself is the answer. Forwards one request to the model and passes the response to the verifier without executing anything. | |
There was a problem hiding this comment.
| non_executing_simple_agent | The tool call itself is the answer. Forwards one request to the model and passes the response to the verifier without executing anything.
That is a weird name and functionality, we should probably review in a future github issue if you want to create it
| |---|---| | ||
| | [`simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/simple_agent) | You want general-purpose multi-step tool calling with a configurable step budget. Works with any Resources server, and is the usual starting point. | | ||
| | [`non_executing_simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/non_executing_simple_agent) | The tool call itself is the answer. Forwards one request to the model and passes the response to the verifier without executing anything. | | ||
| | [`tool_simulation_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/tool_simulation_agent) | Tool results should be simulated rather than really executed. | |
There was a problem hiding this comment.
Also very weird distinction. We should revisit and understand why this is implemented. Please fire a future github issue
3f6cc68 to
9a41828
Compare
| | [`openclaw_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/openclaw_agent) | OpenClaw (`openclaw agent --local --json`) | | | ||
| | [`pi_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/pi_agent) | pi (`pi --print --mode json --no-session`) | | |
|
|
||
| Agent servers that run a coding CLI as a subprocess. The CLI executes its own tools, and its output is parsed back into NeMo Gym format. | ||
|
|
||
| | Agent Server | Harness | Notes | |
There was a problem hiding this comment.
Nit: can we rename Notes to Description or Summary?
|
|
||
| Because verification stays on the NeMo Gym side, an agent harness that brings its own tools can often run in an existing environment by adding a `<benchmark>_<agent>` config, leaving the dataset and verifier unchanged — only the Resources server's task data and `/verify` are used. This is how `hermes_agent` is used with the math, coding, reasoning_gym, MCQA, and instruction-following benchmarks. It does not hold for every harness: agent servers such as `swe_agents`, `osworld_agent`, and `tau2` are tied to specific benchmarks. | ||
|
|
||
| ### Coding CLIs |
There was a problem hiding this comment.
Coding CLIs is a bit misleading. A few other options to consider, but we should ensure we are consistent -- and using CLI could also be confusing. Suggestions:
- External Agent Harness — emphasizes they're third-party, but "External" is already covered by the parent section heading.
- External Harnesses — most accurate: all six run their own agentic loop as a subprocess. Captures both the CLI and agentic nature without implying "coding."
…esses Closes NVIDIA-NeMo#1132. The Configure Agents index page described the Agent server's role in a rollout but did not say that the Agent server is where an environment's agent harness lives, or that NeMo Gym ships agents that wrap external harnesses. Integrate Existing Agents was a stub naming two agents. index.mdx: lead with the Agent server as the home of the agent harness, add a section on why the harness is a separate server, and replace the prose pointer with cards to the three sub-pages and the agent server configuration reference. Keeps the rollout lifecycle pseudocode. integrate-existing-agents.mdx: list the built-in agents, then the agents that run external harnesses, grouped as coding CLIs, agent frameworks, benchmark-native harnesses, and the agent-agnostic task runners. Adds the four responsibilities every wrapper has, and the requirements a wrapper must meet for its rollouts to be trainable (route through the model server, carry token IDs, leave sampling parameters alone, keep the trajectory monotonic). ecosystem.mdx: point the Agent Harnesses list at the new catalog. The evaluation-only note for the CLI agents follows the code rather than the READMEs. opencode_agent, pi_agent, and openclaw_agent READMEs say they do not use a Gym model server, but all three now take an optional model_server ref; kilocode_agent does not. Those READMEs are stale and are not touched here. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
Terminology: say "Agent server" consistently for the NeMo Gym component, in prose, headings, and table headers. Correct how a wrapper is structured. The harness runs from the Agent server's responses(); run() is the episode orchestrator that seeds the session, calls responses(), and verifies. Every agent server follows this split (simple_agent, opencode_agent, claude_code_agent, codex_agent, pi_agent). Drop the built-in vs external framing. The agent servers that wrap a third-party harness are also in this repo, so that split was not a real distinction. Group by who implements the agent instead: a Gym-native implementation, or a third-party harness. Rename "Agent Frameworks" to "External Frameworks", since that table holds both agent frameworks (LangGraph, Stirrup) and environment frameworks (Aviary, Verifiers). Use "in" rather than "against" for the harness-to-environment relation. "Against" frames the agent as the sole driver, which does not hold if the environment orchestrates agents for multi-agent workloads. Add the material from the closed PR NVIDIA-NeMo#2390 that this page lacked: a selection guide, the resources_server/model_server and sandbox config shapes, the per-request policy endpoint override, the skills caveat, and the commands to start servers and collect rollouts. Rebased onto current main, which changes three facts documented earlier: - mini_swe_agent and mini_swe_agent_2 accept policy_base_url and policy_api_key on /run (NVIDIA-NeMo#2166). Other agent servers allow extra keys, so they accept the fields and ignore them; the page says so. - kilocode_agent now routes through a Gym model server (NVIDIA-NeMo#2319), so all six CLI agent servers take a model_server ref. - harbor_agent can execute trials in any NeMo Gym sandbox provider (NVIDIA-NeMo#2296), not only Singularity. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
The built-in agent server table asked "Use it when", which produced descriptions of intent instead of behavior. It now says "What it does", with each row taken from the code. This also corrects two rows. non_executing_simple_agent and tool_simulation_agent were described as doing different things, but both responses() implementations make one model call and return the response without executing tool calls or looping. The only difference is that non_executing_simple_agent normalizes a string input into a message list and propagates session cookies. The rows and the selection guide now say that, and note that the two overlap. Remove claims that were not grounded in the repo: that producing scores is easier than producing trainable rollouts, that container-based wrappers do considerably more setup than CLI ones, and that gym env validate is worth running before a long run. Use precise verbs where the mechanism has user-visible consequences. "Shell out to a coding CLI" is now "run a coding CLI as a subprocess", which is what tells a reader the CLI shares the agent server's filesystem and network access — the reason opencode_agent's README warns that repo_dir is not a filesystem boundary. This should be updated when the coding CLIs move into sandboxes. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
The Agent Harnesses section named three harnesses as examples. It now lists all twenty, grouped as coding CLIs, agent frameworks, software engineering and benchmark harnesses, and agent-agnostic runners, matching how Integrate Existing Agents groups them. Every linked directory was checked to exist under responses_api_agents/. Aviary, Harbor, and Verifiers now appear in both this section and Environment Libraries above. They belong in both: each ships an agent harness and a set of environments. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
The harness list now carries names and links only, matching the Environment Libraries section on the same page and the list in README.md. The group labels carry the categorization. Descriptions here restated what Integrate Existing Agents says about each harness, in a second place that can contradict it. Duplicated names can only go stale; duplicated descriptions can disagree. Behavior, training status, and configuration stay on the catalog page, which this section links to. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
The wrapping section claimed the harness always runs in responses(), with run() orchestrating seed, responses, and verify. That is the common shape but not universal. mini_swe_agent, mini_swe_agent_2, harbor_agent, and tau2 raise NotImplementedError from responses() and do everything in run(). They also compute the reward from their harness's own evaluation output rather than calling the Resources server's /verify: tau2 reads result.reward_info.reward, mini_swe_agent_2 derives it from the eval report, harbor_agent from the verifier result. None of the four reference seed_session or /verify. The four numbered responsibilities no longer name a method. A following paragraph says which method holds them, and names the four exceptions. Two other statements asserting the same split are corrected: the intro to the third-party harness section, and the sentence after the rollout lifecycle pseudocode on the index page, which now says the three phases are the same rather than that NeMo Gym performs each one. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
Audited every factual claim on the three pages against responses_api_agents/ rather than a sample. Corrections: - The Gym-native section said all four call the Resources server's /verify. gymnasium_agent never does; it sums the per-step rewards returned by /reset and /step. The sentence now names which do which. - It also said they route tool calls to the Resources server. non_executing_simple_agent and tool_simulation_agent execute no tool calls, so that is now stated per agent server instead of for the group. - mini_swe_agent_2 was described as failing at startup without sandbox_provider. The check is inside run(), not model_post_init, so the server starts and each request fails. - External Frameworks said the frameworks are embedded in the Agent server process. They are imported in-process, but harbor_agent then runs trials in Singularity, Docker, Daytona, or a NeMo Gym sandbox per harbor_environment_type, and stirrup_agent executes code through Stirrup's tool backends. - The intro called every listed agent server general-purpose, which contradicted both the Benchmark-Native Harnesses section and the later sentence naming swe_agents, osworld_agent, and tau2 as benchmark-tied. - pi_agent's command is `pi --print --mode json --no-session`. - The skills caveat now cites remote_agent, which logs a warning that it cannot stage skills. - ecosystem.mdx used "Agent frameworks" for the group the catalog calls External Frameworks, the rename made because Aviary and Verifiers are environment frameworks rather than agent frameworks. Claims re-verified as correct: the CLI invocations and subprocess use for all six coding CLIs; model_server precedence over a provider URL in all six; the evaluation-only status of all six; swe_agents defaulting to openhands; anyswe_agent's three dataset families; anyterminal_agent running tests/test.sh in the same container; the hermes fork pin; verifiers' NeMoRLChatCompletionsClient; harbor's return_token_id_information; pinchbench's 147 tasks; osworld's docker sandbox provider; langgraph's four example graphs; and gym env validate running without Ray or servers. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
"Why the Harness Is Its Own Server" made a case for the current design and listed its benefits. That is a position on an open architecture question, not documentation, and it reads as ruling out having the environment orchestrate the episode. Replaced with one sentence stating how the composition works: an Agent server references a Resources server and a Model server by name, so which harness an environment runs is a config change. The page now says nothing about how many agents drive an episode, in either direction. Also singularizes two descriptions that could be read as more than one agent per episode. anyswe_agent runs one Gym agent server per rollout, and harbor_agent runs one Harbor agent per trial. Verified with `make docs-check` (fern check, 0 errors). Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
Use the agent registry as the complete source of available harnesses, document reusable agents added since the PR was opened, and address the remaining catalog review feedback. Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com>
4f4d807 to
0703193
Compare
There was a problem hiding this comment.
In the “Rollout Lifecycle” paragraph, could we make it explicit that, in the typical implementation shown below, the agent loop runs in responses()? For example:
In the typical implementation shown below, the agent loop runs in the
responses()method. It sends the conversation to the model, receives a response, routes any tool calls to the Resources server, and feeds the results back to the model.
The “typical implementation” qualification avoids implying this is universal, since some agent servers implement the loop directly in run().
There was a problem hiding this comment.
The next sentence could also be more precise. “Turns” is ambiguous in this pseudocode because the loop is specifically iterating over model responses and tool calls, and reaching the model’s maximum sequence length may result in truncation or an error rather than a clean loop stop. Suggested wording:
The loop continues while the model returns tool calls, stopping when it returns no tool calls or the harness reaches its configured step limit. Other harnesses may define additional stopping conditions.
| --- | ||
|
|
||
| You can use an existing agent in NeMo Gym, integrate an external one, or build your own from scratch. | ||
| NeMo Gym ships agent servers implemented in Gym and adapters for third-party harnesses. If neither fits, you can keep your agent in your own repo and [drive it remotely](/agent-server/remote-agent). |
There was a problem hiding this comment.
Could we make the rollout-collection behavior explicit here? “Drive it remotely” could sound as though rollout collection itself runs remotely. Suggested wording:
| NeMo Gym ships agent servers implemented in Gym and adapters for third-party harnesses. If neither fits, you can keep your agent in your own repo and [drive it remotely](/agent-server/remote-agent). | |
| NeMo Gym ships agent servers implemented in Gym and adapters for third-party harnesses. If neither fits, keep your agent in your own repository, expose it through a Responses-compatible endpoint, and collect episodes from it using NeMo Gym’s rollout collection. |
| |---|---| | ||
| | [`simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/simple_agent) | Calls the model, executes any tool calls against the Resources server, appends the results, and repeats until the model returns no tool calls or the step limit is reached. Works with any Resources server. | | ||
| | [`simple_agent_with_compaction`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/simple_agent_with_compaction) | Runs the `simple_agent` model and tool loop with an opt-in context-compaction policy applied before model calls. | | ||
| | [`non_executing_simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/non_executing_simple_agent) | Makes one model call and passes the response to the verifier. Does not execute tool calls. Normalizes a string `input` into a message list and propagates session cookies. | |
There was a problem hiding this comment.
Could we create a follow-up issue to reconsider this agent’s name? non_executing_simple_agent is ambiguous because the agent does execute a model call and verification; it only skips the tool-execution loop. A name such as single_model_call_agent would describe its defining behavior more directly. The issue could also cover backward-compatible config migration and whether this agent should remain separate from tool_simulation_agent, given their overlapping behavior.
| | [`simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/simple_agent) | Calls the model, executes any tool calls against the Resources server, appends the results, and repeats until the model returns no tool calls or the step limit is reached. Works with any Resources server. | | ||
| | [`simple_agent_with_compaction`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/simple_agent_with_compaction) | Runs the `simple_agent` model and tool loop with an opt-in context-compaction policy applied before model calls. | | ||
| | [`non_executing_simple_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/non_executing_simple_agent) | Makes one model call and passes the response to the verifier. Does not execute tool calls. Normalizes a string `input` into a message list and propagates session cookies. | | ||
| | [`tool_simulation_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/tool_simulation_agent) | Makes one model call and passes the response to the verifier. Does not execute tool calls. Used with datasets that supply simulated tool results. | |
There was a problem hiding this comment.
The current description makes it sound as though this agent simulates tool results, but the implementation does not perform any simulation. Its core behavior overlaps with non_executing_simple_agent, although their lifecycle handling differs: non_executing_simple_agent calls /seed_session, preserves session cookies through verification, normalizes string input, and proxies aggregate metrics; tool_simulation_agent takes the smaller stateless path and also supports skipped verification.
Could we reword this row to describe that behavior directly?
| | [`tool_simulation_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/tool_simulation_agent) | Makes one model call and passes the response to the verifier. Does not execute tool calls. Used with datasets that supply simulated tool results. | | |
| | [`tool_simulation_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/tool_simulation_agent) | Makes one model call and sends the response directly to the verifier without executing tool calls or initializing a Resources server session. Intended for stateless, single-step datasets where the model’s proposed next action is compared with an expected action. | |
Could we also create a follow-up issue to reconsider both agents’ names and whether these overlapping implementations should be consolidated? That issue could cover the stateful/stateless lifecycle distinction and a backward-compatible config migration.
|
|
||
| ## Agent Servers That Run a Third-Party Harness | ||
|
|
||
| In these, the external harness owns the agent loop and keeps its own prompts and tools. NeMo Gym usually seeds the session, translates the resulting trajectory into Responses API format, and verifies it against the Resources server; a few whose benchmark harness owns scoring compute the reward themselves. |
There was a problem hiding this comment.
Could we make this exception more concrete? Suggested wording:
| In these, the external harness owns the agent loop and keeps its own prompts and tools. NeMo Gym usually seeds the session, translates the resulting trajectory into Responses API format, and verifies it against the Resources server; a few whose benchmark harness owns scoring compute the reward themselves. | |
| In these integrations, the external harness owns the agent loop and keeps its own prompts and tools. NeMo Gym usually seeds the session, translates the resulting trajectory into Responses API format, and sends it to the Resources server for verification. Some benchmark-specific Agent servers instead bypass the Resources server’s `/verify` endpoint: they run the benchmark’s native evaluator and return the reward from its result. |
Examples include mini_swe_agent, which maps the SWE-bench evaluation report’s resolved field to a binary reward; tau2, which reads result.reward_info.reward; and harbor_agent, which extracts the Harbor verifier result.
Could we also create a follow-up architecture issue to consider decoupling these native evaluators from the Agent server—for example, by exposing them behind a Resources server or shared verifier interface? That would keep rollout orchestration and scoring separable even when integrating benchmark-native harnesses.
|
|
||
| In these, the external harness owns the agent loop and keeps its own prompts and tools. NeMo Gym usually seeds the session, translates the resulting trajectory into Responses API format, and verifies it against the Resources server; a few whose benchmark harness owns scoring compute the reward themselves. | ||
|
|
||
| Because verification stays on the NeMo Gym side, an agent harness that brings its own tools can often run in an existing environment by adding a `<benchmark>_<agent>` config, leaving the dataset and verifier unchanged — only the Resources server's task data and `/verify` are used. This is how `hermes_agent` is used with the math, coding, reasoning_gym, MCQA, and instruction-following benchmarks. It does not hold for every harness: agent servers such as `swe_agents`, `osworld_agent`, and `tau2` are tied to specific benchmarks. |
There was a problem hiding this comment.
Could we reword this paragraph to make the integration boundary and the benchmark-coupled exceptions clearer?
| Because verification stays on the NeMo Gym side, an agent harness that brings its own tools can often run in an existing environment by adding a `<benchmark>_<agent>` config, leaving the dataset and verifier unchanged — only the Resources server's task data and `/verify` are used. This is how `hermes_agent` is used with the math, coding, reasoning_gym, MCQA, and instruction-following benchmarks. It does not hold for every harness: agent servers such as `swe_agents`, `osworld_agent`, and `tau2` are tied to specific benchmarks. | |
| Harnesses that execute their own tools do not need to use the Resources server’s tool endpoints. They can often be paired with an existing environment through configuration: NeMo Gym seeds the task session, the harness runs its interaction loop, and the existing Resources server verifies the resulting trajectory. `hermes_agent`, for example, is paired this way with math, coding, Reasoning Gym, MCQA, and instruction-following environments. Benchmark-coupled harnesses such as `swe_agents`, `osworld_agent`, and `tau2` instead depend on benchmark-specific task schemas, runtimes, or evaluators. |
This also avoids implying that /verify is the only Resources-server endpoint involved—hermes_agent calls /seed_session as well.
|
|
||
| Because verification stays on the NeMo Gym side, an agent harness that brings its own tools can often run in an existing environment by adding a `<benchmark>_<agent>` config, leaving the dataset and verifier unchanged — only the Resources server's task data and `/verify` are used. This is how `hermes_agent` is used with the math, coding, reasoning_gym, MCQA, and instruction-following benchmarks. It does not hold for every harness: agent servers such as `swe_agents`, `osworld_agent`, and `tau2` are tied to specific benchmarks. | ||
|
|
||
| ### Command-Line Harnesses |
There was a problem hiding this comment.
Would it make sense to merge “Command-Line Harnesses” and “External Frameworks” into one “Reusable Third-Party Harnesses” section? They appear to follow the same architectural pattern—the harness owns its interaction loop and tools, while the Agent server translates the trajectory and usually coordinates Resources-server verification. The main difference is only how the harness is invoked.
One possible introduction:
Reusable Third-Party Harnesses
These Agent servers adapt third-party harnesses that own their interaction loops and tools. They differ mainly in how the harness is invoked:
- Command-line integrations launch the harness as a subprocess and reconstruct its trajectory from CLI output, event streams, session databases, or files.
- Library integrations import the harness as a Python dependency and invoke it in-process, although the framework may use separate execution backends for its tools.
In both cases, the Agent server translates the resulting trajectory into Responses API items and usually sends it to the Resources server for verification. Harness-owned tools do not normally call Resources-server tool endpoints or mutate its task state.
The two tables could then become one table with an Integration column (Subprocess or Python library). This would preserve the useful implementation distinction without presenting them as separate architectural models.
There was a problem hiding this comment.
For example, the combined table could use this shape:
| Agent Server | Harness | Integration | Summary |
|---|---|---|---|
claude_code_agent |
Claude Code | Subprocess | Launches the Claude Code CLI and translates its output into a NeMo Gym trajectory. |
hermes_agent |
Hermes Agent | Python library | Invokes Hermes in-process and translates its trajectory for Resources-server verification. |
simple_strands_agent |
Simple Strands Agent | Subprocess | Runs the Python harness in a child process and reads back its result. |
The Integration column makes the small operational difference explicit while keeping all reusable third-party harnesses under the same conceptual model.
There was a problem hiding this comment.
A broader concern is that the current hierarchy mixes several different classification axes: who implemented the harness (“Gym-native” versus “third-party”), how it is invoked (“command-line” versus “framework”), where it runs (“Resources server sandbox”), and how tightly it is coupled to a benchmark. That makes it difficult to understand the user-facing intent of each section.
Would it be clearer to organize primarily around composability—essentially, “Can I reuse this Agent server with my environment?” For example:
- Gym-native reusable agents
- Reusable third-party harnesses — with invocation (
subprocess,Python library, orsandbox), tool location, and training support represented as properties rather than subsections - Remotely hosted agents —
remote_agent - Benchmark-coupled integrations — task schema, runtime, or evaluator is benchmark-specific
- Agent-agnostic task runners — run another Agent server rather than implementing the harness
The shared material could then follow the catalog under “How third-party harnesses are adapted,” “Tools and Resources-server state,” “Evaluation versus online-RL support,” and “Configure and run.” This would keep one primary organizing principle while still documenting the smaller implementation differences.
There was a problem hiding this comment.
For the entries currently under “External Frameworks,” another possible taxonomy would be based on what is actually being integrated:
- Reusable agent harnesses:
langgraph_agent,hermes_agent,simple_strands_agent, andterminus_2_agent. These primarily provide an agent loop and tools that can potentially be paired with different environments. - Harness abstraction:
nemo_fabric_agent. This is effectively an adapter-of-adapters that provides a common lifecycle over several installed harnesses. - External environment ecosystems:
aviary_agent,verifiers_agent,harbor_agent, andstirrup_agent. These bring broader environment, task-lifecycle, execution, or evaluation concepts in addition to an agent.
Would columns such as Agent Server, Upstream Project, Integration Role, and Compatibility / Constraints make these differences clearer? Invocation (Python import, subprocess, container, or sandbox) could then be documented as a separate property rather than being treated as the integration’s primary identity.
|
|
||
| | Agent Server | Harness | Summary | | ||
| |---|---|---| | ||
| | [`claude_code_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/claude_code_agent) | Claude Code (`claude -p`) | Runs against Anthropic, or against any NeMo Gym Model server, since every one serves [Anthropic Messages](/model-server/anthropic-messages) on `POST /v1/messages`. Reference implementation for [Agent Skills](/agent-server/agent-skills). | |
There was a problem hiding this comment.
Could we replace “every one” with an explicit subject? It is unclear whether this refers to every model, provider, or Model server implementation. Suggested wording:
| | [`claude_code_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/claude_code_agent) | Claude Code (`claude -p`) | Runs against Anthropic, or against any NeMo Gym Model server, since every one serves [Anthropic Messages](/model-server/anthropic-messages) on `POST /v1/messages`. Reference implementation for [Agent Skills](/agent-server/agent-skills). | | |
| | [`claude_code_agent`](https://github.com/NVIDIA-NeMo/Gym/tree/main/responses_api_agents/claude_code_agent) | Claude Code (`claude -p`) | Runs against Anthropic directly or through any NeMo Gym Model server, because NeMo Gym Model servers expose an Anthropic Messages-compatible [`POST /v1/messages`](/model-server/anthropic-messages) endpoint regardless of the underlying inference backend. Reference implementation for [Agent Skills](/agent-server/agent-skills). | |
|
|
||
| ### Benchmark-Native Harnesses | ||
|
|
||
| Benchmarks that come with their own agent scaffold, wired in at the agent-server level. |
There was a problem hiding this comment.
Could we avoid implying that these benchmarks intrinsically require an inseparable agent scaffold? Repository provisioning, workspace state, patch extraction, and benchmark evaluation can conceptually live in a Resources server, while the Agent server owns prompts, model calls, tool selection, and stopping. The current coupling appears to be an implementation choice inherited from runners that bundle those phases.
Would wording like this be more precise?
Currently Benchmark-Coupled Agent Servers
These Agent server implementations currently bundle a benchmark-specific interaction protocol, runtime, or evaluation lifecycle. This reflects their present integration structure rather than a fundamental requirement that the agent harness and environment remain coupled.
This leaves room to move environment state and evaluation behind a Resources-server or shared sandbox interface later.
Closes #1132.
The Configure Agents index page described the Agent server's role in a rollout but did not say that the Agent server is where an environment's agent harness lives, or that NeMo Gym ships agent servers that wrap external harnesses. Integrate Existing Agents was a stub naming two agents.
index.mdx: lead with the Agent server as the home of the agent harness, add a section on why the harness is a separate server, and replace the prose pointer with cards to the three sub-pages and the agent server configuration reference. This keeps the rollout lifecycle pseudocode.
integrate-existing-agents.mdx: list the built-in agent servers, then the agent servers that run external harnesses, grouped as coding CLIs, agent frameworks, benchmark-native harnesses, and the agent-agnostic task runners. Adds the four responsibilities every wrapper has, and the requirements a wrapper must meet for its rollouts to be trainable (route through the model server, carry token IDs, leave sampling parameters alone, keep the trajectory monotonic).
ecosystem.mdx: point the Agent Harnesses are listed in the catalog