Skip to main content

Debug Session, Generation, and Trace History

Build a conversation with a deterministic mapping between session_id, generation_id, and trace_id: list a session's messages and generations, inspect each trace and trace tree, and reverse-look-up from trace_id to generation and session. Uses Sessions debugging links, Agent traces, Trace debugging joins, and Files examples.

Prerequisites​

export SOAT_BASE_URL=http://localhost:5047

Step 1 - Login as admin​

Use the Users examples login flow to get a token.

ADMIN_TOKEN=$(soat login-user --username admin --password Admin1234! | jq -r '.token')
export SOAT_TOKEN=$ADMIN_TOKEN

Step 2 - Create project, AI provider, agent, and session​

Create the minimum resources from Projects examples, AI Providers examples, Agents examples, and Sessions examples. The provider is local Ollama; for xAI, OpenAI, Anthropic, or Amazon Bedrock see Connect Third-Party LLMs.

PROJECT_ID=$(soat create-project --name "Debug Graph Demo" | jq -r '.id')

AI_PROVIDER_ID=$(soat create-ai-provider \
--project-id "$PROJECT_ID" \
--name "Local Ollama" \
--provider "ollama" \
--default-model "qwen2.5:0.5b" | jq -r '.id')

AGENT_ID=$(soat create-agent \
--project-id "$PROJECT_ID" \
--ai-provider-id "$AI_PROVIDER_ID" \
--name "Debug Assistant" \
--instructions "You are a concise debugging assistant." | jq -r '.id')

SESSION_RESP=$(soat create-session \
--agent-id "$AGENT_ID" \
--name "Debug Session" \
--auto-generate false)
SESSION_ID=$(printf '%s' "$SESSION_RESP" | jq -r '.id')
CONV_ID=$(printf '%s' "$SESSION_RESP" | jq -r '.conversation_id')

echo "PROJECT_ID=$PROJECT_ID"
echo "AGENT_ID=$AGENT_ID"
echo "SESSION_ID=$SESSION_ID"

Step 3 - Run two generations and capture generation_id + trace_id​

Produce assistant replies and capture the correlation IDs (Sessions debugging links, Sessions background generation).

soat add-session-message \
--session-id "$SESSION_ID" \
--message "Explain what a generation is in one sentence." > /dev/null

GEN_1=$(soat generate-session-response --wait true \
--session-id "$SESSION_ID")

GEN_1_ID=$(printf '%s\n' "$GEN_1" | jq -r '.generation_id')
TRACE_1_ID=$(printf '%s\n' "$GEN_1" | jq -r '.trace_id')

soat add-session-message \
--session-id "$SESSION_ID" \
--message "Now explain what a trace is in one sentence." > /dev/null

GEN_2=$(soat generate-session-response --wait true \
--session-id "$SESSION_ID")

GEN_2_ID=$(printf '%s\n' "$GEN_2" | jq -r '.generation_id')
TRACE_2_ID=$(printf '%s\n' "$GEN_2" | jq -r '.trace_id')

printf '%s\n' "$GEN_1" | jq '{generation_id, trace_id, status}'
printf '%s\n' "$GEN_2" | jq '{generation_id, trace_id, status}'

Step 4 - Retrieve the full session message timeline​

Inspect the canonical conversation history (Sessions key concepts, Sessions examples).

soat list-conversation-messages \
--conversation-id "$CONV_ID" | jq '.data[] | {position, role, content}'

Step 5 - Inspect traces for each generation​

Inspect metadata and tree structure (Traces key concepts, Trace ancestry model, Traces examples).

soat get-trace --trace-id "$TRACE_1_ID" | jq '{id, agent_id, file_id, parent_trace_id, root_trace_id, step_count}'
soat get-trace-tree --trace-id "$TRACE_1_ID" | jq '{id, children: [.children[].id]}'

Step 6 - Download raw trace steps using file_id​

Raw trace payloads are files (Files key concepts, Files examples).

TRACE_FILE_ID=$(soat get-trace --trace-id "$TRACE_1_ID" | jq -r '.file_id')
soat download-file-base64 --file-id "$TRACE_FILE_ID" \
| jq -r '.content' | base64 -d | jq '.[0]'

Step 7 - Build a reusable debug ledger (reverse lookup)​

Trace debugging joins resolve trace_id -> generation_id[] directly; keep a ledger only for generation_id -> session_id.

soat list-generations --trace-id "$TRACE_1_ID" | jq '[.data[].id]'

cat > /tmp/debug-links.json <<EOF
[
{"session_id":"$SESSION_ID","generation_id":"$GEN_1_ID","trace_id":"$TRACE_1_ID"},
{"session_id":"$SESSION_ID","generation_id":"$GEN_2_ID","trace_id":"$TRACE_2_ID"}
]
EOF

# Reverse lookup example: trace_id -> generation_id + session_id
jq -r '.[] | select(.trace_id == "'"$TRACE_1_ID"'")' /tmp/debug-links.json

Next Steps​