Want to learn evals? buildevals.com →

// USE CASE · CONVERSATION TRACING

Read the whole conversation, not twenty separate runs.

Set a stable session id and every turn's trace rolls up into one session automatically. The conversation becomes a single row with its agents, turns, duration, cost and eval scores, and you can replay it end to end.

THE PROBLEM

Chatbot bugs live between the turns

Turn six goes wrong because of what happened in turn two, but your tooling shows each request in isolation. Reconstructing a conversation by grepping timestamps is how an afternoon disappears.

// HOW RUNAGAIN DOES IT

01Sessions from one attribute

Send session.id (or gen_ai.conversation.id, or the common vendor alias) on your spans and RunAgain groups the turns automatically, ordered by start time. No session id means traces simply stand alone; sessions are purely additive.

02The conversation as one row

The sessions list mirrors the trace list: id, agents involved, turn count, duration and the session's eval scores, with saved views for errors and slow sessions and search over id, agent and user.

03Replay end to end

Open a session and walk the conversation turn by turn, each backed by its full trace: prompts, tool calls, tokens and cost at every step.

04Conversation-level economics

Cost and evals aggregate across turns, so you can answer what a resolved support thread actually costs and which conversations degrade as they get long.

00:01.2  span.start plan · model=claude-fable-5
00:01.9  tool.call web_search("return policy france")
00:02.8  tool.result 200 · 4 documents · 1.2kb
eval.inline faithfulness 0.94 ✓
00:03.1  tool.call db.query(orders.recent)
00:03.7  tool.result 200 · 12 rows
00:04.0  span.start generate
eval.inline grounding 0.41 ✗ · cited 30-day, source says 14-day
00:04.6  drift.check baseline Δ +0.9% ok
00:05.1  span.end run_a91f · 4.21s total
00:01.2  span.start plan · model=claude-fable-5
00:01.9  tool.call web_search("return policy france")
00:02.8  tool.result 200 · 4 documents · 1.2kb
eval.inline faithfulness 0.94 ✓
00:03.1  tool.call db.query(orders.recent)
00:03.7  tool.result 200 · 12 rows
00:04.0  span.start generate
eval.inline grounding 0.41 ✗ · cited 30-day, source says 14-day
00:04.6  drift.check baseline Δ +0.9% ok
00:05.1  span.end run_a91f · 4.21s total

Turns stream into one session, in order, nothing lost.

FREQUENTLY ASKED

How do I group traces into a conversation?

Set a stable session id as a span attribute on every turn. RunAgain accepts session.id, gen_ai.conversation.id and common vendor aliases, first non-empty wins, and rolls the turns up automatically.

Can I see which user a conversation belongs to?

Yes. user.id is promoted to a typed field alongside session, agent, environment and version, and session search matches over user as well.

Do evals work at the conversation level?

Eval scores attach to runs and aggregate on the session row, so a conversation shows its overall score and the per-dimension ticks the same way a single trace does.

BUILT ON THESE SOLUTIONS

More use cases: llm cost tracking · reduce llm costs · time-travel debugging · regression testing in ci · prompt a/b testing · hallucination detection · llm-judge calibration · tool-call failure analysis · structured output validation · tracing coding agents · agent & llm alerting

Be first to run again.

Book 30 minutes and see the loop on your own agents, or write to tamas@runagain.ai.