Framework
NVlabs/ToolOrchestra avatar
NVlabs/ToolOrchestra

ToolOrchestra: An RL Training Framework for Small Tool-Orchestrating Models

ToolOrchestra is an end-to-end RL training framework for orchestrating tools and agentic workflows.

766 stars108 forksPythonApache-2.0

At a glance

What is it?
NVIDIA's ToolOrchestra trains an 8B orchestrator to route tasks across search, code, and specialist LLMs. It is a research training stack, not a drop-in agent library, and the setup assumes Slurm, Enroot, and several API keys.
Who is it for?
Adopt ToolOrchestra if you are training or reproducing a small orchestrator model and you already have multi-GPU Slurm infrastructure plus Tavily, Weights & Biases, and NVIDIA NGC credentials. Do not adopt it if you need a packaged agent runtime for production traffic, since the repository ships training and evaluation entry points rather than a serving layer.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 174 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The routing problem ToolOrchestra is built around

A multi-turn agentic task usually has one model doing everything: planning, searching, writing code, and doing arithmetic. That is wasteful when a math specialist or a code model would handle a sub-step better, and it is expensive when a frontier model is invoked for a lookup. ToolOrchestra targets that gap. The README describes it as a method for training small orchestrators that coordinate intelligent tools, where the orchestrator alternates between reasoning and tool calling across multiple turns. The tool set it manages is deliberately heterogeneous: basic tools such as web search and a code interpreter, specialized LLMs such as coding and math models, and generalist LLMs including GPT-5, Llama-Nemotron-Ultra-253B, and Claude Opus 4.1. The intended user is a research or platform team that wants a small model to make the routing decisions, rather than paying a large model to both decide and execute. The repository is Apache-2.0 and written in Python.

Outcome, efficiency, and preference rewards in the training loop

The mechanism is end-to-end reinforcement learning over the orchestrator's own trajectories. According to the README, the Orchestrator is jointly optimized by three reward signals: outcome, efficiency, and preference. Outcome covers whether the task was solved, efficiency covers what the run cost, and preference covers how the trajectory compares against alternatives. Because the orchestrator's action space is tool selection and the tool set includes external LLMs, the reward has to be computed over a rollout that spans multiple turns and multiple services. To make that trainable at scale, the project includes an automatic pipeline that synthesizes both environments and tool-call tasks. The published artifact of this loop is Orchestrator-8B, an 8B parameter orchestration model. The README states that on HLE it scores 37.1% against GPT-5's 35.1% while being 2.5x more efficient, and that on tau2-Bench and FRAMES it surpasses GPT-5 while using roughly 30% of the cost. Those are the project's own reported numbers; the evaluation scripts to reproduce them are in the repository, but this review has not run them.

What the setup actually requires before training starts

The environment section is the most informative part of the README, because it shows how much external surface the framework depends on. You clone the repository and then clone two more artifacts: the index files from the multi-train/index dataset, and the Nemotron-Orchestrator-8B checkpoint. Both are pointed at through environment variables rather than hardcoded paths. The README sets INDEX_DIR, CKPT_DIR, HF_HOME, and REPO_PATH, plus five credentials: TAVILY_KEY for the search API, WANDB_API_KEY, OSS_KEY described as an NVIDIA NGC key, and a CLIENT_ID and CLIENT_SECRET pair. Training runs in a conda environment created with python=3.12, followed by pip install -r requirements.txt, a flash-attn install with --no-build-isolation, flashinfer-python from the cu124 wheel index, and pip install -e training/rollout. Retrieval is a separate conda environment pinned to pytorch==2.4.0 and pytorch-cuda=12.4, with pyserini, faiss-gpu, uvicorn, fastapi, and tavily-python. Model serving is a third environment, vllm1, pinned to vllm==0.9.2 and transformers<4.54.0. Three environments for one project is a real operational cost, and the version pins are narrow enough that mixing them will break.

Running training and evaluation from the repository entry points

