Docs Integrations
LangGraph
Pass one callback handler to graph.invoke to record every model call, tool call and graph node, in TypeScript or Python. About five minutes.
Before you begin
- A Runback account and a Send only key. In the app, open Settings › Keys and access › API key, keep Send only selected, select Generate API key and copy it (it is shown once and starts
rb_cloud_). The quickstart walks through it. -
Node.js 20 or later (
node --version). Python 3.9 or later (python3 --version). - An OpenAI API key (the example uses
ChatOpenAI; any LangChain chat model works).
Steps
Install the SDK and LangGraph
terminalShell npm install @runback/sdk @langchain/core @langchain/langgraph @langchain/openai zodterminalShell pip install "runback-sdk[langgraph]" langchain-openaiExpected outputThe install finishes without errors.Set your keys
Runback reads its key from
RUNBACK_API_KEY; the model client reads its own.terminalShell export RUNBACK_API_KEY="<RUNBACK_API_KEY>" export OPENAI_API_KEY="sk-..."Expected outputNothing is printed.echo $RUNBACK_API_KEYshould print your key.Add the handler and run the graph
Create the handler and pass it in
callbackswhen you invoke the graph. Save this asgraph.mjsand runnode graph.mjsgraph.pyand runpython graph.py.graph.mjsJavaScript // graph.mjs: npm install @runback/sdk @langchain/core @langchain/langgraph @langchain/openai zod import { ChatOpenAI } from "@langchain/openai"; import { tool } from "@langchain/core/tools"; import { createReactAgent } from "@langchain/langgraph/prebuilt"; import { RunbackCallbackHandler } from "@runback/sdk/langgraph"; import { z } from "zod"; const getWeather = tool(async ({ city }) => `Sunny in ${city}`, { name: "get_weather", description: "Weather for a city", schema: z.object({ city: z.string() }), }); const graph = createReactAgent({ llm: new ChatOpenAI({ model: "gpt-4o-mini" }), tools: [getWeather] }); const input = { messages: [{ role: "user", content: "What's the weather in Paris?" }] }; const handler = new RunbackCallbackHandler({ runName: "weather-graph", input }); const out = await graph.invoke(input, { callbacks: [handler] }); await handler.finish({ output: out.messages.at(-1)?.content, status: "success" });graph.pyPython # graph.py: pip install "runback-sdk[langgraph]" langchain-openai from langchain_core.tools import tool from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent from runback import RunbackCallbackHandler @tool def get_weather(city: str) -> str: """Weather for a city.""" return f"Sunny in {city}" graph = create_react_agent(ChatOpenAI(model="gpt-4o-mini"), [get_weather]) inputs = {"messages": [("user", "What's the weather in Paris?")]} handler = RunbackCallbackHandler(run_name="weather-graph") result = graph.invoke(inputs, config={"callbacks": [handler]}) handler.finish()Expected outputThe graph's answer and no[runback]line. A[runback]line means the run was not sent; see Troubleshooting.Check the run arrived
Open Runs in the app. Your run is at the top, named
weather-graph. Open it to step through what the agent did.
Troubleshooting
| You see | What it means | Fix |
|---|---|---|
[runback] no RUNBACK_API_KEY set — dropped 3 events | The key is not set in the terminal you ran the agent from. | Export RUNBACK_API_KEY in the same terminal (a new tab starts without it), then run the agent again. |
[runback] ingest failed 401 {"error":"Invalid API key"} | Runback rejected the key: mistyped, revoked or expired. | Copy the whole key again, or create a new one in Settings › Keys and access › API key. |
OpenAIError: Missing credentials | OPENAI_API_KEY (or your provider's key) is not set. | Run the agent with the provider key set, e.g. OPENAI_API_KEY=sk-... node graph.mjs. |
Failed to load the ES module (Node 22+) or Cannot use import statement outside a module (Node 20) | The file is not treated as an ES module. | Name it .mjs, or add "type": "module" to package.json. |
| The agent ran, but the run is not in Runs | The key belongs to a different workspace, or you are looking at the shared demo. | Check the workspace name in the top right of the app is the one the key came from. |
Your agent never fails because of Runback: if recording fails, the model call still returns and Runback prints one [runback] line saying why.
| You see | What it means | Fix |
|---|---|---|
[runback] no RUNBACK_API_KEY set — dropped 3 events | The key is not set in the terminal you ran the agent from. | Export RUNBACK_API_KEY in the same terminal (a new tab starts without it), then run the agent again. |
[runback] ingest failed 401 {"error":"Invalid API key"} | Runback rejected the key: mistyped, revoked or expired. | Copy the whole key again, or create a new one in Settings › Keys and access › API key. |
ModuleNotFoundError: No module named 'runback' | The package went into a different Python environment. | Activate the virtual environment you installed into, or install with the same python you run the agent with: python -m pip install …. |
openai.OpenAIError: Missing credentials | OPENAI_API_KEY (or your provider's key) is not set. | Run the agent with the provider key set, e.g. OPENAI_API_KEY=sk-... python graph.py. |
| The agent ran, but the run is not in Runs | The key belongs to a different workspace, or you are looking at the shared demo. | Check the workspace name in the top right of the app is the one the key came from. |
Your agent never fails because of Runback: if recording fails, the model call still returns and Runback prints one [runback] line saying why.
What Runback records
Each chat-model call with the bound tools, tokens and latency; each tool call with its full output; each graph node as a step. In TypeScript, pass enforce: rules to the handler and a tool a rule stops never runs: the stop is recorded, and LangGraph's ToolNode hands the model an error instead. The Python handler records only; it cannot stop a tool.
RunbackCallbackHandler on a LangGraph agent, scripted model. 11 events, captured 9 Oct 2026.
Runstart · py-langgraph
{ "error": null, "input": "for [redacted:email]", "metadata": {}, "name": "py-langgraph", "output": null, "parent_span_id": null, "phase": "start", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 0, "span_id": "01M4G4WEN16Q1P5FVAG1Q833D5", "status": "running", "ts_end": null, "ts_start": "2026-10-09T10:56:00.161Z", "type": "run" }Modelgpt-4o-mini → get_weather
{ "error": null, "latency_ms": 109, "metadata": { "framework": "langgraph", "graph_node": { "name": "agent", "step": 1 } }, "model": { "model_id": "gpt-4o-mini", "provider": "openai-chat" }, "parent_span_id": "01a1204e-604a-7cf1-8169-b3acadaff64a", "request": { "messages": [ { "content": "Weather in Paris? cc [redacted:email]", "role": "user" } ], "params": {}, "system": "You are a weather bot.", "tools": [ { "description": "Weather for a city.", "name": "get_weather", "parameters": { "properties": { "city": { "type": "string" } }, "required": [ "city" ], "type": "object" } } ] }, "response": { "finish_reason": "tool_calls", "reasoning": null, "text": "", "tool_calls": [ { "input": { "city": "Paris" }, "tool_call_id": "call_11", "tool_name": "get_weather" } ] }, "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 1, "span_id": "01a1204e-604b-7872-9120-26a8397ac7f5", "ts_end": "2026-10-09T10:56:09.913Z", "ts_start": "2026-10-09T10:56:09.803Z", "type": "llm", "usage": { "input_tokens": 12, "output_tokens": 5, "total_tokens": 17 } }Steptools_condition
{ "label": "tools_condition", "parent_span_id": "01a1204e-604a-7cf1-8169-b3acadaff64a", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 2, "span_id": "01a1204e-60ba-76f3-b045-76dc4bd7a228", "text": "[tools_condition] tools", "ts_end": "2026-10-09T10:56:09.914Z", "ts_start": "2026-10-09T10:56:09.914Z", "type": "reasoning" }Stepagent
{ "graph_node": { "name": "agent", "step": 1 }, "label": "agent", "parent_span_id": "01a1204e-6042-74d0-9c3a-6fe30c129f79", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 3, "span_id": "01a1204e-604a-7cf1-8169-b3acadaff64a", "text": "[agent] {'messages': [AIMessage(content='', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 5, 'prompt_tokens': 12, 'total_tokens': 17, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'gpt-4o-mini', 'system_fingerprint': None, 'id': 'chatcmpl_12', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--01a1204e-604b-7872-9120-26a8397ac7f5-0', tool_calls=[{'name': 'get_weather', 'args': {'city': 'Paris'}, 'id': 'call_11', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 12, 'output_tokens': 5, 'total_tokens': 17, 'input_token_details': {}, 'output_token_details': {}})]}", "ts_end": "2026-10-09T10:56:09.914Z", "ts_start": "2026-10-09T10:56:09.802Z", "type": "reasoning" }Toolget_weather
{ "error": null, "input": { "city": "Paris" }, "latency_ms": 0, "output": { "city": "Paris", "detail": "sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, ", "hours": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 ] }, "parent_span_id": "01a1204e-60bb-7c42-a6ce-b8b6b4895464", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 4, "span_id": "01a1204e-60bc-7b80-b00a-2ab80a422f5d", "tool_call_id": "call_11", "tool_name": "get_weather", "ts_end": "2026-10-09T10:56:09.917Z", "ts_start": "2026-10-09T10:56:09.916Z", "type": "tool" }Steptools
{ "graph_node": { "name": "tools", "step": 2 }, "label": "tools", "parent_span_id": "01a1204e-6042-74d0-9c3a-6fe30c129f79", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 5, "span_id": "01a1204e-60bb-7c42-a6ce-b8b6b4895464", "text": "[tools] {'messages': [ToolMessage(content='{\"city\": \"Paris\", \"detail\": \"sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, …", "ts_end": "2026-10-09T10:56:09.919Z", "ts_start": "2026-10-09T10:56:09.915Z", "type": "reasoning" }Modelgpt-4o-mini
{ "error": null, "latency_ms": 4, "metadata": { "framework": "langgraph", "graph_node": { "name": "agent", "step": 3 } }, "model": { "model_id": "gpt-4o-mini", "provider": "openai-chat" }, "parent_span_id": "01a1204e-60bf-7e32-b2c9-a31d8661eaa0", "request": { "messages": [ { "content": "Weather in Paris? cc [redacted:email]", "role": "user" }, { "content": [ { "input": { "city": "Paris" }, "toolCallId": "call_11", "toolName": "get_weather", "type": "tool-call" } ], "role": "assistant" }, { "content": [ { "output": { "city": "Paris", "detail": "sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, ", "hours": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 ] }, "toolCallId": "call_11", "type": "tool-result" } ], "role": "tool" } ], "params": {}, "system": "You are a weather bot.", "tools": [ { "description": "Weather for a city.", "name": "get_weather", "parameters": { "properties": { "city": { "type": "string" } }, "required": [ "city" ], "type": "object" } } ] }, "response": { "finish_reason": "stop", "reasoning": null, "text": "It is sunny in Paris.", "tool_calls": [] }, "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 6, "span_id": "01a1204e-60c0-79b0-9e5e-4c95ce6ead36", "ts_end": "2026-10-09T10:56:09.924Z", "ts_start": "2026-10-09T10:56:09.920Z", "type": "llm", "usage": { "input_tokens": 20, "output_tokens": 8, "total_tokens": 28 } }Steptools_condition
{ "label": "tools_condition", "parent_span_id": "01a1204e-60bf-7e32-b2c9-a31d8661eaa0", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 7, "span_id": "01a1204e-60c5-7293-9e62-b3fd80357313", "text": "[tools_condition] __end__", "ts_end": "2026-10-09T10:56:09.926Z", "ts_start": "2026-10-09T10:56:09.925Z", "type": "reasoning" }Stepagent
{ "graph_node": { "name": "agent", "step": 3 }, "label": "agent", "parent_span_id": "01a1204e-6042-74d0-9c3a-6fe30c129f79", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 8, "span_id": "01a1204e-60bf-7e32-b2c9-a31d8661eaa0", "text": "[agent] {'messages': [AIMessage(content='It is sunny in Paris.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 8, 'prompt_tokens': 20, 'total_tokens': 28, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'gpt-4o-mini', 'system_fingerprint': None, 'id': 'chatcmpl_13', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--01a1204e-60c0-79b0-9e5e-4c95ce6ead36-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 20, 'output_tokens': 8, 'total_tokens': 28, 'input_token_details': {}, 'output_token_details': {}})]}", "ts_end": "2026-10-09T10:56:09.926Z", "ts_start": "2026-10-09T10:56:09.919Z", "type": "reasoning" }StepLangGraph
{ "label": "LangGraph", "parent_span_id": "01M4G4WEN16Q1P5FVAG1Q833D5", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 9, "span_id": "01a1204e-6042-74d0-9c3a-6fe30c129f79", "text": "[LangGraph] {'messages': [SystemMessage(content='You are a weather bot.', additional_kwargs={}, response_metadata={}, id='d28b1689-3c0b-42d9-8ebd-d76623b001fb'), HumanMessage(content='Weather in Paris? cc [redacted:email]', additional_kwargs={}, response_metadata={}, id='5c5ab331-a47f-4803-85bb-9c03ea30c86f'), AIMessage(content='', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 5, 'prompt_tokens': 12, 'total_tokens': 17, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'gpt-4o-mini', 'system_fingerprint': None, 'id': 'chatcmpl_12', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--01a1204e-604b-7872-9120-26a8397ac7f5-0', tool_calls=[{'name': 'get_weather', 'args': {'city': 'Paris'}, 'id': 'call_11', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 12, 'output_tokens': 5, 'total_tokens': 17, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content='{\"city\": \"Paris\", \"detail\": \"sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny and warm, sunny an…", "ts_end": "2026-10-09T10:56:09.926Z", "ts_start": "2026-10-09T10:56:09.794Z", "type": "reasoning" }Runend · py-langgraph
{ "error": null, "input": null, "metadata": { "cassette_digest": "35856309948c71c407b67a05f3c9d3dcd3e3087cf17092389dde3095fc77aabf", "cassette_entries": 3, "redaction_by_type": { "email": 4 }, "redaction_count": 4 }, "name": "py-langgraph", "output": "It is sunny in Paris.", "parent_span_id": "01M4G4WEN16Q1P5FVAG1Q833D5", "phase": "end", "run_id": "01M4G4WEN16Q1P5FVAG1Q833D4", "schema_version": 1, "seq": 10, "span_id": "01M4G4WR67BDA9P957YSW2CZH2", "status": "success", "ts_end": "2026-10-09T10:56:09.927Z", "ts_start": "2026-10-09T10:56:09.927Z", "type": "run" }
The events this integration really sent, redacted in its own process, from a run in Runback's test suite. The model is scripted, so its name and its answers are the test's. The suite re-checks them on every change.
RunbackCallbackHandler on a LangGraph ReAct agent, scripted model. 8 events, captured 2 Nov 2026.
Runstart · weather-graph
{ "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6A8RNH9NT4H6MTCW79H", "parent_span_id": null, "seq": 0, "ts_start": "2026-11-02T06:17:44.521Z", "ts_end": null, "type": "run", "phase": "start", "name": "weather-graph", "input": { "messages": [ { "role": "user", "content": "What's the weather in Paris? cc [redacted:email]" } ] }, "output": null, "status": "running", "error": null, "metadata": {} }Modelgpt-4o-mini → get_weather
{ "ts_start": "2026-11-02T06:17:44.542Z", "ts_end": "2026-11-02T06:17:44.545Z", "model": { "provider": "openai", "model_id": "gpt-4o-mini" }, "request": { "system": null, "messages": [ { "role": "user", "content": "What's the weather in Paris? cc [redacted:email]" } ], "tools": [ { "name": "get_weather", "description": "Weather for a city", "parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": [ "city" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } } ], "params": {} }, "response": { "text": "", "reasoning": null, "finish_reason": "tool_calls", "tool_calls": [ { "tool_call_id": "call_1", "tool_name": "get_weather", "input": { "city": "Paris" } } ] }, "usage": { "input_tokens": 12, "output_tokens": 5, "total_tokens": 17 }, "latency_ms": 3, "error": null, "metadata": { "framework": "langgraph", "graph_node": { "name": "agent", "step": 1 } }, "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6B12FX3N4A1ZVRPH59Y", "parent_span_id": "01M6DEG6A8RNH9NT4H6MTCW79H", "seq": 1, "type": "llm" }Stepagent
{ "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6B34KEBCEFJCB2DB5YH", "parent_span_id": "01M6DEG6B12FX3N4A1ZVRPH59Y", "seq": 2, "ts_start": "2026-11-02T06:17:44.536Z", "ts_end": "2026-11-02T06:17:44.547Z", "type": "reasoning", "text": "[node] agent", "label": "node", "graph_node": { "name": "agent", "step": 1 } }Toolget_weather
{ "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6B50KRZ1B0V6GVXQJYK", "parent_span_id": "01M6DEG6B12FX3N4A1ZVRPH59Y", "seq": 3, "ts_start": "2026-11-02T06:17:44.548Z", "ts_end": "2026-11-02T06:17:44.549Z", "type": "tool", "tool_name": "get_weather", "tool_call_id": "call_1", "input": { "city": "Paris" }, "output": "Sunny in Paris", "latency_ms": 1, "error": null }Steptools
{ "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6B5XA8VPS1MZ5TYEG8S", "parent_span_id": "01M6DEG6B12FX3N4A1ZVRPH59Y", "seq": 4, "ts_start": "2026-11-02T06:17:44.548Z", "ts_end": "2026-11-02T06:17:44.549Z", "type": "reasoning", "text": "[node] tools", "label": "node", "graph_node": { "name": "tools", "step": 2 } }Modelgpt-4o-mini
{ "ts_start": "2026-11-02T06:17:44.551Z", "ts_end": "2026-11-02T06:17:44.551Z", "model": { "provider": "openai", "model_id": "gpt-4o-mini" }, "request": { "system": null, "messages": [ { "role": "user", "content": "What's the weather in Paris? cc [redacted:email]" }, { "role": "assistant", "content": [ { "type": "tool-call", "toolCallId": "call_1", "toolName": "get_weather", "input": { "city": "Paris" } } ] }, { "role": "tool", "content": [ { "type": "tool-result", "toolCallId": "call_1", "output": "Sunny in Paris" } ] } ], "tools": [ { "name": "get_weather", "description": "Weather for a city", "parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": [ "city" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } } ], "params": {} }, "response": { "text": "It is sunny in Paris.", "reasoning": null, "finish_reason": "stop", "tool_calls": [] }, "usage": { "input_tokens": 20, "output_tokens": 8, "total_tokens": 28 }, "latency_ms": 0, "error": null, "metadata": { "framework": "langgraph", "graph_node": { "name": "agent", "step": 3 } }, "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6B7M1E3P8PSBCYAWG45", "parent_span_id": "01M6DEG6A8RNH9NT4H6MTCW79H", "seq": 5, "type": "llm" }Stepagent
{ "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6B942D0G3XAQE7823D2", "parent_span_id": "01M6DEG6B7M1E3P8PSBCYAWG45", "seq": 6, "ts_start": "2026-11-02T06:17:44.550Z", "ts_end": "2026-11-02T06:17:44.553Z", "type": "reasoning", "text": "[node] agent", "label": "node", "graph_node": { "name": "agent", "step": 3 } }Runend · weather-graph
{ "schema_version": 1, "run_id": "01M6DEG6A8JT0M6CX40JJDXJW5", "span_id": "01M6DEG6BC42AJCQG7GSR67YR3", "parent_span_id": "01M6DEG6A8RNH9NT4H6MTCW79H", "seq": 7, "ts_start": "2026-11-02T06:17:44.556Z", "ts_end": "2026-11-02T06:17:44.556Z", "type": "run", "phase": "end", "name": "weather-graph", "input": null, "output": "It is sunny in Paris.", "status": "success", "error": null, "metadata": { "cassette_digest": "a126a279f4c4a8bbe6585c69ee988f1ab9f433c3013b830a7a8541da2e0197fd", "cassette_entries": 3, "redaction_count": 3, "redaction_by_type": { "email": 3 }, "truncated_fields": 0 } }
The events this integration really sent, redacted in its own process, from a run in Runback's test suite. The model is scripted, so its name and its answers are the test's. The suite re-checks them on every change.
What it can and cannot do
LangGraph (Python). Rows marked TypeScript are the TypeScript handler's.
| Question | Answer | Why |
|---|---|---|
| Context | Full | Node identity, execution order, system prompt and bound tools. |
| Tool steps | Full | Input, full output, latency and errors. |
| Redaction | In your process | On by default. |
| Stop before it runs | NoYes (TypeScript) | The Python handler records; it doesn't enforce policy.Pass enforce: rules to the handler. A stopped tool never runs; LangGraph's ToolNode hands the model an error instead. |
| Replay | Re-issue only | A model step can be re-sent to a live model. The whole run can't be re-run with the same tool results: they aren't kept. |
| Signed record | Yes | Each run is hash-chained and can be exported as a signed record. |