Skip to main content
When one agent passes work to another, DecimalAI records it in one of two shapes. Which one you have decides what you can see and train per sub-agent.

How It Works

An orchestrator is a role, not a setting: any agent whose manifest lists sub-agents, or whose traces have children. One agent can be both an orchestrator and another’s sub-agent.

Setup

instrument() reads agent.handoffs and lists each target as a sub-agent in the orchestrator’s manifest.

What Gets Captured

On OpenAI Agents SDK handoffs, every LLM call carries the root agent’s name. The sub-agent’s name is on its agent span and in a handoff:travel-planner->flight_agent span (type other), which show on the run’s timeline. It has no calls of its own to count or train on. For per-sub-agent numbers or training data, run it as a child trace instead.
Each framework reads sub-agents and links child runs its own way: On LangChain, an LLM call takes the name of its nearest enclosing chain run.

Dashboard

Agents Page

The Agents page lists sub-agents under their orchestrator, behind Show N sub-agents. An agent is listed there when the orchestrator’s active manifest names it and it has traces or LLM calls of its own.

Topology Graph

An agent’s More menu has Structure, with three panels. Each hides when it has nothing to show. The graph comes from the manifest, not from handoff spans, and hides when no listed sub-agent has traces or calls of its own.

Status and Score Roll-Up

A child trace’s result reaches its parent: A parent’s eval_score blends its own score (weight 1) with each child’s (weight 0.5), and only ever goes down. A failing child turns a parent’s pass into review.

Per-Sub-Agent Datasets

Build a dataset with the sub-agent as its target, and only that agent’s LLM calls go in, even calls inside another agent’s trace:
Then POST /api/v1/datasets/{id}/build with an empty body. Datasets has the dashboard steps and every filter. For child traces, /api/v1/multi-agent-training/{orchestrator} has three more routes: GET /fault-attribution ranks the sub-agents that failed in the runs where the orchestrator failed, GET /subagent-dataset/{subagent} previews a sub-agent’s rows, and POST /launch starts one training job per sub-agent.

Handoff Markers

A row can hold calls from more than one agent when a build has no single agent to filter to: a trace_ids build, or a dataset with no target agent. Then each change of agent adds a marker, and each assistant message names its agent:
OpenAI Agents SDK handoffs never produce these, because all their calls share one name.

Version Drift Detection

Each agent with its own manifest has its own version timeline. The orchestrator’s manifest lists sub-agents by name, so a change inside flight_agent registers a new flight_agent version and leaves the orchestrator’s manifest alone. Adding or removing a sub-agent registers a new orchestrator version. If you declare a version on a sub-agent, a major bump counts as an incompatible change for the orchestrator, and a smaller one as repairable. Manifests covers what those verdicts do. The Structure panels show one of these for each sub-agent: The SDK doesn’t set manifest_ref, so Drifted appears only for a manifest you post to POST /api/v1/manifests with one.

Best Practices

  1. Choose child traces if you want per-sub-agent data. Handoffs put the whole run on one timeline, but give no numbers or datasets per sub-agent.
  2. Declare sub-agents in the manifest. The topology graph and the Agents page read the manifest, not the traces.
  3. Build one dataset per sub-agent, fine-tuned on its own calls.

Next Steps

Read a run

Open a trace and read its spans and LLM calls.

Datasets

Build, export and fine-tune.