Training is a single command from the training directory: python resume_h100.py. The script name implies H100 hardware and a resume-from-checkpoint workflow, and the README does not document a CPU or single-GPU path. Evaluation is split by benchmark. From the evaluation directory, python run_hle.py and python run_frames.py both require the vllm1 and retriever environments to be available, and tau2-Bench is run by changing into tau2-bench/ and calling python run.py with only the vllm1 environment. The tau2-Bench path is the awkward one. The README instructs you to rebuild the container image because it needs a local installation of tau2: you start an interactive Slurm allocation with srun, mount the Enroot image at a path under /lustre, run pip uninstall -y tau2, then cd into toolorchestra/evaluation/tau2-bench and pip install -e . before exiting the container. That sequence is specific to an internal cluster layout, including the account name and the /lustre mount points, so plan on adapting the srun line rather than copying it. Customization is limited to one documented hook: the get_llm_response function in LLM_CALL.py, which the README says is where you change LLM calls. The README text is truncated at that point, so there may be further customization options that are not visible here.

Where the framework stops being the right tool

ToolOrchestra is a training framework, and the repository layout reflects that. There is no documented serving path, no HTTP API for the orchestrator itself, and no packaging story beyond pip install -e on the rollout and tau2-bench subpackages. If what you want is an agent runtime that accepts a request and returns a routed answer, this is the wrong layer. The dependency weight is the second constraint. Rebuilding the Enroot image for tau2-Bench, maintaining three conda environments, and holding live keys for Tavily, Weights & Biases, and NGC means the framework is coupled to networked services at both training and evaluation time. A team without a Slurm cluster and a shared Lustre filesystem will spend more time porting the launch scripts than running experiments. The third constraint is reproducibility of the headline numbers. The evaluation scripts exist, but reproducing 37.1% on HLE depends on the retrieval index, the vLLM version, and the external generalist models the orchestrator calls, any of which can shift the result. The README gives no guidance on acceptable variance.

How this differs from a general agent framework

The closest comparison is a general-purpose agent framework such as LangGraph or a ReAct-style loop built on a single model. Those frameworks give you control flow: you write the graph, define the tools, and the model fills in the steps at inference time. ToolOrchestra inverts the emphasis. The control policy is learned rather than authored, and the training signal explicitly includes cost, which is why the README can claim the same or better accuracy at a fraction of the spend. The trade-off is that changing behavior means retraining or fine-tuning the orchestrator, not editing a prompt or a graph node. A hand-written graph is easier to debug and audit; a learned orchestrator can discover routing strategies you would not have specified, but it gives you no readable policy to inspect. The project also sits closer to the model-training side than the application side, which is consistent with its origin in an NVIDIA research lab and its release alongside a paper, a dataset, and a model checkpoint.

Licence and the cost of keeping up

The repository is Apache-2.0, which permits commercial use and modification and includes an explicit patent grant. That covers the code. It does not automatically cover the Nemotron-Orchestrator-8B checkpoint, the ToolScale dataset, or the third-party models the orchestrator calls, each of which carries its own terms; check those separately rather than assuming the repository licence extends to them. This is not legal advice. On maintenance, the material gives limited signal: there are no retrieved releases, and the most recent push is dated 2026-03-25. The news entries describe a November 2025 code, data, and checkpoint release, a December 2025 GAIA leaderboard placement, and a December 2025 dataset milestone. The upgrade surface to watch is the dependency pins. vllm==0.9.2, transformers<4.54.0, pytorch==2.4.0, and the cu124 flashinfer wheel are a snapshot of one working combination; moving any of them means revalidating the rollout and evaluation paths, and the repository does not document a supported upgrade path.

Editorial conclusion

Adopt ToolOrchestra if you are training or reproducing a small orchestrator model and you already have multi-GPU Slurm infrastructure plus Tavily, Weights & Biases, and NVIDIA NGC credentials. Do not adopt it if you need a packaged agent runtime for production traffic, since the repository ships training and evaluation entry points rather than a serving layer. Before committing, verify that the index files at multi-train/index and the Nemotron-Orchestrator-8B checkpoint both download, that your cluster can rebuild the Enroot image with the local tau2 install, and that the pinned vllm==0.9.2 and transformers<4.54.0 combination resolves in your environment.

Official sources

  1. Issues
  2. License: Apache-2.0
  3. NVlabs/ToolOrchestra on GitHub
  4. Project website
  5. README
Community notes

Community notes