What Gets Traced
Each traced workflow execution produces a trace tree. The root is the workflow, and children are everything that ran inside it:- Steps and evaluators — input, output (or error), start/end timestamps;
- LLM calls - the loaded prompt (
name,fileDir,variables, rendered config/messages), the result, raw token usage, and normalized usage/cost attributes. Text calls also include mergedsources; image calls do not; - HTTP calls — method, URL, status code. Requests made with
@outputai/httpappear ashttpevents; workflowsendHttpRequestcalls appear as internal activities; - Internal activities — Output-managed activities such as trace destination lookup and workflow HTTP requests;
- Child workflows — nested as their own trees with the same structure
input.prompt contains the loaded source prompt, including config.skills, but not the runtime-generated skill listing or load_skill tool added to the provider request.
Enabling Tracing
Tracing is off by default. You enable it with environment variables. Local tracing writes JSON files to disk — no extra services needed. Remote tracing uploads to S3 when a run completes (requires Redis to correlate events). You can disable trace generation for specific workflows withoptions.disableTrace: true — see Workflow options.
Local only (recommended to start):
logs/runs/<workflowName>/<timestamp>_<workflowId>.json under your project root.
Local + remote:
All Environment Variables
AWS Credential Permissions
The worker uploads each trace to S3 when the run completes, so its credentials (OUTPUT_AWS_ACCESS_KEY_ID / OUTPUT_AWS_SECRET_ACCESS_KEY) must allow write access to the trace bucket:
output workflow debug, cost, and dataset generate --download — see API Configuration for the read-side policy. The worker and API can share one key pair or use two identities each scoped to their own actions.
Reading a Trace
Each trace file is a single JSON object — the root workflow node. Every node in the tree has the same shape:Step with an LLM Call
This is the most common trace shape you’ll see. The step has the LLM call as a child, so you can see the loaded prompt (including interpolation variables), what the LLM returned, and how many tokens it used:llm:usage attribute remains on priced LLM traces for compatibility. New trace readers should use llm:generation:usage and llm:generation:cost, which preserve normalized usage and detailed pricing separately.
Failed Step
When a step fails, it has anerror object instead of output. The error includes the name, message, and stack trace:
error when the run fails, so you can see at the root level that something went wrong.
Full Workflow Trace
A complete trace puts it all together — the workflow root with all its step children:Child Workflows
Child workflows appear askind: "workflow" children with their own nested tree of steps:
Continue-as-New
When a workflow calls continueAsNew, the trace records"<<continued_as_new>>" as the output for that run. The new run keeps the same workflow ID but gets a new start time — each run produces its own trace file. To see the full chain, list trace files for that workflow name and match by workflow ID; sort by timestamp for order.
Accessing Traces
You can access traces in three ways:- Directly — Open the JSON files at
logs/runs/<workflowName>/ - Via API — See Get workflow trace log
- Via CLI — See output workflow debug
output workflow debug, output workflow cost, and output workflow dataset generate --download all fetch traces through the API’s trace-log endpoint, and the API reads remote traces from S3. The API’s AWS credentials therefore need s3:GetObject and s3:ListBucket on the trace bucket — see API Configuration.