Commands
create, send, stream
--from-seq replays every event after a sequence number, so a reconnecting client never misses or duplicates events. Omit it to tail live from now. See Events & streaming.
A structured answer for one session
--output-schema takes a path to a JSON Schema file and overrides the agent’s schema for this run;
--require-output refuses a clean ending that produced nothing matching it.
structured_output, on the session.idle event and on the
session.idle webhook. See Structured outputs.
Graded against an outcome
--outcome (on create and run) attaches an outcome from the first turn, by ocm_ id or by name; vetta session outcome set attaches one to an idle session. Either way the agent must run no team members (handoffs: false, no multiagent roster).
--agent takes the agent’s agt_ id; the outcome may be its id or its name. An ambiguous name — two outcomes share it — exits 2 and lists the ids to pick from. See vetta outcome.
vetta session run with an outcome attached (and vetta session stream on a graded session) does not stop at the graded turn’s own park (awaiting_delegation while the grader runs): it keeps streaming through the grade and any revision turn, and exits on the session.idle after a terminal result (satisfied ends end_turn, exit 0). The SDK’s client.stream does the same unless passed throughGrades: false.
Each grade is an outcome.evaluation.* event, which vetta session events lists only with --include-accepted:
Money.
--budget-usd takes a decimal-dollar string and is converted client-side to integer micro-USD (the wire field is cap_micro_usd; 1 USD = 1_000_000 micro-USD). JSON amounts are integer *_micro_usd.interrupt, steer & queue
A running session ignores a plainsend (it returns session_running). Steer it in one call with --interrupt, interrupt on its own, or hold the words for the next turn with --queue:
--queue is queue: true on the wire: the message waits in the session’s inbox and becomes the input of the turn that follows the one running; on an idle session it is a plain send. --interrupt and --queue together are refused (validation_failed).
The inbox: what is waiting on you
A session that has stopped and is waiting on a person isidle, exactly like one that finished its
work — status cannot tell them apart. stop_reason can, so it is a filter:
vetta session inbox asks that question for every reason a person can clear —
awaiting_answer, awaiting_approval and budget_paused — and prints the id, the tool_call to
quote back, and one line saying what each session wants:
awaiting_delegation is deliberately absent: a coordinator waiting on its own threads is blocked on
work, not on you. inbox pages one reason at a time: with --stop-reason, pass the reply’s
next_cursor back as --after for the next page. Across all three reasons there is no single cursor:
next_cursor is null, and --after without --stop-reason is refused.
confirm & tool-result
When the agent pauses on a guarded tool, the session goesidle with stop_reason: awaiting_approval and a tool.confirm event. Resolve it:
identities_create is a
second card. --for-session answers it once and grants that tool for the rest of the chat:
--allow — there is no session-wide deny. For a call through the
tool invoker (tools_execute) the tool granted is the one in its tool argument, not the invoker.
answer a parked question
An agent that needs something from you parks the turn: the session goesidle with
stop_reason: awaiting_answer and carries the question in pending_actions. confirm cannot
resolve it — that route says only allow or deny, and “allow” is not an answer to “which mailbox?”.
At a terminal, vetta session answer prints the question and asks for each field in turn:
--tool-call is only needed when a session holds more than one parked question.
run exit codes
vetta session run (and the top-level vetta run) block until the session goes idle/terminal, then set the process exit code from the terminal stop_reason so scripts and CI can branch. Idle is not inherently success — the exit code reflects stop_reason:
A session that never reported why it stopped exits
1, and a bad command line exits 2.
usage
Changing tools mid-session
budget
There is no
--remove: a session always carries a cap. Raise it, or let the session stop at budget_paused.
cancel
--session and no other flag.
Files a session produced in its sandbox are not durable unless the agent promoted them with
publish_file. List what a run published with vetta file list --session $SID — there is no vetta session files.