Skip to content

feat(experimentalist): add the tau3-bench banking benchmark suite - #935

Merged
callingmedic911 merged 9 commits into
mainfrom
cursor/cloud-agent-1785190461860-3q8ge
Jul 29, 2026
Merged

feat(experimentalist): add the tau3-bench banking benchmark suite#935
callingmedic911 merged 9 commits into
mainfrom
cursor/cloud-agent-1785190461860-3q8ge

Conversation

@callingmedic911

@callingmedic911 callingmedic911 commented Jul 27, 2026

Copy link
Copy Markdown
Member

Adds the banking domain of sierra-research/tau3-bench as a second Experimentalist benchmark suite, next to Terminal Bench.

Suite. sierra-research/tau3-bench@1, pinned by content hash. We pull and use that directly.

Agent. examples/tau3-nooa-agent drives the task's tau3-runtime sidecar over MCP. Three things had to be fixed before it ran at all:

  • the task image ships no uv
  • the agent's container gets no credentials (upstream's compose file wires them into the sidecar only)
  • nooa 0.0.6 builds its MCP transport with no timeout, so httpx's 5 second default stranded every sidecar call that ran a user-simulator LLM. mcp_timeout.py works around it. fix: honor tool_call_timeout so slow MCP tool calls stop hanging labs-OO-Agents#46 once this lands, I'll clean that up.

Summary by CodeRabbit

  • New Features

    • Added TAU3 banking benchmark support with fast and quality configurations.
    • Added terminal benchmark smoke and quality configurations.
    • Added a runnable TAU3 NOOA customer-service agent example with tracing and artifact collection.
    • Added configurable suite workspaces, framework skills, task partitions, and user-simulator settings.
  • Documentation

    • Updated benchmark instructions, dataset provenance, credential setup, and evaluation guidance.
    • Added agent specifications and usage documentation.
    • Updated dependency pinning guidance for reproducible setups.
  • Bug Fixes

    • Improved canonical task validation and suite-specific task scoping.
    • Added clearer errors for unknown framework skills.

@github-actions github-actions Bot added the feat label Jul 27, 2026
@cursor cursor Bot changed the title feat(experimentalist): generalize the benchmark harness for a second suite, add tau3 agent feat(experimentalist): generalize the benchmark harness to host a second suite Jul 27, 2026
@cursor
cursor Bot force-pushed the cursor/cloud-agent-1785190461860-3q8ge branch from 84d41ba to db3f82b Compare July 27, 2026 23:09
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 28094/35888 78.3% 62.7%
Integration Tests 16328/34606 47.2% 19.6%

The runner hardcoded Terminal Bench's workspace and framework skill and assumed a
package held exactly one domain, so a second suite could not be expressed as a
manifest.

A manifest now carries its own workspace and framework_skills, and may set
task_id_prefix to scope a multi-domain package to one domain; coverage is then
enforced against the matching subset. Skill directories resolve before the
baseline evaluation, because otherwise a typo'd skill name surfaces hours of
image builds later.

A config may also name a user_simulator, which exports the OpenAI-style
credentials that tau-style task environments and their NL-assertion judge read.
Those are assigned rather than defaulted: a developer's ambient OPENAI_API_KEY
paired with this gateway's base URL would 401 on every call.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Scopes sierra-research/tau3-bench@1 to its 97 banking_knowledge tasks. The
quality partition reuses the 41/28/28 split from optimization-datasets
feat/tau2-other-domains, whose tau2-banking-knowledge-NNN names map onto the
canonical Hub IDs; only task IDs are recorded here, never task content.

The 6/3/3 fast partition draws solely from the 87 tasks whose reward_basis is
pure database state, so smoke runs score without an LLM judge. Both partitions
were validated against live Harbor Hub.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
A NOOA CodeAct agent that reaches the tau2 domain tools over MCP from the task's
tau3-runtime sidecar. AGENT-SPEC.md stays domain-generic because the policy
arrives at runtime in the task instruction, and it is what the Experimentalist
mutates.

Three things the task images required:

