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.

.env
LANGSMITH_API_KEY=lsv2_...
LANGCHAIN_PROJECT=my-research-agent   # optional — names the project in LangSmith

To 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 success when 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.

Related