Observability
LangSmith tracing
Dawn runs on LangGraph, which emits traces to LangSmith automatically when tracing is enabled. A single agent run produces a nested trace that includes every LLM call (with prompts, token counts, and latency), every tool invocation (input and output), and every subagent child run — all linked under one root run. This gives you a full picture of where time and tokens go without any instrumentation code in your routes.
Enabling tracing
Put your LANGSMITH_API_KEY in .env (or export it in your shell). When dawn dev loads the environment, it checks whether LANGSMITH_API_KEY is present and LANGCHAIN_TRACING_V2 is not already set, then sets LANGCHAIN_TRACING_V2=true automatically. You do not need to add LANGCHAIN_TRACING_V2 to your .env yourself.
LANGSMITH_API_KEY=lsv2_...
LANGCHAIN_PROJECT=my-research-agent # optional — names the project in LangSmithTo opt out, set LANGCHAIN_TRACING_V2=false explicitly in your shell or .env. The auto-enable only fills variables that are not already set, so an explicit false wins.
Reading a trace
Open any run in the LangSmith UI. The hierarchy follows the LangGraph execution graph:
- Root run — the full agent turn. Status is
successwhen the turn completes normally. - LLM runs — one per model call, with the full prompt, sampled output, token usage, and latency.
- Tool runs — one per tool call, with input and output. Subagent tool runs appear nested under the subagent's run.
- Subagent runs — each
subagent()dispatch appears as a child of the root run.
Human-in-the-loop interrupts in LangSmith
A HITL permission interrupt appears in LangSmith as a tool run with status interrupted and a GraphInterrupt in the error field. This is a pause, not a failure — the root run remains success and the agent continues after the interrupt is resolved. Do not confuse this with a real error, which has status error and an exception string in the error field.
Live SSE streaming (no account required)
If you do not have a LangSmith account, the dev server's runs/stream endpoint streams every event in real time over SSE — no tracing account needed. Each event has a type (chunk, tool_call, tool_result, plan_update, interrupt, subagent.*, done) and a JSON payload you can pipe to any terminal or client. See Dev Server for the full event-type table and connection instructions.