litellm/scripts/lens_assets/fixtures/traces/deepagents_simple.json
moe-berri 22ad3c5fff
refactor(lens): connect LiteLLM to the independent Lens service (#45529)
* feat(lens): consume the independent Lens service and shared UI

* fix(lens): keep embedded setup stable and vendor UI before builds

* chore(lens): pin embedded UI provenance to published Lens source

* fix(lens): complete embedded UI extraction across CI builds

* docs(lens): record latest main and removal-boundary validation

* fix(lens): wire external chart credentials and ingestion modes

* test(lens): cover adapter failures and fix extraction CI

* docs(lens): refresh bundled chart setup instructions

* test(lens): restore gateway adapter test package marker

* build(lens): pin clean-cut UI and supported storage chart

* test(ui): await guardrail scope menu before checking options

* perf(lens): omit unused trace-team lookup from product requests

* docs(lens): record final-image adapter permission checks

* test(lens): assert delegated investigation authorization

* refactor(lens): remove copied trace runtime and preserve spend logging

* test(lens): verify independent gateway image upgrades and outages

* test(lens): pin the chart qualification database image

* fix(lens): update embedded UI metadata filters

* test: wait for Lens chart pod identity convergence

* fix(e2e): select Lens chart pods by deployment ownership

* fix(e2e): select Helm migration ownership for Lens upgrades

* test(lens): retain migration Jobs through rollout assertions

* docs(helm): require existing database for migration hooks

* test(lens): qualify release boundaries with embedded navigation update

* docs(lens): record browser qualification for embedded tabs

* fix(lens): remove unrelated CI and guardrail test changes

* test(lens): give qualification tenants unique key aliases

* feat(lens): embed the latest canonical Lens interface

* fix(lens): qualify split inference through the gateway

* fix(lens): preserve scoped auth and isolate delegated credentials

* chore(lens): remove unrelated documentation and lint changes

* fix(lens): bound concurrent forwarding buffers through response delivery

* fix(lens): preserve OAuth2 dispatch without inference policies

* chore(lens): adopt current shared onboarding UI

* fix(lens): refresh shared setup UI and review context

* fix(lens): bound uploads before gateway authentication

* docs(lens): remove extraction evidence from the gateway repo

* docs(lens): refresh shared setup prompt for paired releases
2026-10-09 16:17:05 -07:00

403 lines
49 KiB
JSON

{
"resourceSpans": [
{
"resource": {
"attributes": [
{
"key": "telemetry.sdk.language",
"value": {
"stringValue": "python"
}
},
{
"key": "telemetry.sdk.name",
"value": {
"stringValue": "opentelemetry"
}
},
{
"key": "telemetry.sdk.version",
"value": {
"stringValue": "1.45.0"
}
},
{
"key": "service.instance.id",
"value": {
"stringValue": "bb9a5828-a214-49e6-ad30-3272c76d1ac4"
}
},
{
"key": "telemetry.auto.version",
"value": {
"stringValue": "0.66b0"
}
},
{
"key": "service.name",
"value": {
"stringValue": "unknown_service:python3"
}
}
]
},
"scopeSpans": [
{
"scope": {
"name": "openinference.instrumentation.langchain",
"version": "0.1.78"
},
"spans": [
{
"traceId": "f4186abf7a7c72775ff23cf3b843d260",
"spanId": "c549ef07a22735bd",
"parentSpanId": "5bbb6a7a2cd23019",
"name": "PatchToolCallsMiddleware.before_agent",
"kind": 1,
"startTimeUnixNano": "1791061316849356800",
"endTimeUnixNano": "1791061316849515008",
"attributes": [
{
"key": "output.value",
"value": {
"stringValue": "null"
}
},
{
"key": "metadata",
"value": {
"stringValue": "{\"ls_integration\": \"deepagents\", \"lc_agent_name\": \"research_agent\", \"lc_versions\": {\"deepagents\": \"0.7.21\"}, \"langgraph_step\": 1, \"langgraph_node\": \"PatchToolCallsMiddleware.before_agent\", \"langgraph_triggers\": [\"branch:to:PatchToolCallsMiddleware.before_agent\"], \"langgraph_path\": [\"__pregel_pull\", \"PatchToolCallsMiddleware.before_agent\"], \"langgraph_checkpoint_ns\": \"PatchToolCallsMiddleware.before_agent:b604663c-6ac0-dd9e-e1eb-42ae1c11973f\"}"
}
},
{
"key": "openinference.span.kind",
"value": {
"stringValue": "AGENT"
}
}
],
"status": {
"code": 1
},
"flags": 256
},
{
"traceId": "f4186abf7a7c72775ff23cf3b843d260",
"spanId": "5cb5b0adf6820736",
"parentSpanId": "b7dac413027ac08c",
"name": "ChatOpenAI",
"kind": 1,
"startTimeUnixNano": "1791061316853681920",
"endTimeUnixNano": "1791061320696200960",
"attributes": [
{
"key": "input.value",
"value": {
"stringValue": "{\"messages\": [[{\"lc\": 1, \"type\": \"constructor\", \"id\": [\"langchain\", \"schema\", \"messages\", \"SystemMessage\"], \"kwargs\": {\"content\": \"\", \"type\": \"system\"}}, {\"lc\": 1, \"type\": \"constructor\", \"id\": [\"langchain\", \"schema\", \"messages\", \"HumanMessage\"], \"kwargs\": {\"content\": \"What is an agent trace?\", \"type\": \"human\", \"id\": \"527c715b-7af7-4368-802f-e08f238cc315\"}}]]}"
}
},
{
"key": "input.mime_type",
"value": {
"stringValue": "application/json"
}
},
{
"key": "output.value",
"value": {
"stringValue": "{\"generations\": [[{\"text\": \"An **agent trace** is a record of an AI agent\u2019s run: the steps it took from a request to a result. It commonly includes the messages it received, actions or tool calls it made, tool responses, and the final output\u2014often with timestamps and errors.\\n\\nTraces help people debug, evaluate, and understand an agent\u2019s behavior. They show the observable sequence of events, not necessarily the model\u2019s private reasoning.\", \"generation_info\": null, \"type\": \"ChatGeneration\", \"message\": {\"lc\": 1, \"type\": \"constructor\", \"id\": [\"langchain\", \"schema\", \"messages\", \"AIMessage\"], \"kwargs\": {\"content\": [{\"id\": \"rs_05e5d44b09fe0f10006ac16d45a92487d0842ce0adbba226df\", \"summary\": [], \"type\": \"reasoning\", \"content\": [], \"encrypted_content\": \"gAAAAABqwW1IiM8ZHSPBlFmixN4sgD9eCCnq9SYBCSPQzidkd7uHOEtiQUQrukphZGR6JBcON88FvjudIDhWGcKNNxIprZbz1FB1cPHDpwOb01jUpI8_Himmi0QDUpMyR7UtjtMaqzo7hwzRNKxrqYLxDfOSGMdT0dPPEztXjSD2jFRPejs1GKEQXscKW1X6dyv9-wGRUUfEi9Teiwnpl2Hv-BvhMALK7sFl3PevB4zzJn_qx76av8kTB7Te7Y7anWGt4asP7j_O0DcPnm9ucxslWSRjuBDDOwTlfISI0pPST399Dz60QtVAZtUgz-qLiIv8wVIoD6rwOXl84VtG86Vx8BQUXwoWrJWYgLwAxlqoO7M9LAlanDnfIoOKI5J_E1bdQGqShkODpcnfKT2_fOac45gfrqY-DZls3UFlBiDGx95RQAvvPYXtRZGjR4lVOps-lrrJXDXgoCCSj03blmQDPmKpWhBOiZoibm4_8WgFesxroCdwjoZUdf6CJ4FqNpnjoESB6O26NQjehWBBWPP_mCuS0QRoM7CsXFGHIMlLkA8qfE0O3fcOM_gE6d7wSjZpC_1-WCkk87PkyOXkKD6SinnTyCQqseKvBQSIn21qMcQ37F-JKT9UsEDPYQs7UegQJSnmGozJ-c1UCRvewnsmYCqriRcvmq5XgBufH_FuVGAs4fdCSELdnwVTNpUgho1bM-vqSyeWAT6DVqTRi6bg-sp5vLCkoJEHOQHd7K6X9AiJhNC2GrNaold-Y168mAh4ZlNTR1ebwMxX0C4ioJwg6Gm_y_rIkmRFcfSUuahntXqRtHpk9PM0MhaEFLImuADz0f1OfMeUlMEsY3jY7u6pt47_aotoyKREhKSctlmbvF9Mc97OqWOaO9JAx5OHsPZrI9rFg1GkFdc7cvpK8dke1rzBbSMYxR_uxtzvTg7ATgpO5khyyltq7A63c5yVTs_1E_WMSp6-61lkfvCDMrwcu4-6FuHVYfMZl2HfhZfDo_GPviFBl4zKD2iq8PvjhjcCwKv7XOQfTbj_PF-bYeiVBB_vwboax9yF7MkNJB5kxIfrank9A6i9jFvhmhlDvaxNdoOh9HMa_tkucrolGt3pe_xqCvgfqg03Os2ZvwLNWu6GD67fxtq8H29PeEici8ywOnWuyODeDIN81a3gki0EQCz8TjRSYT4ikbiR1_n7wfdZH1Sb50wexRDUo7cl1ZcHdrhylDj2xRDXL5MrNwCVRYp6sQj3h8l1kQoYrJTgl1vI4A1P_ubnIGHDxGe1juMu6VDH6t6tOgIWViuYMt0N2xiPOMBK-N4w3X156LkgZWmV-Z1dhzeGuFxUl6iPYO9g1dbB8KnOf18XI40poByKcv_E67zZx-eO5CLcN2KWPLkBF0Mx5FnqaYGiYrvR9pHNBeepjJq3BfgEm5Pt2Wm6HUjHkemesYijBdRVONUmu_M3klFoA-7z3hIdDbp2dpx1zcz4Hxa7Kk40WucYZHz1_biMhaeCKV6u-Li5xaIkHJoRfahbRp2J839ohKQ4AnWGb7dTqNZ7rwOC4KYdE9pCjlFnAB0rrYxz-MJjQzzTCl7xKFQy4hxXYHFGSbAfqvFYr7qPK4EDGKCdJVSW21IBiybSHmHnObbwtQRbTCtt4JaLUYrrOz0=\"}, {\"type\": \"text\", \"text\": \"An **agent trace** is a record of an AI agent\u2019s run: the steps it took from a request to a result. It commonly includes the messages it received, actions or tool calls it made, tool responses, and the final output\u2014often with timestamps and errors.\\n\\nTraces help people debug, evaluate, and understand an agent\u2019s behavior. They show the observable sequence of events, not necessarily the model\u2019s private reasoning.\", \"annotations\": [], \"id\": \"msg_05e5d44b09fe0f10006ac16d467af887d0bb54de149a82fae4\", \"phase\": \"final_answer\"}], \"response_metadata\": {\"id\": \"resp_meLQFnIN19A9gV6IpErXPP376KOMVFwkXKET6ifFVY_INxGhgnY-PCYYBgnq_njGDlEXr4DAaM2OP6Jw8e-JQm_kuACo_4BvMCURCx_Qp1vMcP8hKHG2HnMBvpUgdcZAz1LUCQLaZR-ZYqkrCa8WFIPbj3ZnVCMM_4EcEWrKzy-UiYrmP7MRkDIVd-Rqno3yEMNAbfb1Vc9k2IDRQRlWvtbJpqboGxLWiyEdn19Nqadcxg_cQGZc3m6YtLSBivg1pN4QaOU4RMVoq178_3cWC7TA8wKesxYSwxo7KWiEcO9gCRcgAwnEV3MQqK-6VKCtH1KStBklsLSEvLQTluasM0K87m_roMpThDi7buKq9wFyIcz8AIfP0--hUer4lJo2eQjxRkYthUtFNN5ymDyzs2bwt5bkG7Ta-yJmbWARVfBejowl6CXMiZ0Fz_PVy_2C7ms9xwbcPLztBriX1jpyqABC\", \"created_at\": 1791061317.0, \"metadata\": {}, \"model\": \"openai/gpt-6-luna\", \"object\": \"response\", \"service_tier\": \"default\", \"status\": \"completed\", \"model_provider\": \"openai\", \"model_name\": \"openai/gpt-6-luna\"}, \"type\": \"ai\", \"id\": \"resp_meLQFnIN19A9gV6IpErXPP376KOMVFwkXKET6ifFVY_INxGhgnY-PCYYBgnq_njGDlEXr4DAaM2OP6Jw8e-JQm_kuACo_4BvMCURCx_Qp1vMcP8hKHG2HnMBvpUgdcZAz1LUCQLaZR-ZYqkrCa8WFIPbj3ZnVCMM_4EcEWrKzy-UiYrmP7MRkDIVd-Rqno3yEMNAbfb1Vc9k2IDRQRlWvtbJpqboGxLWiyEdn19Nqadcxg_cQGZc3m6YtLSBivg1pN4QaOU4RMVoq178_3cWC7TA8wKesxYSwxo7KWiEcO9gCRcgAwnEV3MQqK-6VKCtH1KStBklsLSEvLQTluasM0K87m_roMpThDi7buKq9wFyIcz8AIfP0--hUer4lJo2eQjxRkYthUtFNN5ymDyzs2bwt5bkG7Ta-yJmbWARVfBejowl6CXMiZ0Fz_PVy_2C7ms9xwbcPLztBriX1jpyqABC\", \"usage_metadata\": {\"input_tokens\": 1975, \"output_tokens\": 160, \"total_tokens\": 2135, \"input_token_details\": {\"cache_creation\": 1972, \"cache_read\": 0}, \"output_token_details\": {\"reasoning\": 68}}, \"tool_calls\": [], \"invalid_tool_calls\": []}}}]], \"llm_output\": null, \"run\": null, \"type\": \"LLMResult\"}"
}
},
{
"key": "output.mime_type",
"value": {
"stringValue": "application/json"
}
},
{
"key": "llm.input_messages.0.message.role",
"value": {
"stringValue": "system"
}
},
{
"key": "llm.input_messages.1.message.role",
"value": {
"stringValue": "user"
}
},
{
"key": "llm.input_messages.1.message.content",
"value": {
"stringValue": "What is an agent trace?"
}
},
{
"key": "llm.output_messages.0.message.role",
"value": {
"stringValue": "assistant"
}
},
{
"key": "llm.output_messages.0.message.contents.1.message_content.type",
"value": {
"stringValue": "text"
}
},
{
"key": "llm.output_messages.0.message.contents.1.message_content.text",
"value": {
"stringValue": "An **agent trace** is a record of an AI agent\u2019s run: the steps it took from a request to a result. It commonly includes the messages it received, actions or tool calls it made, tool responses, and the final output\u2014often with timestamps and errors.\n\nTraces help people debug, evaluate, and understand an agent\u2019s behavior. They show the observable sequence of events, not necessarily the model\u2019s private reasoning."
}
},
{
"key": "llm.invocation_parameters",
"value": {
"stringValue": "{\"model\": \"openai/gpt-6-luna\", \"model_name\": \"openai/gpt-6-luna\", \"stream\": false, \"_type\": \"openai-chat\", \"stop\": null, \"tools\": [{\"type\": \"function\", \"function\": {\"name\": \"ls\", \"description\": \"Lists all files in a directory.\\n\\nThis is useful for exploring the filesystem and finding the right file to read or edit.\\nYou should almost ALWAYS use this tool before using the read_file or edit_file tools.\", \"parameters\": {\"properties\": {\"path\": {\"description\": \"Absolute path to the directory to list. Must be absolute, not relative.\", \"type\": \"string\"}}, \"required\": [\"path\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"read_file\", \"description\": \"Reads a file from the filesystem. Assume any path the user provides is valid; reading a missing file returns an error.\\n\\nUsage:\\n- By default, it reads up to 100 lines starting from the beginning of the file. Use `offset`/`limit` to page through large files instead of reading them whole.\\n- A status header, `@@ field | field | ... @@`, sits above the file content, and every line after it is verbatim file content. When content is truncated, there may be an explanation before the header. Never include the header when editing.\\n- Speculatively batch multiple `read_file` calls in one response when several files may be useful.\\n- An empty file returns a system-reminder warning in place of contents.\\n- Large tool results may be offloaded to a file; the tool message gives the path. Read that path here, paging with `offset`/`limit`.\\n- Images (`.png`, `.jpg`, etc.), audio, video, and PDFs return multimodal content blocks (https://docs.langchain.com/oss/python/langchain/messages#multimodal).\\n- For images and PDFs, pagination via `offset`/`limit` is text-only - supply `file_path` only\\n- Always read a file before editing it.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path to the file to read. Must be absolute, not relative.\", \"type\": \"string\"}, \"offset\": {\"default\": 0, \"description\": \"Line number to start reading from (0-indexed). Use for pagination of large files.\", \"type\": \"integer\"}, \"limit\": {\"default\": 100, \"description\": \"Maximum number of lines to read. Use for pagination of large files.\", \"type\": \"integer\"}}, \"required\": [\"file_path\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"write_file\", \"description\": \"Writes content to a file. Creates the file if it does not exist; replaces it entirely if it does.\\n\\nUsage:\\n- Use this tool when you intend to create a new file or replace the whole file. You do not need to read the file first.\\n- Prefer to edit existing files (with the edit_file tool) over creating new ones when possible.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path where the file should be written. Must be absolute, not relative.\", \"type\": \"string\"}, \"content\": {\"description\": \"The text content to write to the file. This parameter is required.\", \"type\": \"string\"}}, \"required\": [\"file_path\", \"content\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"edit_file\", \"description\": \"Performs exact string replacements in files.\\n\\nUsage:\\n- You must read the file before editing; this tool errors otherwise.\\n- Preserve the exact source indentation from the read output, and never include the read status header in old_string or new_string.\\n- Prefer editing an existing file over creating a new one.\\n- Only use emojis if the user explicitly requests it.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path to the file to edit. Must be absolute, not relative.\", \"type\": \"string\"}, \"old_string\": {\"description\": \"The exact text to find and replace. Must be unique in the file unless replace_all is True.\", \"type\": \"string\"}, \"new_string\": {\"description\": \"The text to replace old_string with. Must be different from old_string.\", \"type\": \"string\"}, \"replace_all\": {\"default\": false, \"description\": \"If True, replace all occurrences of old_string. If False (default), old_string must be unique.\", \"type\": \"boolean\"}}, \"required\": [\"file_path\", \"old_string\", \"new_string\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"delete\", \"description\": \"Deletes a file or directory from the filesystem.\\n\\nUsage:\\n- Permanently removes the file or directory at the given absolute path.\\n- Deleting a directory removes it and everything inside it, recursively. Prefer\\n deleting a directory in one call over deleting each file individually.\\n- This cannot be undone, so only delete paths you are sure are no longer needed.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path to the file to delete. Must be absolute, not relative.\", \"type\": \"string\"}}, \"required\": [\"file_path\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"glob\", \"description\": \"Find files matching a glob pattern, returning absolute paths.\\n\\nSupports `*` (any characters within a path segment), `**` (any directories), `?` (single character), `[abc]` (one character from a set), and `{a,b}` (alternatives), e.g. `*.py`, `src/**/*.py`, `*.{yml,yaml}`.\\n\\nA pattern without `/` matches the file name at any depth under the search root (`*.py` matches `src/app/main.py`). A pattern containing `/` matches the search-root-relative path (`src/**/*.py`). A leading `/` anchors to the search root (`/*.py` matches only top-level Python files).\\n\\nLeading-dot names are only matched when the pattern segment itself starts with `.` (use `.env`, or `.github/**/*.yml`). Because `**` will not descend into dot-directories, the bare form `*.yml` is *broader* than `**/*.yml` and is usually what you want.\", \"parameters\": {\"properties\": {\"pattern\": {\"description\": \"Glob pattern to match files (e.g., '*.py', '**/*.py', '/subdir/**/*.md'). A pattern without '/' matches the file name at any depth; a pattern containing '/' matches the search-root-relative path; a leading '/' anchors to the search root ('/*.py' matches only top-level files). Leading-dot names are excluded unless the pattern segment starts with '.', so prefer the bare form '*.py' over '**/*.py' -- '**' will not descend into dot-directories like '.github'.\", \"type\": \"string\"}, \"path\": {\"anyOf\": [{\"type\": \"string\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Base directory to search from. Defaults to the backend's default root.\"}}, \"required\": [\"pattern\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"grep\", \"description\": \"Search for a LITERAL text pattern across files (NOT regex).\\n\\nThe pattern is matched verbatim: regex metacharacters are ordinary characters, not operators. To match any of several strings, run a separate grep for each; `grep(pattern=\\\"foo|bar\\\")` searches for the literal text \\\"foo|bar\\\", and `.*` or `\\\\.` match those characters literally.\\n\\nReturns matching files or content per `output_mode`. Offloaded large tool results live under the artifacts root (`/large_tool_results/` by default); grep that directory to search them when you do not know the exact path.\", \"parameters\": {\"properties\": {\"pattern\": {\"description\": \"Text pattern to search for (literal string, not regex).\", \"type\": \"string\"}, \"path\": {\"anyOf\": [{\"type\": \"string\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Directory to search in. Defaults to current working directory.\"}, \"glob\": {\"anyOf\": [{\"type\": \"string\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Glob pattern (NOT regex) limiting which files are searched (e.g. '*.py', '*.ts'). A pattern without '/' matches the file name at any depth; a pattern containing '/' matches the search-root-relative path (e.g. 'src/**/*.py'). This is an in-tool file filter, not a call to the separate glob tool. Brace expansion (e.g. '*.{ts,tsx}') is not supported on all backends; run a separate search per extension for reliable results.\"}, \"output_mode\": {\"default\": \"files_with_matches\", \"description\": \"Shape of the returned text. 'files_with_matches' (default): newline-separated matching file paths. 'content': matching lines grouped by file under a '<path>:' header, each line indented and formatted '<line_number>: <line text>' (only the matched line, no surrounding context). 'count': one '<path>: <match_count>' line per file.\", \"enum\": [\"files_with_matches\", \"content\", \"count\"], \"type\": \"string\"}, \"max_count\": {\"anyOf\": [{\"exclusiveMinimum\": 0, \"type\": \"integer\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Optional cap on the total number of matches returned across all files. Leave unset to use the configured default. When the cap is hit, results are truncated and a note says so; narrow the pattern or path to see the rest.\"}}, \"required\": [\"pattern\"], \"type\": \"object\"}}}, {\"type\": \"function\", \"function\": {\"name\": \"task\", \"description\": \"Launch an ephemeral subagent to handle a complex, multi-step task.\\n\\nAvailable agent types and the tools they have access to:\\n- general-purpose: General-purpose agent for researching complex questions, searching for files and content, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you. This agent has access to all tools as the main agent.\\n\\nSpecify subagent_type to select the agent. Usage notes:\\n- Launch multiple agents concurrently when their tasks are independent, using a single message with multiple tool calls.\\n- Each invocation is stateless by default: the agent sees only the prompt you give it and returns a single final report. Put full detail in the prompt and state exactly what it should return \u2014 unless an agent type below says it inherits your conversation instead.\\n- The agent's report is not shown to the user; relay a summary yourself.\\n- Tell the agent whether to create content, analyze, or only research, since it can't necessarily see the user's intent unless it inherits your conversation, as noted per agent type below.\\n- If an agent's description says to use it proactively, do so without waiting to be asked.\\n- When only general-purpose is available, use it for any complex, context-heavy task; it has the same capabilities as the main agent.\", \"parameters\": {\"properties\": {\"description\": {\"description\": \"A detailed description of the task for the subagent to perform autonomously. Include all necessary context and specify the expected output format.\", \"type\": \"string\"}, \"subagent_type\": {\"description\": \"The type of subagent to use. Must be one of the available agent types listed in the tool description.\", \"type\": \"string\"}}, \"required\": [\"description\", \"subagent_type\"], \"type\": \"object\"}}}]}"
}
},
{
"key": "llm.tools.0.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"ls\", \"description\": \"Lists all files in a directory.\\n\\nThis is useful for exploring the filesystem and finding the right file to read or edit.\\nYou should almost ALWAYS use this tool before using the read_file or edit_file tools.\", \"parameters\": {\"properties\": {\"path\": {\"description\": \"Absolute path to the directory to list. Must be absolute, not relative.\", \"type\": \"string\"}}, \"required\": [\"path\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.1.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"read_file\", \"description\": \"Reads a file from the filesystem. Assume any path the user provides is valid; reading a missing file returns an error.\\n\\nUsage:\\n- By default, it reads up to 100 lines starting from the beginning of the file. Use `offset`/`limit` to page through large files instead of reading them whole.\\n- A status header, `@@ field | field | ... @@`, sits above the file content, and every line after it is verbatim file content. When content is truncated, there may be an explanation before the header. Never include the header when editing.\\n- Speculatively batch multiple `read_file` calls in one response when several files may be useful.\\n- An empty file returns a system-reminder warning in place of contents.\\n- Large tool results may be offloaded to a file; the tool message gives the path. Read that path here, paging with `offset`/`limit`.\\n- Images (`.png`, `.jpg`, etc.), audio, video, and PDFs return multimodal content blocks (https://docs.langchain.com/oss/python/langchain/messages#multimodal).\\n- For images and PDFs, pagination via `offset`/`limit` is text-only - supply `file_path` only\\n- Always read a file before editing it.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path to the file to read. Must be absolute, not relative.\", \"type\": \"string\"}, \"offset\": {\"default\": 0, \"description\": \"Line number to start reading from (0-indexed). Use for pagination of large files.\", \"type\": \"integer\"}, \"limit\": {\"default\": 100, \"description\": \"Maximum number of lines to read. Use for pagination of large files.\", \"type\": \"integer\"}}, \"required\": [\"file_path\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.2.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"write_file\", \"description\": \"Writes content to a file. Creates the file if it does not exist; replaces it entirely if it does.\\n\\nUsage:\\n- Use this tool when you intend to create a new file or replace the whole file. You do not need to read the file first.\\n- Prefer to edit existing files (with the edit_file tool) over creating new ones when possible.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path where the file should be written. Must be absolute, not relative.\", \"type\": \"string\"}, \"content\": {\"description\": \"The text content to write to the file. This parameter is required.\", \"type\": \"string\"}}, \"required\": [\"file_path\", \"content\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.3.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"edit_file\", \"description\": \"Performs exact string replacements in files.\\n\\nUsage:\\n- You must read the file before editing; this tool errors otherwise.\\n- Preserve the exact source indentation from the read output, and never include the read status header in old_string or new_string.\\n- Prefer editing an existing file over creating a new one.\\n- Only use emojis if the user explicitly requests it.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path to the file to edit. Must be absolute, not relative.\", \"type\": \"string\"}, \"old_string\": {\"description\": \"The exact text to find and replace. Must be unique in the file unless replace_all is True.\", \"type\": \"string\"}, \"new_string\": {\"description\": \"The text to replace old_string with. Must be different from old_string.\", \"type\": \"string\"}, \"replace_all\": {\"default\": false, \"description\": \"If True, replace all occurrences of old_string. If False (default), old_string must be unique.\", \"type\": \"boolean\"}}, \"required\": [\"file_path\", \"old_string\", \"new_string\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.4.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"delete\", \"description\": \"Deletes a file or directory from the filesystem.\\n\\nUsage:\\n- Permanently removes the file or directory at the given absolute path.\\n- Deleting a directory removes it and everything inside it, recursively. Prefer\\n deleting a directory in one call over deleting each file individually.\\n- This cannot be undone, so only delete paths you are sure are no longer needed.\", \"parameters\": {\"properties\": {\"file_path\": {\"description\": \"Absolute path to the file to delete. Must be absolute, not relative.\", \"type\": \"string\"}}, \"required\": [\"file_path\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.5.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"glob\", \"description\": \"Find files matching a glob pattern, returning absolute paths.\\n\\nSupports `*` (any characters within a path segment), `**` (any directories), `?` (single character), `[abc]` (one character from a set), and `{a,b}` (alternatives), e.g. `*.py`, `src/**/*.py`, `*.{yml,yaml}`.\\n\\nA pattern without `/` matches the file name at any depth under the search root (`*.py` matches `src/app/main.py`). A pattern containing `/` matches the search-root-relative path (`src/**/*.py`). A leading `/` anchors to the search root (`/*.py` matches only top-level Python files).\\n\\nLeading-dot names are only matched when the pattern segment itself starts with `.` (use `.env`, or `.github/**/*.yml`). Because `**` will not descend into dot-directories, the bare form `*.yml` is *broader* than `**/*.yml` and is usually what you want.\", \"parameters\": {\"properties\": {\"pattern\": {\"description\": \"Glob pattern to match files (e.g., '*.py', '**/*.py', '/subdir/**/*.md'). A pattern without '/' matches the file name at any depth; a pattern containing '/' matches the search-root-relative path; a leading '/' anchors to the search root ('/*.py' matches only top-level files). Leading-dot names are excluded unless the pattern segment starts with '.', so prefer the bare form '*.py' over '**/*.py' -- '**' will not descend into dot-directories like '.github'.\", \"type\": \"string\"}, \"path\": {\"anyOf\": [{\"type\": \"string\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Base directory to search from. Defaults to the backend's default root.\"}}, \"required\": [\"pattern\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.6.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"grep\", \"description\": \"Search for a LITERAL text pattern across files (NOT regex).\\n\\nThe pattern is matched verbatim: regex metacharacters are ordinary characters, not operators. To match any of several strings, run a separate grep for each; `grep(pattern=\\\"foo|bar\\\")` searches for the literal text \\\"foo|bar\\\", and `.*` or `\\\\.` match those characters literally.\\n\\nReturns matching files or content per `output_mode`. Offloaded large tool results live under the artifacts root (`/large_tool_results/` by default); grep that directory to search them when you do not know the exact path.\", \"parameters\": {\"properties\": {\"pattern\": {\"description\": \"Text pattern to search for (literal string, not regex).\", \"type\": \"string\"}, \"path\": {\"anyOf\": [{\"type\": \"string\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Directory to search in. Defaults to current working directory.\"}, \"glob\": {\"anyOf\": [{\"type\": \"string\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Glob pattern (NOT regex) limiting which files are searched (e.g. '*.py', '*.ts'). A pattern without '/' matches the file name at any depth; a pattern containing '/' matches the search-root-relative path (e.g. 'src/**/*.py'). This is an in-tool file filter, not a call to the separate glob tool. Brace expansion (e.g. '*.{ts,tsx}') is not supported on all backends; run a separate search per extension for reliable results.\"}, \"output_mode\": {\"default\": \"files_with_matches\", \"description\": \"Shape of the returned text. 'files_with_matches' (default): newline-separated matching file paths. 'content': matching lines grouped by file under a '<path>:' header, each line indented and formatted '<line_number>: <line text>' (only the matched line, no surrounding context). 'count': one '<path>: <match_count>' line per file.\", \"enum\": [\"files_with_matches\", \"content\", \"count\"], \"type\": \"string\"}, \"max_count\": {\"anyOf\": [{\"exclusiveMinimum\": 0, \"type\": \"integer\"}, {\"type\": \"null\"}], \"default\": null, \"description\": \"Optional cap on the total number of matches returned across all files. Leave unset to use the configured default. When the cap is hit, results are truncated and a note says so; narrow the pattern or path to see the rest.\"}}, \"required\": [\"pattern\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.tools.7.tool.json_schema",
"value": {
"stringValue": "{\"type\": \"function\", \"function\": {\"name\": \"task\", \"description\": \"Launch an ephemeral subagent to handle a complex, multi-step task.\\n\\nAvailable agent types and the tools they have access to:\\n- general-purpose: General-purpose agent for researching complex questions, searching for files and content, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you. This agent has access to all tools as the main agent.\\n\\nSpecify subagent_type to select the agent. Usage notes:\\n- Launch multiple agents concurrently when their tasks are independent, using a single message with multiple tool calls.\\n- Each invocation is stateless by default: the agent sees only the prompt you give it and returns a single final report. Put full detail in the prompt and state exactly what it should return \u2014 unless an agent type below says it inherits your conversation instead.\\n- The agent's report is not shown to the user; relay a summary yourself.\\n- Tell the agent whether to create content, analyze, or only research, since it can't necessarily see the user's intent unless it inherits your conversation, as noted per agent type below.\\n- If an agent's description says to use it proactively, do so without waiting to be asked.\\n- When only general-purpose is available, use it for any complex, context-heavy task; it has the same capabilities as the main agent.\", \"parameters\": {\"properties\": {\"description\": {\"description\": \"A detailed description of the task for the subagent to perform autonomously. Include all necessary context and specify the expected output format.\", \"type\": \"string\"}, \"subagent_type\": {\"description\": \"The type of subagent to use. Must be one of the available agent types listed in the tool description.\", \"type\": \"string\"}}, \"required\": [\"description\", \"subagent_type\"], \"type\": \"object\"}}}"
}
},
{
"key": "llm.provider",
"value": {
"stringValue": "openai"
}
},
{
"key": "llm.system",
"value": {
"stringValue": "openai"
}
},
{
"key": "llm.model_name",
"value": {
"stringValue": "openai/gpt-6-luna"
}
},
{
"key": "llm.token_count.prompt",
"value": {
"intValue": "1975"
}
},
{
"key": "llm.token_count.completion",
"value": {
"intValue": "160"
}
},
{
"key": "llm.token_count.total",
"value": {
"intValue": "2135"
}
},
{
"key": "llm.token_count.prompt_details.cache_write",
"value": {
"intValue": "1972"
}
},
{
"key": "llm.token_count.completion_details.reasoning",
"value": {
"intValue": "68"
}
},
{
"key": "metadata",
"value": {
"stringValue": "{\"ls_integration\": \"langchain_chat_model\", \"lc_agent_name\": \"research_agent\", \"lc_versions\": {\"deepagents\": \"0.7.21\", \"langchain-core\": \"1.6.6\", \"langchain\": \"1.4.3\", \"langchain-openai\": \"1.6.7\"}, \"langgraph_step\": 2, \"langgraph_node\": \"model\", \"langgraph_triggers\": [\"branch:to:model\"], \"langgraph_path\": [\"__pregel_pull\", \"model\"], \"langgraph_checkpoint_ns\": \"model:16ddf5e1-acd4-537c-f714-7cfc54f529f8\", \"checkpoint_ns\": \"model:16ddf5e1-acd4-537c-f714-7cfc54f529f8\", \"ls_provider\": \"openai\", \"ls_model_name\": \"openai/gpt-6-luna\", \"ls_model_type\": \"chat\", \"ls_temperature\": null}"
}
},
{
"key": "openinference.span.kind",
"value": {
"stringValue": "LLM"
}
}
],
"status": {
"code": 1
},
"flags": 256
},
{
"traceId": "f4186abf7a7c72775ff23cf3b843d260",
"spanId": "b7dac413027ac08c",
"parentSpanId": "5bbb6a7a2cd23019",
"name": "model",
"kind": 1,
"startTimeUnixNano": "1791061316849745152",
"endTimeUnixNano": "1791061320697050112",
"attributes": [
{
"key": "input.value",
"value": {
"stringValue": "{\"messages\": [{\"type\": \"human\", \"data\": {\"content\": \"What is an agent trace?\", \"additional_kwargs\": {}, \"response_metadata\": {}, \"type\": \"human\", \"name\": null, \"id\": \"527c715b-7af7-4368-802f-e08f238cc315\"}}], \"files\": {}}"
}
},
{
"key": "input.mime_type",
"value": {
"stringValue": "application/json"
}
},
{
"key": "output.value",
"value": {
"stringValue": "[{\"graph\": null, \"update\": {\"messages\": [{\"type\": \"ai\", \"data\": {\"content\": [{\"id\": \"rs_05e5d44b09fe0f10006ac16d45a92487d0842ce0adbba226df\", \"summary\": [], \"type\": \"reasoning\", \"content\": [], \"encrypted_content\": \"gAAAAABqwW1IiM8ZHSPBlFmixN4sgD9eCCnq9SYBCSPQzidkd7uHOEtiQUQrukphZGR6JBcON88FvjudIDhWGcKNNxIprZbz1FB1cPHDpwOb01jUpI8_Himmi0QDUpMyR7UtjtMaqzo7hwzRNKxrqYLxDfOSGMdT0dPPEztXjSD2jFRPejs1GKEQXscKW1X6dyv9-wGRUUfEi9Teiwnpl2Hv-BvhMALK7sFl3PevB4zzJn_qx76av8kTB7Te7Y7anWGt4asP7j_O0DcPnm9ucxslWSRjuBDDOwTlfISI0pPST399Dz60QtVAZtUgz-qLiIv8wVIoD6rwOXl84VtG86Vx8BQUXwoWrJWYgLwAxlqoO7M9LAlanDnfIoOKI5J_E1bdQGqShkODpcnfKT2_fOac45gfrqY-DZls3UFlBiDGx95RQAvvPYXtRZGjR4lVOps-lrrJXDXgoCCSj03blmQDPmKpWhBOiZoibm4_8WgFesxroCdwjoZUdf6CJ4FqNpnjoESB6O26NQjehWBBWPP_mCuS0QRoM7CsXFGHIMlLkA8qfE0O3fcOM_gE6d7wSjZpC_1-WCkk87PkyOXkKD6SinnTyCQqseKvBQSIn21qMcQ37F-JKT9UsEDPYQs7UegQJSnmGozJ-c1UCRvewnsmYCqriRcvmq5XgBufH_FuVGAs4fdCSELdnwVTNpUgho1bM-vqSyeWAT6DVqTRi6bg-sp5vLCkoJEHOQHd7K6X9AiJhNC2GrNaold-Y168mAh4ZlNTR1ebwMxX0C4ioJwg6Gm_y_rIkmRFcfSUuahntXqRtHpk9PM0MhaEFLImuADz0f1OfMeUlMEsY3jY7u6pt47_aotoyKREhKSctlmbvF9Mc97OqWOaO9JAx5OHsPZrI9rFg1GkFdc7cvpK8dke1rzBbSMYxR_uxtzvTg7ATgpO5khyyltq7A63c5yVTs_1E_WMSp6-61lkfvCDMrwcu4-6FuHVYfMZl2HfhZfDo_GPviFBl4zKD2iq8PvjhjcCwKv7XOQfTbj_PF-bYeiVBB_vwboax9yF7MkNJB5kxIfrank9A6i9jFvhmhlDvaxNdoOh9HMa_tkucrolGt3pe_xqCvgfqg03Os2ZvwLNWu6GD67fxtq8H29PeEici8ywOnWuyODeDIN81a3gki0EQCz8TjRSYT4ikbiR1_n7wfdZH1Sb50wexRDUo7cl1ZcHdrhylDj2xRDXL5MrNwCVRYp6sQj3h8l1kQoYrJTgl1vI4A1P_ubnIGHDxGe1juMu6VDH6t6tOgIWViuYMt0N2xiPOMBK-N4w3X156LkgZWmV-Z1dhzeGuFxUl6iPYO9g1dbB8KnOf18XI40poByKcv_E67zZx-eO5CLcN2KWPLkBF0Mx5FnqaYGiYrvR9pHNBeepjJq3BfgEm5Pt2Wm6HUjHkemesYijBdRVONUmu_M3klFoA-7z3hIdDbp2dpx1zcz4Hxa7Kk40WucYZHz1_biMhaeCKV6u-Li5xaIkHJoRfahbRp2J839ohKQ4AnWGb7dTqNZ7rwOC4KYdE9pCjlFnAB0rrYxz-MJjQzzTCl7xKFQy4hxXYHFGSbAfqvFYr7qPK4EDGKCdJVSW21IBiybSHmHnObbwtQRbTCtt4JaLUYrrOz0=\"}, {\"type\": \"text\", \"text\": \"An **agent trace** is a record of an AI agent\u2019s run: the steps it took from a request to a result. It commonly includes the messages it received, actions or tool calls it made, tool responses, and the final output\u2014often with timestamps and errors.\\n\\nTraces help people debug, evaluate, and understand an agent\u2019s behavior. They show the observable sequence of events, not necessarily the model\u2019s private reasoning.\", \"annotations\": [], \"id\": \"msg_05e5d44b09fe0f10006ac16d467af887d0bb54de149a82fae4\", \"phase\": \"final_answer\"}], \"additional_kwargs\": {}, \"response_metadata\": {\"id\": \"resp_meLQFnIN19A9gV6IpErXPP376KOMVFwkXKET6ifFVY_INxGhgnY-PCYYBgnq_njGDlEXr4DAaM2OP6Jw8e-JQm_kuACo_4BvMCURCx_Qp1vMcP8hKHG2HnMBvpUgdcZAz1LUCQLaZR-ZYqkrCa8WFIPbj3ZnVCMM_4EcEWrKzy-UiYrmP7MRkDIVd-Rqno3yEMNAbfb1Vc9k2IDRQRlWvtbJpqboGxLWiyEdn19Nqadcxg_cQGZc3m6YtLSBivg1pN4QaOU4RMVoq178_3cWC7TA8wKesxYSwxo7KWiEcO9gCRcgAwnEV3MQqK-6VKCtH1KStBklsLSEvLQTluasM0K87m_roMpThDi7buKq9wFyIcz8AIfP0--hUer4lJo2eQjxRkYthUtFNN5ymDyzs2bwt5bkG7Ta-yJmbWARVfBejowl6CXMiZ0Fz_PVy_2C7ms9xwbcPLztBriX1jpyqABC\", \"created_at\": 1791061317.0, \"metadata\": {}, \"model\": \"openai/gpt-6-luna\", \"object\": \"response\", \"service_tier\": \"default\", \"status\": \"completed\", \"model_provider\": \"openai\", \"model_name\": \"openai/gpt-6-luna\"}, \"type\": \"ai\", \"name\": \"research_agent\", \"id\": \"resp_meLQFnIN19A9gV6IpErXPP376KOMVFwkXKET6ifFVY_INxGhgnY-PCYYBgnq_njGDlEXr4DAaM2OP6Jw8e-JQm_kuACo_4BvMCURCx_Qp1vMcP8hKHG2HnMBvpUgdcZAz1LUCQLaZR-ZYqkrCa8WFIPbj3ZnVCMM_4EcEWrKzy-UiYrmP7MRkDIVd-Rqno3yEMNAbfb1Vc9k2IDRQRlWvtbJpqboGxLWiyEdn19Nqadcxg_cQGZc3m6YtLSBivg1pN4QaOU4RMVoq178_3cWC7TA8wKesxYSwxo7KWiEcO9gCRcgAwnEV3MQqK-6VKCtH1KStBklsLSEvLQTluasM0K87m_roMpThDi7buKq9wFyIcz8AIfP0--hUer4lJo2eQjxRkYthUtFNN5ymDyzs2bwt5bkG7Ta-yJmbWARVfBejowl6CXMiZ0Fz_PVy_2C7ms9xwbcPLztBriX1jpyqABC\", \"tool_calls\": [], \"invalid_tool_calls\": [], \"usage_metadata\": {\"input_tokens\": 1975, \"output_tokens\": 160, \"total_tokens\": 2135, \"input_token_details\": {\"cache_creation\": 1972, \"cache_read\": 0}, \"output_token_details\": {\"reasoning\": 68}}}}]}, \"resume\": null, \"goto\": []}]"
}
},
{
"key": "output.mime_type",
"value": {
"stringValue": "application/json"
}
},
{
"key": "llm.input_messages.0.message.role",
"value": {
"stringValue": "user"
}
},
{
"key": "llm.input_messages.0.message.content",
"value": {
"stringValue": "What is an agent trace?"
}
},
{
"key": "metadata",
"value": {
"stringValue": "{\"ls_integration\": \"deepagents\", \"lc_agent_name\": \"research_agent\", \"lc_versions\": {\"deepagents\": \"0.7.21\"}, \"langgraph_step\": 2, \"langgraph_node\": \"model\", \"langgraph_triggers\": [\"branch:to:model\"], \"langgraph_path\": [\"__pregel_pull\", \"model\"], \"langgraph_checkpoint_ns\": \"model:16ddf5e1-acd4-537c-f714-7cfc54f529f8\"}"
}
},
{
"key": "openinference.span.kind",
"value": {
"stringValue": "CHAIN"
}
}
],
"status": {
"code": 1
},
"flags": 256
},
{
"traceId": "f4186abf7a7c72775ff23cf3b843d260",
"spanId": "5bbb6a7a2cd23019",
"name": "research_agent",
"kind": 1,
"startTimeUnixNano": "1791061316848026880",
"endTimeUnixNano": "1791061320697488896",
"attributes": [
{
"key": "input.value",
"value": {
"stringValue": "{\"messages\": [{\"type\": \"human\", \"data\": {\"content\": \"What is an agent trace?\", \"additional_kwargs\": {}, \"response_metadata\": {}, \"type\": \"human\", \"name\": null, \"id\": \"527c715b-7af7-4368-802f-e08f238cc315\"}}]}"
}
},
{
"key": "input.mime_type",
"value": {
"stringValue": "application/json"
}
},
{
"key": "output.value",
"value": {
"stringValue": "{\"messages\": [{\"type\": \"human\", \"data\": {\"content\": \"What is an agent trace?\", \"additional_kwargs\": {}, \"response_metadata\": {}, \"type\": \"human\", \"name\": null, \"id\": \"527c715b-7af7-4368-802f-e08f238cc315\"}}, {\"type\": \"ai\", \"data\": {\"content\": [{\"id\": \"rs_05e5d44b09fe0f10006ac16d45a92487d0842ce0adbba226df\", \"summary\": [], \"type\": \"reasoning\", \"content\": [], \"encrypted_content\": \"gAAAAABqwW1IiM8ZHSPBlFmixN4sgD9eCCnq9SYBCSPQzidkd7uHOEtiQUQrukphZGR6JBcON88FvjudIDhWGcKNNxIprZbz1FB1cPHDpwOb01jUpI8_Himmi0QDUpMyR7UtjtMaqzo7hwzRNKxrqYLxDfOSGMdT0dPPEztXjSD2jFRPejs1GKEQXscKW1X6dyv9-wGRUUfEi9Teiwnpl2Hv-BvhMALK7sFl3PevB4zzJn_qx76av8kTB7Te7Y7anWGt4asP7j_O0DcPnm9ucxslWSRjuBDDOwTlfISI0pPST399Dz60QtVAZtUgz-qLiIv8wVIoD6rwOXl84VtG86Vx8BQUXwoWrJWYgLwAxlqoO7M9LAlanDnfIoOKI5J_E1bdQGqShkODpcnfKT2_fOac45gfrqY-DZls3UFlBiDGx95RQAvvPYXtRZGjR4lVOps-lrrJXDXgoCCSj03blmQDPmKpWhBOiZoibm4_8WgFesxroCdwjoZUdf6CJ4FqNpnjoESB6O26NQjehWBBWPP_mCuS0QRoM7CsXFGHIMlLkA8qfE0O3fcOM_gE6d7wSjZpC_1-WCkk87PkyOXkKD6SinnTyCQqseKvBQSIn21qMcQ37F-JKT9UsEDPYQs7UegQJSnmGozJ-c1UCRvewnsmYCqriRcvmq5XgBufH_FuVGAs4fdCSELdnwVTNpUgho1bM-vqSyeWAT6DVqTRi6bg-sp5vLCkoJEHOQHd7K6X9AiJhNC2GrNaold-Y168mAh4ZlNTR1ebwMxX0C4ioJwg6Gm_y_rIkmRFcfSUuahntXqRtHpk9PM0MhaEFLImuADz0f1OfMeUlMEsY3jY7u6pt47_aotoyKREhKSctlmbvF9Mc97OqWOaO9JAx5OHsPZrI9rFg1GkFdc7cvpK8dke1rzBbSMYxR_uxtzvTg7ATgpO5khyyltq7A63c5yVTs_1E_WMSp6-61lkfvCDMrwcu4-6FuHVYfMZl2HfhZfDo_GPviFBl4zKD2iq8PvjhjcCwKv7XOQfTbj_PF-bYeiVBB_vwboax9yF7MkNJB5kxIfrank9A6i9jFvhmhlDvaxNdoOh9HMa_tkucrolGt3pe_xqCvgfqg03Os2ZvwLNWu6GD67fxtq8H29PeEici8ywOnWuyODeDIN81a3gki0EQCz8TjRSYT4ikbiR1_n7wfdZH1Sb50wexRDUo7cl1ZcHdrhylDj2xRDXL5MrNwCVRYp6sQj3h8l1kQoYrJTgl1vI4A1P_ubnIGHDxGe1juMu6VDH6t6tOgIWViuYMt0N2xiPOMBK-N4w3X156LkgZWmV-Z1dhzeGuFxUl6iPYO9g1dbB8KnOf18XI40poByKcv_E67zZx-eO5CLcN2KWPLkBF0Mx5FnqaYGiYrvR9pHNBeepjJq3BfgEm5Pt2Wm6HUjHkemesYijBdRVONUmu_M3klFoA-7z3hIdDbp2dpx1zcz4Hxa7Kk40WucYZHz1_biMhaeCKV6u-Li5xaIkHJoRfahbRp2J839ohKQ4AnWGb7dTqNZ7rwOC4KYdE9pCjlFnAB0rrYxz-MJjQzzTCl7xKFQy4hxXYHFGSbAfqvFYr7qPK4EDGKCdJVSW21IBiybSHmHnObbwtQRbTCtt4JaLUYrrOz0=\"}, {\"type\": \"text\", \"text\": \"An **agent trace** is a record of an AI agent\u2019s run: the steps it took from a request to a result. It commonly includes the messages it received, actions or tool calls it made, tool responses, and the final output\u2014often with timestamps and errors.\\n\\nTraces help people debug, evaluate, and understand an agent\u2019s behavior. They show the observable sequence of events, not necessarily the model\u2019s private reasoning.\", \"annotations\": [], \"id\": \"msg_05e5d44b09fe0f10006ac16d467af887d0bb54de149a82fae4\", \"phase\": \"final_answer\"}], \"additional_kwargs\": {}, \"response_metadata\": {\"id\": \"resp_meLQFnIN19A9gV6IpErXPP376KOMVFwkXKET6ifFVY_INxGhgnY-PCYYBgnq_njGDlEXr4DAaM2OP6Jw8e-JQm_kuACo_4BvMCURCx_Qp1vMcP8hKHG2HnMBvpUgdcZAz1LUCQLaZR-ZYqkrCa8WFIPbj3ZnVCMM_4EcEWrKzy-UiYrmP7MRkDIVd-Rqno3yEMNAbfb1Vc9k2IDRQRlWvtbJpqboGxLWiyEdn19Nqadcxg_cQGZc3m6YtLSBivg1pN4QaOU4RMVoq178_3cWC7TA8wKesxYSwxo7KWiEcO9gCRcgAwnEV3MQqK-6VKCtH1KStBklsLSEvLQTluasM0K87m_roMpThDi7buKq9wFyIcz8AIfP0--hUer4lJo2eQjxRkYthUtFNN5ymDyzs2bwt5bkG7Ta-yJmbWARVfBejowl6CXMiZ0Fz_PVy_2C7ms9xwbcPLztBriX1jpyqABC\", \"created_at\": 1791061317.0, \"metadata\": {}, \"model\": \"openai/gpt-6-luna\", \"object\": \"response\", \"service_tier\": \"default\", \"status\": \"completed\", \"model_provider\": \"openai\", \"model_name\": \"openai/gpt-6-luna\"}, \"type\": \"ai\", \"name\": \"research_agent\", \"id\": \"resp_meLQFnIN19A9gV6IpErXPP376KOMVFwkXKET6ifFVY_INxGhgnY-PCYYBgnq_njGDlEXr4DAaM2OP6Jw8e-JQm_kuACo_4BvMCURCx_Qp1vMcP8hKHG2HnMBvpUgdcZAz1LUCQLaZR-ZYqkrCa8WFIPbj3ZnVCMM_4EcEWrKzy-UiYrmP7MRkDIVd-Rqno3yEMNAbfb1Vc9k2IDRQRlWvtbJpqboGxLWiyEdn19Nqadcxg_cQGZc3m6YtLSBivg1pN4QaOU4RMVoq178_3cWC7TA8wKesxYSwxo7KWiEcO9gCRcgAwnEV3MQqK-6VKCtH1KStBklsLSEvLQTluasM0K87m_roMpThDi7buKq9wFyIcz8AIfP0--hUer4lJo2eQjxRkYthUtFNN5ymDyzs2bwt5bkG7Ta-yJmbWARVfBejowl6CXMiZ0Fz_PVy_2C7ms9xwbcPLztBriX1jpyqABC\", \"tool_calls\": [], \"invalid_tool_calls\": [], \"usage_metadata\": {\"input_tokens\": 1975, \"output_tokens\": 160, \"total_tokens\": 2135, \"input_token_details\": {\"cache_creation\": 1972, \"cache_read\": 0}, \"output_token_details\": {\"reasoning\": 68}}}}], \"files\": {}}"
}
},
{
"key": "output.mime_type",
"value": {
"stringValue": "application/json"
}
},
{
"key": "llm.input_messages.0.message.role",
"value": {
"stringValue": "user"
}
},
{
"key": "llm.input_messages.0.message.content",
"value": {
"stringValue": "What is an agent trace?"
}
},
{
"key": "metadata",
"value": {
"stringValue": "{\"ls_integration\": \"deepagents\", \"lc_agent_name\": \"research_agent\", \"lc_versions\": {\"deepagents\": \"0.7.21\"}}"
}
},
{
"key": "openinference.span.kind",
"value": {
"stringValue": "AGENT"
}
}
],
"status": {
"code": 1
},
"flags": 256
}
]
}
]
}
]
}