Skip to main content
A team is an agent whose configuration includes a multiagent object with type: "coordinator" and an agents roster. The coordinator owns the top-level task and coordinates its roster the two ways a team can. It is an ordinary agent in every other respect: it has a model, a budget, a system prompt, and it runs inside a session you drive directly.

Making one

The roster lives on the coordinator’s own config, so a team is made in two steps — create an agent, then give it a roster. There are no roster flags on vetta agent create.
The response echoes your configuration and, like any agent, adds id, version, created_at, and updated_at. Adding, removing, or repinning members produces a new coordinator version — the roster is part of the agent’s config.
Any published harness can be the coordinator’s. send_to_agent and board_write reach the coordinator’s model either in the toolset Vetta assembles for the turn, or — on claude_code and hermes, which run a CLI inside a micro-VM on that CLI’s own toolset — over a session-scoped tool endpoint the machine is given. One caveat on those two: wait_for_agents does not pause the turn, so the coordinator parks once the turn goes idle instead of mid-call. It costs a few extra model calls, not a wrong answer. See Harness capabilities.
On the wire a roster member is an agt_ id. web-researcher@3 is a CLI spelling: vetta team resolves the name against your org’s agents and writes the id. The API rejects anything that is not an agt_ id.

Roster entry types

Each entry in agents is discriminated by a type field. A bare "agt_…" string is also accepted and normalises to the agent form at parse, so exactly one shape reaches storage.

agent — reference another agent

Referenced members are fully independent agents with their own model, harness, tools, skills, and system prompt. Session-level configuration overrides applied to the coordinator’s session do not reach id-referenced members — they run exactly as their pinned version defines.
Every referenced member is checked when you save the roster, not when it is first delegated to. See Mixing harnesses for what is checked and why a save can be refused.

self — spawn copies of the coordinator

The coordinator can delegate to copies of itself. Each copy is a fresh session running the coordinator’s own configuration — useful for recursively decomposing homogeneous work. Unlike id-referenced members, session-level configuration overrides applied at the coordinator’s session do apply to self copies (and to the coordinator itself), because they share the coordinator’s configuration.
self does not create a nested team. A self copy runs the coordinator’s base behavior on its own brief; it is a member, and a member is never handed send_to_agent at all. Only one level of delegation is permitted (see Delegation).

advisor — parses, but is not served

An advisor is intended as a consult-only voice for the coordinator’s own session — a bare model with no agent behind it, so it names a model instead of an id.
It is not served today. A roster containing an advisor entry is refused at save, with advisor roster entries are not yet served. The shape is on the wire so that a roster written for it still parses, and the CLI still accepts the advisor:<model> spelling, but nothing runs it. Do not design a team around it.

Roster entry types at a glance

Configuration reference

The multiagent field

It accepts an object, a boolean, or null, and all three arms mean something:
object | boolean | null
An object declares the team. false and null mean the agent is not a coordinator — null is how an existing roster is cleared on a PATCH, which false cannot say because false is also the create-time default. true is read as a coordinator with an empty roster and no board, which has nobody to delegate to; it is a degenerate case, not a shortcut.

agent entry

string
required
The agt_ id of another agent in your organization to delegate to.
integer
The version of the referenced agent to pin. Omit the version and Vetta pins the member’s current version at the moment the coordinator is saved — the stored roster always carries an explicit pin, and it does not drift. See Rosters & versioning.

Next: delegation

How the coordinator invokes members, and the isolated sessions they run in.