Skip to content

Events

Every step of a turn streams as an event: a JSON object with a type, carried as the data part of an A2A status update. This page lists each event's fields.

{"result": {"statusUpdate": {"taskId": "bf11...", "contextId": "conv-1", "status": {
  "state": "TASK_STATE_WORKING",
  "message": {"role": "ROLE_AGENT", "metadata": {"vessel.event": "tool.started"},
              "parts": [{"mediaType": "application/json",
                         "data": {"type": "tool.started", "call_id": "call_1", "name": "list", "arguments": {}}}]}}}},
 "id": "1", "jsonrpc": "2.0"}

Event types

Type Fields Sent
turn.started conversation_id, turn_id (the task id) Once, first
text.delta step, content As the model writes; pieces are merged into one event per 50 ms or 512 characters
reasoning.delta step, content As the model reasons, merged the same way
step.finished step, tool_calls (count), tokens (input, output), finish_reason After each model call
tool.started call_id, name, arguments (the parsed object, or the first 2,000 characters of invalid input) Before each tool call
tool.finished call_id, name, output (first 4,000 characters), error, truncated, elapsed_ms After each tool call, including stopped ones (output: "[stopped]")
turn.finished status, tokens, steps, elapsed_ms, files (the files attached, [] when none), error (when any) Once, last, in the task's final status

Every tool.started has a matching tool.finished. Text written in the same model message as a tool call streams as text.delta too; it is narration, and the answer is the final message without tool calls, delivered as the answer artifact.

Turn statuses

Status Meaning
ok The model answered
step_limit max_steps was reached and the model answered without tools
deadline The turn ran past deadline_seconds
cancelled The caller cancelled it
model_error The model endpoint failed, or the turn failed unexpectedly; error gives a generic reason

A tool that fails does not end the turn: the model sees the error and can try again.

Artifacts

Artifact name Parts Sent
transcript One application/vnd.astralvessel.transcript+json part per chunk, holding {"version": 1, "messages": [...]}; the last chunk adds "turn" Only when requested in acceptedOutputModes
file One raw part with mediaType, filename and metadata.call_id Per returned file, for accepted types
answer A text/markdown part; a primitives part when components were attached Once, before turn.finished

The transcript's closing turn summary has the same fields as turn.finished plus model, the model name.