Installing from the committed lock uses the pip that python:3.12-slim already
ships, since tau3 images carry neither uv nor the curl its installer wants.
Terminal Bench's uv-upload machinery is unnecessary here because every tau3 task
shares that one base image.

Model credentials are handed over at exec time. A task's [environment].env only
interpolates its docker-compose file, and upstream wires those variables into the
sidecar; the main service declares no environment, so the agent had none.

mcp_timeout.py replaces nooa 0.0.6's MCP transport, which is built without an
httpx timeout and so inherits httpx's 5 second default. The sidecar runs the user
simulator inside start_conversation and send_message_to_user, which take longer;
the server completed the work and advanced its state, but the reply landed on an
abandoned stream and nooa surfaced no timeout, so the agent hung indefinitely.

Verified end to end on the fast test split: all three tasks complete with no
harness error, one solved, for a 1/3 baseline the optimizer can improve on.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Turns the single-suite README into one that covers both suites: how a manifest
carries its own workspace, framework skills, and optional domain prefix, the
banking provenance and partition derivation, and the two-container topology with
its memory and build-timeout consequences.

Also records that upstream's tau3 Dockerfiles clone tau2-bench without a ref, so
a cold layer cache can pick up newer commits than an earlier run saw.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
@callingmedic911
callingmedic911 force-pushed the cursor/cloud-agent-1785190461860-3q8ge branch from fd292b4 to ca4ff47 Compare July 28, 2026 20:18
…sk-id prefix

Every ID in a domain-scoped package repeats the domain prefix, so listing 109 of
them buried the part that actually differs and made the banking manifest 143
lines of near-identical strings.

Partition entries are now names inside the suite's task_id_prefix, joined back on
at load so the rest of the runner keeps working in canonical IDs. The banking
manifest drops to 50 lines and its splits are legible at a glance. Suites without
a prefix, meaning Terminal Bench, are unaffected.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
A config carries the models and optimizer depth for one suite, but the original
pair was named only for its partition. Once tau3-smoke.yaml and tau3-quality.yaml
sat beside them, smoke.yaml and quality.yaml read as the generic pair rather than
the Terminal Bench one.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Drops the container topology, the memory and build-timeout guidance, and the note
about upstream's unpinned tau2-bench clone. What remains mirrors the Terminal
Bench section: package, hash, Hub record, partition derivation, and the one
config field the suite introduces.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
@callingmedic911 callingmedic911 changed the title feat(experimentalist): generalize the benchmark harness to host a second suite feat(experimentalist): add the tau3-bench banking benchmark suite Jul 28, 2026
Comment thread plugins/nemo-experimentalist/examples/tau3-nooa-agent/README.md
nooa built its streamable-http transport with an httpx client that had no
timeout, so httpx's 5 second default governed the MCP read stream and any tool
call taking longer than that hung forever. The tau3 agent hit this on every
turn, because the tau3-runtime sidecar runs a user-simulator LLM inside
start_conversation and send_message_to_user.

That is fixed upstream in NVIDIA-NeMo/labs-OO-Agents#46, so this drops the local
mcp_timeout.py shim and goes back to MCPManager.create_from_server, which now
takes tool_call_timeout directly. The agent still asks for 300 seconds: nooa's
60 second default would do today but leaves no room for a slower model.

The pin is a commit rather than a tag because no release carries the fix yet.
The lock's extra wheel rows are generated: no package version moves except nooa.

Verified against a live sidecar that start_conversation now returns in 7.3s
instead of hanging, and that a full Harbor trial completes with no harness error.

Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
…85190461860-3q8ge

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

# Conflicts:
#	uv.lock
@callingmedic911
callingmedic911 marked this pull request as ready for review July 29, 2026 20:39
@callingmedic911
callingmedic911 requested review from a team as code owners July 29, 2026 20:39
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

Experimentalist benchmark execution

