Docs menuLangGraph

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

  1. Install the SDK and LangGraph

    terminalShell
    npm install @runback/sdk @langchain/core @langchain/langgraph @langchain/openai zod
    terminalShell
    pip install "runback-sdk[langgraph]" langchain-openai
    Expected output
    The install finishes without errors.
  2. 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 output
    Nothing is printed. echo $RUNBACK_API_KEY should print your key.
  3. Add the handler and run the graph

    Create the handler and pass it in callbacks when you invoke the graph. Save this as graph.mjs and run node graph.mjsgraph.py and run python 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 output
    The graph's answer and no [runback] line. A [runback] line means the run was not sent; see Troubleshooting.
  4. 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 seeWhat it meansFix
[runback] no RUNBACK_API_KEY set — dropped 3 eventsThe 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 credentialsOPENAI_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 RunsThe 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 seeWhat it meansFix
[runback] no RUNBACK_API_KEY set — dropped 3 eventsThe 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 credentialsOPENAI_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 RunsThe 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.

  1. 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"
    }
  2. Modelgpt-4o-mini → get_weather17 tokens · 109 ms · called a tool
    {
      "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
      }
    }
  3. 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"
    }
  4. 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"
    }
  5. 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"
    }
  6. 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"
    }
  7. Modelgpt-4o-mini28 tokens · 4 ms · finished
    {
      "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
      }
    }
  8. 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"
    }
  9. 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"
    }
  10. 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"
    }
  11. Runend · py-langgraphsucceeded
    {
      "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.

  1. 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": {}
    }
  2. Modelgpt-4o-mini → get_weather17 tokens · 3 ms · called a tool
    {
      "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"
    }
  3. 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
      }
    }
  4. Toolget_weather1 ms
    {
      "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
    }
  5. 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
      }
    }
  6. Modelgpt-4o-mini28 tokens · finished
    {
      "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"
    }
  7. 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
      }
    }
  8. Runend · weather-graphsucceeded
    {
      "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.

QuestionAnswerWhy
ContextFullNode identity, execution order, system prompt and bound tools.
Tool stepsFullInput, full output, latency and errors.
RedactionIn your processOn by default.
Stop before it runsNoYes (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.
ReplayRe-issue onlyA 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 recordYesEach run is hash-chained and can be exported as a signed record.

Next steps

  • See what a run holds: Capture.
  • Stop a risky tool call before it runs: Control.
Last updated 2 Nov 2026.