Skip to content

docs: rewrite Configure Agents index and document external agent harnesses - #2311

Open
ananthsub wants to merge 9 commits into
NVIDIA-NeMo:mainfrom
ananthsub:ananthsub/docs-agent-server-index
Open

docs: rewrite Configure Agents index and document external agent harnesses#2311
ananthsub wants to merge 9 commits into
NVIDIA-NeMo:mainfrom
ananthsub:ananthsub/docs-agent-server-index

Conversation

@ananthsub

@ananthsub ananthsub commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

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

@ananthsub ananthsub added documentation Improvements to documentation r0.5.0 Auto-cherrypick to release branch. Apply before merge; cherrypick happens after merge. labels Aug 4, 2026
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot added the sla:review-overdue Review response is over the one-business-day SLA label Aug 5, 2026
Comment thread fern/versions/latest/pages/about/ecosystem.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/index.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/index.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/index.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/index.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
| 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. |

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.

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

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.

Also very weird distinction. We should revisit and understand why this is implemented. Please fire a future github issue

Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/agent-server/integrate-existing-agents.mdx Outdated
Comment thread fern/versions/latest/pages/about/ecosystem.mdx Outdated
Comment on lines +38 to +39
| [`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`) | |

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.

Missing notes/description


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 |

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.

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

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.

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:

  1. External Agent Harness — emphasizes they're third-party, but "External" is already covered by the parent section heading.
  2. 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>
@ananthsub
ananthsub force-pushed the ananthsub/docs-agent-server-index branch from 4f4d807 to 0703193 Compare September 1, 2026 16:43
@ananthsub ananthsub added r0.6.0 Auto-cherrypick to release branch. Apply before merge; cherrypick happens after merge. and removed r0.5.0 Auto-cherrypick to release branch. Apply before merge; cherrypick happens after merge. labels Sep 1, 2026
@ananthsub
ananthsub requested a review from ffrujeri September 1, 2026 18:22

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.

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().

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.

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).

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.

Could we make the rollout-collection behavior explicit here? “Drive it remotely” could sound as though rollout collection itself runs remotely. Suggested wording:

Suggested change
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. |

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.

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

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.

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?

Suggested change
| [`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.

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.

Could we make this exception more concrete? Suggested wording:

Suggested change
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.

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.

Could we reword this paragraph to make the integration boundary and the benchmark-coupled exceptions clearer?

Suggested change
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

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.

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.

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.

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.

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.

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:

  1. Gym-native reusable agents
  2. Reusable third-party harnesses — with invocation (subprocess, Python library, or sandbox), tool location, and training support represented as properties rather than subsections
  3. Remotely hosted agentsremote_agent
  4. Benchmark-coupled integrations — task schema, runtime, or evaluator is benchmark-specific
  5. 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.

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.

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, and terminus_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, and stirrup_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). |

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.

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:

Suggested change
| [`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.

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.

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements to documentation r0.6.0 Auto-cherrypick to release branch. Apply before merge; cherrypick happens after merge. sla:review-overdue Review response is over the one-business-day SLA

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs: comprehensive agent harness reference and selection guide docs: rewrite configure agents index page

3 participants