GRAPH_EVENTS=jsonl and graph writes its progress to stderr as one JSON object per line, instead of text for people. stdout still carries only the result, so you can read both from one run:
graph plan run, graph ask and graph chat. Every event has an event field naming its type.
Events
tool_started
A tool call began.string
The tool’s full name, such as
github__tool__git_log.object
The input the tool was called with, after templates were filled.
tool_finished
A tool call ended.string
The tool’s full name.
integer
How long the call took, in milliseconds.
boolean
Whether the tool returned an error.
agent_round
An agent, or anagent step, started another round of model calls and tool calls.
integer
The round number.
synthesizing
A plan’ssolver started writing its answer.
model_call
A model call finished.enum<string>
chat for a chat model, decision for a decision model.string
Where the call was made: the step’s path, such as
E3 or triage/E1, or the model role when the call belongs to no step.string
The model id.
integer
Uncached input tokens.
integer
Output tokens.
integer
Input tokens written to the provider’s prompt cache.
integer
Input tokens read from the provider’s prompt cache.
integer
How long the call took, in milliseconds.
usage_summary
What the whole run spent, sent once at the end, including when the run fails. graph skips it when the run made no model calls.integer
Model calls in the run.
integer
Total uncached input tokens.
output_tokens, cache_creation_input_tokens and cache_read_input_tokens sit alongside it.object[]
The same totals per step, each with its
path.object[]
The same totals per model, each with its
provider and model.Related environment variables
enum<string>
How graph reports progress and failures on stderr. Unset, stderr is for people.