Layer / File(s) Summary
Suite contracts and execution wiring
plugins/nemo-experimentalist/benchmarks/run.py, plugins/nemo-experimentalist/benchmarks/suites/*
Suite-scoped task IDs, workspaces, framework skills, user-simulator credentials, and suite-derived Experimentalist arguments are supported.
Benchmark configurations and validation coverage
plugins/nemo-experimentalist/benchmarks/configs/*, plugins/nemo-experimentalist/tests/test_experimentalist_benchmark.py
Terminal-bench and tau3 smoke/quality configurations are added and validated with expanded task, skill, and credential tests.
Canonical benchmark documentation
plugins/nemo-experimentalist/benchmarks/README.md
Suite provenance, evaluation procedures, commands, credential mapping, and container dependency behavior are updated.
TAU3 NOOA agent runtime
plugins/nemo-experimentalist/examples/tau3-nooa-agent/agent.py, main.py, pyproject.toml
A CodeAct agent integrates NOOA tracing, tau3-runtime MCP tools, configurable completion credentials, and a CLI entrypoint.
Harbor packaging and trace collection
plugins/nemo-experimentalist/examples/tau3-nooa-agent/harbor_wrapper.py
The wrapper uploads and installs the agent, runs it with credentials, parses token metrics, and collects traces and execution metadata.
NOOA revision and agent guidance
pyproject.toml, plugins/nemo-experimentalist/AGENTS.md, plugins/nemo-experimentalist/README.md, plugins/nemo-experimentalist/framework-skills/nooa/SKILL.md, plugins/nemo-experimentalist/examples/tau3-nooa-agent/*
NOOA is pinned to an immutable commit and related setup, skill, and agent guidance is updated.

Sequence Diagram(s)

sequenceDiagram
  participant Harness as Harbor harness
  participant Wrapper as WrappedAgent
  participant Agent as Codeact
  participant Runtime as tau3-runtime
  Harness->>Wrapper: install and run agent
  Wrapper->>Agent: execute instruction
  Agent->>Runtime: call MCP tools
  Agent-->>Wrapper: write traces
  Wrapper-->>Harness: return metrics and artifacts
Loading

Possibly related PRs

Suggested reviewers: aleckhoury, stefan-kickoff, mmogallapalli

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 31.82% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main change: adding the tau3-bench banking benchmark suite.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/cloud-agent-1785190461860-3q8ge

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

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

Inline comments:
In `@plugins/nemo-experimentalist/benchmarks/README.md`:
- Around line 4-15: Restructure the benchmark README into a single how-to page:
place prerequisites first, add Python SDK and CLI tabbed examples, provide
substitutions for product names, and finish with Next Steps. Move benchmark
provenance and artifact details, including the suite metadata currently in the
overview table, into linked reference and explanation pages. Apply the same
structure to the content covering the referenced suite sections.

In `@plugins/nemo-experimentalist/examples/tau3-nooa-agent/harbor_wrapper.py`:
- Line 75: Update the agent setup command in the harbor wrapper to remove
pip-based installation of uv. Use a pinned uv binary already provided in the
image or bootstrap uv through a non-pip mechanism, then retain the existing
UV_HTTP_TIMEOUT and run uv sync --frozen.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: be40c140-2513-4b7d-81e6-1d099dc2ba89

📥 Commits

Reviewing files that changed from the base of the PR and between 324d64e and 1338ea4.

⛔ Files ignored due to path filters (2)
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (19)
  • 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/benchmarks/suites/tau3-banking.yaml
  • plugins/nemo-experimentalist/benchmarks/suites/terminal-bench-2.1.yaml
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/AGENT-SPEC.md
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/README.md
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/agent.py
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/harbor_wrapper.py
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/main.py
  • plugins/nemo-experimentalist/examples/tau3-nooa-agent/pyproject.toml
  • plugins/nemo-experimentalist/framework-skills/nooa/SKILL.md
  • plugins/nemo-experimentalist/tests/test_experimentalist_benchmark.py
  • pyproject.toml

Comment thread plugins/nemo-experimentalist/benchmarks/README.md
@callingmedic911
callingmedic911 added this pull request to the merge queue Jul 29, 2026
Merged via the queue into main with commit 9aaf35d Jul 29, 2026
59 checks passed
@callingmedic911
callingmedic911 deleted the cursor/cloud-agent-1785190461860-3q8ge branch July 29, 2026 21:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants