From 4bb6316cef67af12c8d6453d1d43eb9333a1014d Mon Sep 17 00:00:00 2001 From: maral Date: Thu, 27 Aug 2026 21:14:09 +0800 Subject: [PATCH 1/2] feat: add parallel tool calling support Forward parallel_tool_calls to upstream inference and execute gateway built-in tool calls concurrently with bounded, per-tool safety controls. Align behavior with OpenAI reference recordings by: - validating missing function and custom tool call outputs - supporting batched web-search queries - preserving typed MCP and web-search output lifecycles - emitting mcp_list_tools discovery only once per stored chain - retaining discovery history without exposing it to model input - adding streaming and non-streaming cassette parity coverage Signed-off-by: maral --- ARCHITECTURE.md | 200 +- CHANGELOG.md | 12 + README.md | 11 +- ROADMAP.md | 17 +- TERMINOLOGY.md | 4 +- crates/agentic-server-core/src/config.rs | 19 +- .../src/executor/compaction.rs | 1 + .../src/executor/engine.rs | 233 +- .../agentic-server-core/src/executor/error.rs | 4 +- .../src/executor/gateway.rs | 559 +- .../agentic-server-core/src/executor/mod.rs | 1 + .../src/executor/pending_calls.rs | 120 + .../src/executor/rehydrate.rs | 98 +- .../src/executor/request.rs | 2 + .../src/executor/upstream.rs | 3 +- .../src/storage/types/item.rs | 29 +- crates/agentic-server-core/src/tool/codex.rs | 7 +- crates/agentic-server-core/src/tool/custom.rs | 7 +- .../agentic-server-core/src/tool/executors.rs | 9 +- .../agentic-server-core/src/tool/function.rs | 7 +- .../agentic-server-core/src/tool/handler.rs | 46 +- .../src/tool/mcp/handler.rs | 159 +- .../src/tool/mcp/registry.rs | 12 +- crates/agentic-server-core/src/tool/mod.rs | 2 + .../agentic-server-core/src/tool/ownership.rs | 58 + .../agentic-server-core/src/tool/registry.rs | 202 +- .../src/tool/web_search.rs | 168 +- .../agentic-server-core/src/types/io/input.rs | 47 +- .../src/types/io/output.rs | 47 +- .../src/types/request_response.rs | 33 +- ...Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml | 752 + ...ay-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml | 13662 ++++++++++++++++ ...openai-reference-gpt-5.6-nonstreaming.yaml | 731 + ...ly-openai-reference-gpt-5.6-streaming.yaml | 1495 ++ ...Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml | 503 + ...ay-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml | 4740 ++++++ ...openai-reference-gpt-5.6-nonstreaming.yaml | 712 + ...nt-openai-reference-gpt-5.6-streaming.yaml | 927 ++ ...Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml | 544 + ...ay-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml | 6575 ++++++++ ...openai-reference-gpt-5.6-nonstreaming.yaml | 737 + ...es-openai-reference-gpt-5.6-streaming.yaml | 1006 ++ ...Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml | 243 + ...ay-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml | 3191 ++++ ...openai-reference-gpt-5.6-nonstreaming.yaml | 311 + ...ed-openai-reference-gpt-5.6-streaming.yaml | 345 + .../parallel_tool_calls/tool_outputs.py | 38 + .../tools-builtin-only.json | 12 + .../tools-client-only.json | 41 + .../parallel_tool_calls/tools-mixed.json | 27 + .../tests/cassettes/record_cassette.py | 114 +- .../record_parallel_tool_call_cassettes.sh | 259 + .../tests/custom_tool_test.rs | 4 +- .../tests/mcp_tool_test.rs | 4 +- .../tests/parallel_tool_calls_test.rs | 263 + .../agentic-server-core/tests/support/mod.rs | 4 + .../tests/tool_normalization_test.rs | 7 +- .../tests/web_search_tool_test.rs | 86 +- crates/agentic-server/src/agentic_harness.rs | 4 +- crates/agentic-server/src/config_file.rs | 15 + crates/agentic-server/src/main.rs | 27 +- crates/agentic-server/src/server.rs | 1 - crates/agentic-server/tests/responses_test.rs | 28 + docs/design/codex-integration.md | 12 +- docs/design/mcp-gateway-integration.md | 30 +- docs/design/tool-framework.md | 228 +- docs/guides/harness-cli-testing.md | 6 +- 67 files changed, 39048 insertions(+), 753 deletions(-) create mode 100644 crates/agentic-server-core/src/executor/pending_calls.rs create mode 100644 crates/agentic-server-core/src/tool/ownership.rs create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-nonstreaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-streaming.yaml create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tool_outputs.py create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-builtin-only.json create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-client-only.json create mode 100644 crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-mixed.json create mode 100755 crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh create mode 100644 crates/agentic-server-core/tests/parallel_tool_calls_test.rs diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 64b391dd..c46b5b52 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -60,6 +60,42 @@ Postgres (`storage::pool`). The upstream inference call targets vLLM's own state Responses API — this project owns the state, vLLM owns tokenization and generation (see ADR-01 §1.1). +One Responses turn may contain several inference rounds, but it is exposed and +persisted as one response: + +``` +rehydrate history + │ + ▼ +build ToolRegistry + discover MCP tools + │ + ▼ +┌─▶ optional compaction ─▶ one upstream inference round +│ │ +│ ▼ +│ resolve calls by ownership +│ │ │ +│ │ └─ client-owned calls stay unresolved +│ ▼ +│ GatewayRound executes gateway calls +│ with bounded fan-out and ordered results +│ │ +│ ▼ +│ classify_round +│ │ │ │ +│ │ │ └─ client/incomplete/done: finalize +│ │ └─ append calls/results to continuation input +└──────────────┘ (`Continue`, at most 10 rounds) + │ + ▼ +finalize one public response + persist one turn +``` + +A mixed round may contain both ownership classes. Gateway-owned calls still execute +and are recorded, while the response returns the unresolved client-owned calls for the +client to resolve. Streaming uses the same round loop and projects it through one +continuous SSE lifecycle. + ## `agentic-server` — the transport layer ### Two binaries sharing one library @@ -186,17 +222,26 @@ access happen — those live in `tool/`, `executor/`, and `storage/` respectivel request. Its `to_upstream_request(&self, stream: bool) -> Result, ToolError>` is the seam between the OpenAI-shaped request and vLLM's contract. It: flattens Codex namespace tool members to model-visible names, validates every declared tool - (`ResponsesTool::validate()`), normalizes every tool kind to `UpstreamTool::Function` - (`ResponsesTool::to_function_tools()` — **every** tool type the model sees is - `type: "function"`, because that's the only type vLLM speaks), and resolves/validates - `tool_choice`. It's called from `executor/upstream.rs`'s `fetch_blocking_payload` and - `fetch_stream_payload` — the two functions that actually build the outbound request - to vLLM. + (`ResponsesTool::validate()`), and normalizes each supported model-visible tool to + `UpstreamTool::Function` (`ResponsesTool::to_function_tools()`). File search, code + interpreter, and unknown typed declarations currently normalize to no upstream + tool; every declaration that does reach vLLM is `type: "function"`, because that's + the only tool type it speaks. The conversion also resolves/validates `tool_choice` + and applies `ResponsesInput::model_input()`. It's called from + `executor/upstream.rs`'s `fetch_blocking_payload` and `fetch_stream_payload` — the + two functions that actually build the outbound request to vLLM. - **`types/io/`** — `input.rs` (inbound message/tool-call/tool-result shapes, `ResponsesInput`), `output.rs` (outbound output items: messages, function calls, web search/MCP calls, reasoning — plus the `ApplyDone` trait described below), `tools.rs` (the normalized `FunctionTool` and `ToolChoice`, distinct from tool *declarations*), - `usage.rs` (token accounting structs). + `usage.rs` (token accounting structs). `ResponsesInput::model_input()` is the final + model-visibility boundary used by `RequestPayload::to_upstream_request`: it removes + orchestration-only `McpListTools` and `CompactionTrigger` input items. A persisted + `Compaction` item is different: the latest checkpoint supersedes earlier model + context and is converted into an assistant `output_text` summary, while canonical + retained user messages and items after the checkpoint remain. This keeps rich + continuation state available to orchestration without sending unsupported public + item types to vLLM. - **`types/tools/params.rs`** — the tool **declaration** shapes a client sends: `ResponsesTool` (tagged enum: `Function`, `Mcp`, `WebSearch`, `FileSearch`, `CodeInterpreter`, `Namespace`, `Custom`, `Unknown`) and each variant's param struct. @@ -251,7 +296,12 @@ call inference, run the tool loop, persist. `agentic-server` never reaches past handlers below), never the raw stores. - **`rehydrate.rs`** — `rehydrate_conversation()` loads prior history from either the conversation store or the response store depending on which ID the request carries, - and builds the enriched `RequestContext`. + and builds the enriched `RequestContext`. Rehydration retains internal + `InputItem::McpListTools` records so `ToolRegistry` can suppress repeated MCP + discovery lifecycle output. `pending_calls.rs` scans the complete continuation + history and rejects a new turn when a prior client-owned call has no matching tool + output; gateway-owned calls are resolved and recorded within their originating + round. - **`upstream.rs`** — `fetch_blocking_payload`/`fetch_stream_payload`: builds the `UpstreamRequest` (via `to_upstream_request`, see above) and drives one round of upstream inference, running the accumulator and `FunctionSseTranslator` over the @@ -262,9 +312,12 @@ call inference, run the tool loop, persist. `agentic-server` never reaches past `create_conversation()`, and — this is worth being precise about — **`run_gateway_tool_loop` is where the multi-round tool loop actually lives**, not in `gateway.rs`. It calls `upstream.rs` for each round, hands the resulting output to - `gateway.rs`'s helpers, and uses `gateway::classify_round`'s `LoopDecision` to decide - whether to loop again, finish, hand back to the client, or give up (capped at - `MAX_GATEWAY_TOOL_ROUNDS = 10`). Also home to `run_compaction_trigger`, + `gateway.rs`'s helpers, and applies its local `classify_round`/`LoopDecision` to + decide whether to loop again, finish, hand back to the client, or return an + incomplete response (capped at `MAX_GATEWAY_TOOL_ROUNDS = 10`). It accumulates + output and token usage across inference rounds, changes continuation `tool_choice` + to `auto`, and persists gateway function calls plus their outputs as model-facing + `InputItem`s. Also home to `run_compaction_trigger`, `run_blocking`, and `run_stream` (spawns the loop, forwards events as SSE, persists before yielding the terminal event). - **`persist.rs`** — `persist_response`/`persist_turn`, which route to @@ -347,21 +400,51 @@ It also buffers function-call events that arrive before the call's name is known As noted above, the round-by-round loop itself is `engine.rs::run_gateway_tool_loop`. `gateway.rs` supplies what that loop calls each round: -- `classify_round(...) -> LoopDecision` — `Continue` / `Done` / `RequiresClientAction` / - `Incomplete(reason)`. Client-owned calls take precedence: a round with both gateway - and client calls still executes and records the gateway calls' outputs, but returns - `RequiresClientAction` in that same round rather than a separate "partial" state. -- `execute_output_calls` — runs every gateway-owned call for the round **concurrently**, - bounded by a sliding window (`MAX_CONCURRENT_GATEWAY_CALLS = 5`, via - `futures::stream::buffered`), each individually timeout-bounded - (`GATEWAY_TOOL_TIMEOUT = 60s`) by `execute_gateway_call`. Result order matches call - order regardless of completion order. -- `gateway_event_plans` / `emit_gateway_start_events` / `emit_gateway_completed_events` - — build and emit the synthetic "start" events for all planned calls up front, then - the "completed"/"failed" events once execution finishes, through - `GatewayStreamAccumulator`. -- `execute_and_emit_output_calls` composes the three steps above: plan → emit start → - execute (concurrently) → emit completed. +- `GatewayRound::execute` extracts every gateway-owned function call, dispatches them + through the request-scoped `ToolRegistry`, and returns one ordered + `GatewayCallResult` per call. A `futures::stream::buffered` sliding window bounds + fan-out using `tools.max_concurrent_gateway_calls` (default `5`, configurable through + `AGENTIC_MAX_CONCURRENT_GATEWAY_CALLS`); completion may occur out of order, but the + collected result order always matches model call order. +- Every call has an independent 60-second timeout. Timeout, execution, and tool-config + failures become failed tool outputs that can be fed back to the model instead of + failing the whole response. A tool registered as gateway-owned without an + implementation (currently file search/code interpreter) likewise produces an error + tool result. +- Parallel safety is a per-handler contract. `GatewayExecutor::supports_parallel_execution` + defaults to `false`; registration turns that into a `GatewayBinding::self_exclusion` + semaphore. The semaphore serializes only simultaneous calls to the **same + model-visible tool name**. It never blocks different tools from running concurrently. + MCP and web search opt into same-tool parallel execution. +- `gateway_event_plans`, `emit_gateway_start_events`, and + `emit_gateway_completed_events` synthesize the OpenAI lifecycle for gateway-owned + web search/MCP calls. The ordinary path emits all planned start events, executes the + round concurrently, then emits ordered completed/failed events. +- Streaming may receive client-visible output interleaved with gateway calls. In that + case `engine.rs::execute_and_emit_ordered_output_calls` temporarily groups deferred + upstream frames by `output_index`, executes the same `GatewayRound` concurrently, + and then interleaves synthetic gateway lifecycle events with released upstream + frames in original output order. Concurrency and wire ordering are therefore + separate concerns. +- `public_output_items` is the public projection: custom function calls become + `custom_tool_call`; gateway-owned internal function calls become their handler's + `web_search_call`/`mcp_call` output; client-owned function calls remain function + calls. The original gateway function calls and `function_call_output` results are + retained separately for continuation persistence. + +The round decision remains in `engine.rs`, after gateway execution: + +| Decision | Condition and state transition | +|---|---| +| `RequiresClientAction` | At least one client-owned call exists. Any gateway calls from the mixed round have already executed; their internal calls/results are recorded before returning. | +| `Done` | No gateway result and no client-owned call remains. Finalize accumulated output and usage. | +| `Continue` | Gateway calls ran and round budget remains. Append the upstream output plus gateway results, set `tool_choice: auto`, and infer again. | +| `Incomplete` | Gateway calls ran on the tenth round. Record the final calls/results and return `status: incomplete` instead of leaving a dangling call. | + +`parallel_tool_calls` is an upstream model-generation preference, not a gateway +scheduler switch. It is forwarded to vLLM for all supported declaration mixtures and +defaults to `false` when omitted. Whatever calls the model emits are executed under +the global sliding window and each handler's same-tool safety policy. #### `messages_loop.rs` / `messages_request.rs` / `messages_stream.rs` @@ -394,7 +477,25 @@ not an oversight, per the future-consolidation note. `From`/`TryFrom` impls: `ConversationData`/`ConversationSnapshot`, `ResponseData`/ `ResponseMetadata` (parses the JSON metadata column into a typed struct), `InOutItem` (parses an `Item.data` JSON blob back into a typed `InputItem` or - `OutputItem`), and `StorageError`. + `OutputItem`), and `StorageError`. `InOutItem::into_input_items` turns a full + history into the `Vec` used for continuation processing: stored + `InputItem`s pass through, while stored `OutputItem`s go through + `OutputItem::to_input_item()`. Messages, reasoning, function/custom calls, + compaction checkpoints, and MCP list-tools records are retained. Public + `web_search_call` and `mcp_call` outputs are deliberately omitted because their + model-facing function calls and results are already persisted as input items; + reconstructing them here would duplicate and lose information from that canonical + pair. + + This conversion is **not** the model visibility boundary. The resulting enriched + history still contains `InputItem::Compaction`, `InputItem::CompactionTrigger`, and + `InputItem::McpListTools` for executor/registry decisions. Immediately before an + upstream request, `RequestPayload::to_upstream_request` calls + `ResponsesInput::model_input()`: the latest compaction checkpoint is converted to an + assistant summary and supersedes older context, while compaction triggers and MCP + list-tools records are removed. In particular, MCP list-tools remains available long + enough for the registry to remember which server labels have already been listed, + but it is never serialized to vLLM. - **`conversation.rs`, `response.rs`** — `ConversationStore` and `ResponseStore`: the CRUD-with-transactions layer (`create`, `get`, `get_or_create`, `rehydrate[_snapshot]`, `persist`/`persist_if_version` — each transactional, via `pool.begin()` / @@ -427,19 +528,36 @@ the behavioral layer — routing, handler traits, normalization, and execution. pub trait GatewayExecutor: ToolHandler + 'static { fn execute(&self, call_id: &str, tool_name: &str, arguments: &str, config: &Value) -> Pin> + Send + '_>>; + fn supports_parallel_execution(&self) -> bool; + fn started_output(&self, call: &FunctionToolCall) -> Option; + fn public_output( + &self, + call: &FunctionToolCall, + output: &ToolOutput, + status: GatewayCallStatus, + ) -> Option; } ``` - `GatewayExecutor` requires `ToolHandler` — every gateway-owned tool is also a - `ToolHandler`, but not every `ToolHandler` is gateway-executable. + `GatewayExecutor` requires `ToolHandler`: every executable gateway handler supports + validation and normalization, but not every `ToolHandler` is gateway-executable. + Gateway-owned registry types may also lack an executor entirely. The trait owns + three runtime hooks: `supports_parallel_execution()` controls same-tool + self-exclusion, `started_output()` creates the public in-progress placeholder, and + `public_output()` shapes the completed/failed client-visible item. - **Client-owned** tools implement only `ToolHandler`: see `function.rs` (`FunctionHandler`), `custom.rs` (`CustomHandler`), `codex.rs` - (`CodexNamespaceHandler`). Their calls come back as `status: "requires_action"` for - the client to resolve — the gateway never executes them. + (`CodexNamespaceHandler`). Their calls are returned for the client to resolve — the + gateway never executes them. - **Gateway-owned / built-in** tools implement both traits: see `web_search.rs` (`WebSearchHandler`, backed by You.com) and `mcp/handler.rs` (`McpHandler`, backed by `mcp/client.rs`'s MCP protocol client and `mcp/pool.rs`'s connection pool). +- **`ownership.rs`** — `ToolOwnership::Client` versus + `ToolOwnership::Gateway(Option)`. A `GatewayBinding` combines the + resolved executor with the optional same-tool semaphore derived from its parallel + safety declaration. Keeping ownership explicit avoids inferring execution policy + from whether a handler happens to be present. - **`registry.rs`** — `ToolRegistry`, a request-scoped map from model-visible tool name - to `ToolEntry { tool_type, config, server_label, handler }`. Its constructor, + to `ToolEntry { tool_type, config, server_label, ownership }`. Its constructor, ```rust pub async fn build_with_handlers( tools: &mut [ResponsesTool], @@ -451,7 +569,18 @@ the behavioral layer — routing, handler traits, normalization, and execution. members, inserts one entry per declared/discovered tool, and for `Mcp`/`WebSearch` pulls the actual executor from `GatewayExecutors` (discovering live MCP tools via `tools/list` in the process). `ToolRegistry::dispatch(call)` is the per-call routing - method the tool loop uses to resolve and run one call. + method the Messages loop uses; the Responses `GatewayRound` resolves the same entry + directly so it can apply the binding's self-exclusion and lifecycle hooks. + + MCP discovery history is also request-scoped registry state: + `mcp_list_tools_items: HashMap>` groups records by + `server_label`. Registry construction puts the current discovery item first; + rehydration appends prior `InputItem::McpListTools` records only for labels already + present in that map. `mcp_list_tool_items()` exposes entries whose vector still has + exactly one element—the current item with no history—to both blocking output + assembly and streaming lifecycle emission. Streaming clears the map after the first + inference round. Consequently a server's list lifecycle is emitted only when no + prior list record exists and never repeats across rounds. - **`executors.rs`** — `GatewayExecutors`, a shared registry built once at startup and reused across requests, specifically for gateway tools that need **lazy, per-request connection setup**: MCP servers (connects and caches `McpClient`s keyed by server @@ -459,7 +588,8 @@ the behavioral layer — routing, handler traits, normalization, and execution. `WebSearchHandler`. As of today it only has slots for `ToolType::Mcp` and `ToolType::WebSearch` — `insert()` logs and no-ops for any other type. Client-owned tools (`function`, `custom`, `namespace`) never touch this file; their registry - entries are inserted with `handler: None` and no `GatewayExecutors` involvement. + entries are inserted with `ToolOwnership::Client` and no `GatewayExecutors` + involvement. **To add a new tool type:** 1. Implement `ToolHandler` (validate + normalize) for it. If it's client-executed, @@ -486,6 +616,8 @@ router, reusing the same core logic in-process. | Add a new HTTP or WebSocket route | `agentic-server/src/handler/{http,websocket}/`, wire it in `app.rs`'s `build_router_with_auth` | | Support a new upstream SSE event | `events/types.rs` → `events/normalize.rs` → `executor/accumulator.rs` (+ `gateway.rs`/`function_sse.rs` if it's gateway-synthesized) | | Add a new tool type | `tool/handler.rs` impl(s) → `tool/normalize.rs` → `tool/registry.rs` → `tool/executors.rs` if it needs lazy connection setup | +| Change gateway-round concurrency or lifecycle ordering | `executor/gateway.rs` (`GatewayRound`/event plans) + `executor/engine.rs` (round decision/ordered streaming) + `tool/ownership.rs` (same-tool safety) | +| Change continuation history visibility | `storage/types/item.rs::into_input_items` → `types/io/output.rs::to_input_item` (preservation) → `types/io/input.rs::model_input` (upstream visibility) | | Add a CRUD operation beyond persist/rehydrate | `executor/modes/conversation.rs` or `modes/response.rs`, backed by `storage/conversation.rs` / `storage/response.rs` | | Change how output items are assembled from a stream | `executor/accumulator.rs` — respect the `TryFrom`/`ApplyDone` pattern, don't add new public methods | | Add a new Responses/Messages wire field | `types/io/` or `types/messages/` — shape only, no behavior | diff --git a/CHANGELOG.md b/CHANGELOG.md index c21db227..a8cc5cd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to Agentic API are documented here. +## [Unreleased] + +### Changed + +- Forwarded `parallel_tool_calls` as the model-generation preference for typed + Responses requests, including built-in-only and mixed tool declarations (#181). +- Added bounded, configurable parallel execution for Responses gateway rounds, + preserving model call order and applying per-handler same-tool safety. +- Preserved MCP list-tools records in continuation history for registry lifecycle + decisions while excluding them from model input, preventing repeated public + list-tools emission on later turns. + ## [0.5.0] - 2026-08-25 ### Changed diff --git a/README.md b/README.md index b7e3a840..9cb3bbe6 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,10 @@ api_key_env = "YOU_API_KEY" [mcp] allowed_hosts = ["mcp.example.com"] +[tools] +# Upper bound for gateway-owned calls running at once within one Responses round. +max_concurrent_gateway_calls = 5 + [mcp_servers.counter] url = "https://mcp.example.com/mcp" allowed_tools = ["tool_1_name", "tool_2_name"] @@ -189,9 +193,10 @@ require_approval = "never" ``` `api_key_env` names the process environment variable containing the web-search credential; it does not contain the -credential itself. `YOU_API_BASE_URL` and `AGENTIC_MCP_ALLOWED_HOSTS` can override their typed file settings. The MCP -allowlist is used only for request-declared remote MCP URLs; configured `[mcp_servers]` entries are trusted operator -configuration. +credential itself. `YOU_API_BASE_URL`, `AGENTIC_MCP_ALLOWED_HOSTS`, and +`AGENTIC_MAX_CONCURRENT_GATEWAY_CALLS` can override their typed file settings. The concurrency value is a sliding-window +upper bound; handlers may further serialize calls to the same tool name. The MCP allowlist is used only for +request-declared remote MCP URLs; configured `[mcp_servers]` entries are trusted operator configuration. With that file in place, inject only the secret when starting the server: diff --git a/ROADMAP.md b/ROADMAP.md index 3085df94..9102e5a7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -71,15 +71,14 @@ the tool type. vLLM Agentic API should only execute tools that resolve to a configured gateway-owned handler. Unknown, unsupported, or ambiguous tool shapes are preserved and returned or passed through; they are never executed by default. -Core work: - -- Support true parallel tool calling for gateway-owned built-in tools: a single - turn should be able to invoke the same built-in tool more than once (for - example, two simultaneous web searches) and have every invocation execute - concurrently, with all results appended before continuing the agentic loop. - The executor's dispatch path already bounds concurrent execution internally, - but requests cannot yet exercise it this way end to end. Not yet implemented; - tracked by [#181](https://github.com/vllm-project/agentic-api/issues/181). +Requests may opt into parallel tool calling for gateway-owned built-in tools: a +single turn can invoke the same built-in tool more than once (for example, two +web searches). Agentic API forwards that model-generation preference upstream, +then executes emitted gateway calls through a bounded, configurable window. +Calls to different tool names can overlap; calls to the same name overlap only +when that handler declares it safe. Results retain model call order and are all +appended before continuing the agentic loop +([#181](https://github.com/vllm-project/agentic-api/issues/181)). Initial and expected tool areas include: diff --git a/TERMINOLOGY.md b/TERMINOLOGY.md index e2df7035..9c57a478 100644 --- a/TERMINOLOGY.md +++ b/TERMINOLOGY.md @@ -223,7 +223,9 @@ user-visible unit of interaction. ### tool registry The project-specific request-scoped mapping from model-visible tool names to their original type, configuration, and -available executor. It routes calls after inference; it is not part of the Responses wire format. +explicit ownership. Gateway-owned entries may contain a `GatewayBinding` with an executor and same-tool concurrency +policy. The registry routes calls after inference and also retains MCP discovery-history metadata; it is not part of +the Responses wire format. ### tool normalization diff --git a/crates/agentic-server-core/src/config.rs b/crates/agentic-server-core/src/config.rs index a384c767..f10caa0a 100644 --- a/crates/agentic-server-core/src/config.rs +++ b/crates/agentic-server-core/src/config.rs @@ -19,6 +19,7 @@ pub const DEFAULT_POSTGRES_STATEMENT_TIMEOUT_SECONDS: u64 = 30; pub const DEFAULT_SQLITE_MAX_CONNECTIONS: u32 = 4; pub const DEFAULT_SQLITE_JOURNAL_SIZE_LIMIT_BYTES: u64 = 6_144_000; pub const DEFAULT_SQLITE_MMAP_SIZE_BYTES: u64 = 268_435_456; +pub const DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS: usize = 5; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct PostgresConfig { @@ -89,12 +90,28 @@ pub struct WebSearchProviderConfig { pub base_url: Option, } -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone)] pub struct ToolRuntimeConfig { pub web_search: WebSearchProviderConfig, pub mcp_servers: HashMap, pub mcp_allowed_hosts: Vec, pub messages_gateway_tool_aliases: Option, + /// Upper bound on gateway-owned tool calls executing concurrently within one + /// round. A sliding window admits another call as one finishes. Individual + /// handlers may further serialize calls to the same tool name. + pub max_concurrent_gateway_calls: usize, +} + +impl Default for ToolRuntimeConfig { + fn default() -> Self { + Self { + web_search: WebSearchProviderConfig::default(), + mcp_servers: HashMap::default(), + mcp_allowed_hosts: Vec::default(), + messages_gateway_tool_aliases: None, + max_concurrent_gateway_calls: DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS, + } + } } #[derive(Debug, Clone)] diff --git a/crates/agentic-server-core/src/executor/compaction.rs b/crates/agentic-server-core/src/executor/compaction.rs index 6c84e282..39b8b421 100644 --- a/crates/agentic-server-core/src/executor/compaction.rs +++ b/crates/agentic-server-core/src/executor/compaction.rs @@ -95,6 +95,7 @@ fn item_has_meaningful_context(item: &InputItem) -> bool { || reasoning.encrypted_content.as_ref().is_some_and(value_has_content) } InputItem::Compaction(compaction) => !compaction.encrypted_content.trim().is_empty(), + InputItem::McpListTools(_) => false, InputItem::CompactionTrigger | InputItem::Unknown => false, } } diff --git a/crates/agentic-server-core/src/executor/engine.rs b/crates/agentic-server-core/src/executor/engine.rs index a17b676e..182e7dd5 100644 --- a/crates/agentic-server-core/src/executor/engine.rs +++ b/crates/agentic-server-core/src/executor/engine.rs @@ -14,11 +14,10 @@ use tracing::debug; use super::compaction::{compact_items, maybe_compact_context}; use super::gateway::{ - GatewayCallResult, LoopDecision, append_gateway_calls_to_new_input, append_output_items_to_input, - append_tool_outputs, classify_round, compaction_event_plans, complete_gateway_event_plans, - emit_gateway_completed_events, emit_gateway_start_events, emit_response_start_events, - execute_and_emit_output_calls, execute_output_calls, gateway_event_plans, has_client_owned_calls, - is_client_custom_call, is_gateway_owned_call, public_output_items, + GatewayCallResult, GatewayRound, append_gateway_calls_to_new_input, append_output_items_to_input, + append_tool_outputs, compaction_event_plans, complete_gateway_event_plans, emit_gateway_completed_events, + emit_gateway_start_events, emit_response_start_events, execute_and_emit_output_calls, gateway_event_plans, + has_client_owned_calls, public_output_items, }; use super::gateway_accumulator::{GatewayStreamAccumulator, StreamEvent, error_sse_chunk}; use crate::events::EventFrame; @@ -37,6 +36,50 @@ pub use crate::executor::inference::BoxStream; const MAX_GATEWAY_TOOL_ROUNDS: usize = 10; +/// Outcome of inspecting one inference round's output, deciding whether the +/// gateway tool loop should run another round, stop, or surface a partial result. +#[derive(Debug)] +#[non_exhaustive] +enum LoopDecision { + /// Gateway-owned calls were resolved this round; loop again with their + /// outputs appended to the conversation. + Continue, + /// No gateway work remains — the turn is final and the loop terminates. + Done, + /// One or more calls are client-owned (`function`, `custom`, or Codex + /// `namespace` tools); hand the turn back to the caller to execute. + RequiresClientAction, + /// The round cap was hit before the model stopped requesting tools. The + /// response is returned with `status: "incomplete"` rather than as an error. + Incomplete(String), +} + +/// Classify one turn's output into a [`LoopDecision`]. +/// +/// Order matters: client-owned calls take precedence (they must be handed back +/// even when gateway calls are also present in the same turn), then a +/// no-gateway-work turn is `Done`. Otherwise gateway tools ran — the loop would +/// continue, unless this was the last permitted round, in which case the budget +/// is exhausted and the turn is `Incomplete`. +/// +/// `round` is zero-based; `max_rounds` is the total budget. +fn classify_round( + has_client_owned_calls: bool, + gateway_results: &[GatewayCallResult], + round: usize, + max_rounds: usize, +) -> LoopDecision { + if has_client_owned_calls { + LoopDecision::RequiresClientAction + } else if gateway_results.is_empty() { + LoopDecision::Done + } else if round + 1 >= max_rounds { + LoopDecision::Incomplete(format!("gateway tool execution exceeded {max_rounds} rounds")) + } else { + LoopDecision::Continue + } +} + fn add_usage(total: ResponseUsage, usage: ResponseUsage) -> ResponseUsage { ResponseUsage { input_tokens: total.input_tokens.saturating_add(usage.input_tokens), @@ -124,13 +167,13 @@ async fn run_gateway_tool_loop( mut stream: Option<(&mut GatewayStreamAccumulator, &mpsc::UnboundedSender)>, ) -> ExecutorResult<(ResponsePayload, RequestContext)> { let mut executors = exec_ctx.gateway_executors.request_scoped(); - let registry: ToolRegistry = match ctx.enriched_request.tools.as_mut() { + let mut registry: ToolRegistry = match ctx.enriched_request.tools.as_mut() { Some(tools) => ToolRegistry::build_with_handlers(tools, &mut executors).await?, None => ToolRegistry::default(), }; + registry.cache_listed_mcp_tools(&ctx.enriched_request.input); let mut combined_output: Vec = registry - .mcp_list_tools_items() - .iter() + .mcp_list_tool_items() .map(mcp::handler::list_tools_output_item) .collect(); let mut combined_usage = None; @@ -151,6 +194,9 @@ async fn run_gateway_tool_loop( output_offset, ) .await?; + if round == 0 { + registry.clear_mcp_list_tool_items(); + } (stream_payload.payload, stream_payload.deferred_events) } else { (fetch_blocking_payload(&ctx, exec_ctx, auth).await?, Vec::new()) @@ -185,8 +231,8 @@ async fn run_gateway_tool_loop( combined_output.extend(public_output); match classify_round(has_client_owned, &gateway_results, round, MAX_GATEWAY_TOOL_ROUNDS) { - // Client-owned calls (plain function or Codex namespace tools) are - // handed back to the caller. Gateway calls in the same turn are + // Client-owned calls (function, custom, or Codex namespace tools) + // are handed back to the caller. Gateway calls in the same round are // still recorded so the returned conversation is complete. LoopDecision::RequiresClientAction => { append_gateway_calls_to_new_input(&mut ctx, ¤t_output, ®istry); @@ -324,18 +370,18 @@ async fn execute_and_emit_ordered_output_calls( let mut event_plans = gateway_event_plans(output_items, registry, output_offset); let first_gateway_index = output_items .iter() - .position(|item| matches!(item, OutputItem::FunctionCall(call) if is_gateway_owned_call(call, registry))); + .position(|item| matches!(item, OutputItem::FunctionCall(call) if registry.is_gateway_owned_name(&call.name))); let first_gateway_run_end = first_gateway_index .filter(|start| { - !output_items[..*start] - .iter() - .any(|item| matches!(item, OutputItem::FunctionCall(call) if is_client_custom_call(call, registry))) + !output_items[..*start].iter().any( + |item| matches!(item, OutputItem::FunctionCall(call) if registry.is_client_custom_name(&call.name)), + ) }) .map_or(0, |start| { output_items[start..] .iter() .take_while( - |item| matches!(item, OutputItem::FunctionCall(call) if is_gateway_owned_call(call, registry)), + |item| matches!(item, OutputItem::FunctionCall(call) if registry.is_gateway_owned_name(&call.name)), ) .count() .saturating_add(start) @@ -343,11 +389,11 @@ async fn execute_and_emit_ordered_output_calls( let first_gateway_run_len = first_gateway_run_end.saturating_sub(first_gateway_index.unwrap_or(0)); emit_gateway_start_events(&event_plans[..first_gateway_run_len], stream_accumulator, stream_sender)?; - let gateway_results = execute_output_calls(output_items, registry).await?; + let gateway_results = GatewayRound::new().execute(output_items, registry).await?; complete_gateway_event_plans(&mut event_plans, &gateway_results); let mut gateway_index = 0; for (index, item) in output_items.iter().enumerate() { - if matches!(item, OutputItem::FunctionCall(call) if is_gateway_owned_call(call, registry)) { + if matches!(item, OutputItem::FunctionCall(call) if registry.is_gateway_owned_name(&call.name)) { let plan = &event_plans[gateway_index..=gateway_index]; let result = &gateway_results[gateway_index..=gateway_index]; if index >= first_gateway_run_end { @@ -591,6 +637,8 @@ mod tests { use super::*; use crate::executor::modes::{ConversationHandler, ResponseHandler}; use crate::storage::{ConversationStore, InOutItem, ResponseStore, create_pool_with_schema}; + use crate::tool::{GatewayExecutorRegistration, McpDiscoveredHandler, McpHandler}; + use crate::types::tools::McpDiscoveredToolParam; use futures::StreamExt; use std::sync::Arc; use tokio::sync::Mutex; @@ -655,6 +703,33 @@ mod tests { (exec_ctx, server) } + async fn streaming_execution_context() -> (ExecutionContext, tokio::task::JoinHandle<()>) { + const UPSTREAM_SSE: &str = concat!( + "data: {\"type\":\"response.created\",\"response\":{\"id\":\"resp_upstream\",\"status\":\"in_progress\"}}\n\n", + "data: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"resp_upstream\",\"status\":\"in_progress\"}}\n\n", + "data: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp_upstream\",\"status\":\"completed\",\"usage\":null}}\n\n", + "data: [DONE]\n\n", + ); + let app = axum::Router::new().route( + "/v1/responses", + axum::routing::post(|| async { ([(axum::http::header::CONTENT_TYPE, "text/event-stream")], UPSTREAM_SSE) }), + ); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0") + .await + .expect("bind streaming mock inference server"); + let address = listener.local_addr().expect("mock server address"); + let server = tokio::spawn(async move { + axum::serve(listener, app).await.ok(); + }); + let exec_ctx = ExecutionContext::new( + ConversationHandler::new(ConversationStore::disabled()), + ResponseHandler::new(ResponseStore::disabled()), + Arc::new(reqwest::Client::new()), + format!("http://{address}"), + ); + (exec_ctx, server) + } + #[tokio::test] async fn compaction_trigger_returns_single_compaction_item_without_upstream_trigger() { let captured = Arc::new(Mutex::new(None)); @@ -740,6 +815,130 @@ mod tests { server.abort(); } + async fn streaming_response( + payload: RequestPayload, + exec_ctx: Arc, + ) -> (ResponsePayload, Vec) { + match ExecuteRequest::new(payload, exec_ctx) + .run() + .await + .expect("request succeeds") + { + Either::Left(_) => panic!("streaming request must return a stream"), + Either::Right(stream) => { + let events = stream + .collect::>() + .await + .into_iter() + .flat_map(|chunk| { + chunk + .lines() + .filter_map(|line| line.strip_prefix("data: ")) + .filter_map(|data| serde_json::from_str::(data).ok()) + .collect::>() + }) + .collect::>(); + let response = events + .iter() + .find_map(|event| { + (event["type"] == "response.completed") + .then(|| serde_json::from_value(event["response"].clone()).ok()) + .flatten() + }) + .expect("stream contains a completed response"); + (response, events) + } + } + } + + fn mcp_list_tools_lifecycle_event_count(events: &[serde_json::Value]) -> usize { + events + .iter() + .filter(|event| { + event["type"] + .as_str() + .is_some_and(|event_type| event_type.starts_with("response.mcp_list_tools.")) + || event["item"]["type"] == "mcp_list_tools" + }) + .count() + } + + #[tokio::test] + async fn streaming_previous_response_continuation_emits_mcp_list_tools_only_once() { + let (mut exec_ctx, server) = streaming_execution_context().await; + let pool = create_pool_with_schema(Some("sqlite::memory:")) + .await + .expect("create response store"); + exec_ctx.resp_handler = ResponseHandler::new(ResponseStore::new(pool)); + exec_ctx.gateway_executors.insert(GatewayExecutorRegistration::Mcp { + server_label: "counter".to_owned(), + handlers: vec![McpDiscoveredHandler { + param: McpDiscoveredToolParam { + server_label: "counter".to_owned(), + tool_name: "read".to_owned(), + internal_name: "mcp__counter__read".to_owned(), + tool: serde_json::from_value(serde_json::json!({ + "name": "read", + "description": "Read the counter", + "inputSchema": {"type": "object"} + })) + .expect("valid MCP tool"), + }, + handler: Arc::new(McpHandler::discovered_tool_spec_only()), + }], + }); + let exec_ctx = Arc::new(exec_ctx); + + let first_request: RequestPayload = serde_json::from_value(serde_json::json!({ + "model": "test-model", + "stream": true, + "store": true, + "input": "first turn", + "tools": [{ + "type": "mcp", + "server_label": "counter", + "allowed_tools": ["read"], + "require_approval": "never" + }] + })) + .expect("valid first request"); + let (first_response, first_events) = streaming_response(first_request, Arc::clone(&exec_ctx)).await; + assert_eq!( + first_response + .output + .iter() + .filter(|item| matches!(item, OutputItem::McpListTools(_))) + .count(), + 1 + ); + assert_eq!(mcp_list_tools_lifecycle_event_count(&first_events), 4); + + let second_request: RequestPayload = serde_json::from_value(serde_json::json!({ + "model": "test-model", + "stream": true, + "store": true, + "input": "second turn", + "previous_response_id": first_response.id, + "tools": [{ + "type": "mcp", + "server_label": "counter", + "allowed_tools": ["read"], + "require_approval": "never" + }] + })) + .expect("valid continuation request"); + let (second_response, second_events) = streaming_response(second_request, exec_ctx).await; + assert!( + second_response + .output + .iter() + .all(|item| !matches!(item, OutputItem::McpListTools(_))) + ); + assert_eq!(mcp_list_tools_lifecycle_event_count(&second_events), 0); + + server.abort(); + } + #[tokio::test] async fn compaction_trigger_streams_one_compaction_item_then_completed() { let captured = Arc::new(Mutex::new(None)); diff --git a/crates/agentic-server-core/src/executor/error.rs b/crates/agentic-server-core/src/executor/error.rs index 5879bf74..2248fa77 100644 --- a/crates/agentic-server-core/src/executor/error.rs +++ b/crates/agentic-server-core/src/executor/error.rs @@ -111,7 +111,7 @@ impl ExecutorError { Self::Storage(e) if e.is_not_found() => StatusCode::NOT_FOUND, Self::LLMRequest { status, .. } | Self::LLMTransport { status, .. } => *status, Self::ConversationLocked { .. } - | Self::Tool(ToolError::Config(_)) + | Self::Tool(ToolError::Config(_) | ToolError::MissingOutput { .. }) | Self::InvalidRequest(_) | Self::JsonError(_) => StatusCode::BAD_REQUEST, Self::Tool(ToolError::Execution(_)) | Self::CompactionFailed { .. } => StatusCode::BAD_GATEWAY, @@ -125,7 +125,7 @@ impl ExecutorError { pub fn error_type(&self) -> &'static str { match self.client_visible_error() { Self::ConversationLocked { .. } - | Self::Tool(ToolError::Config(_)) + | Self::Tool(ToolError::Config(_) | ToolError::MissingOutput { .. }) | Self::InvalidRequest(_) | Self::ParseError(_) | Self::JsonError(_) => "invalid_request_error", diff --git a/crates/agentic-server-core/src/executor/gateway.rs b/crates/agentic-server-core/src/executor/gateway.rs index f5721718..246e0f93 100644 --- a/crates/agentic-server-core/src/executor/gateway.rs +++ b/crates/agentic-server-core/src/executor/gateway.rs @@ -1,27 +1,46 @@ +use std::sync::OnceLock; use std::time::Duration; use futures::StreamExt; use futures::stream as futures_stream; +use crate::config::DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS; use crate::events::SSEEventType; use crate::executor::error::{ExecutorError, ExecutorResult}; use crate::executor::gateway_accumulator::{GatewayStreamAccumulator, StreamEvent, emit_sse_frame, synthetic_event}; use crate::executor::request::RequestContext; -use crate::tool::{GatewayDispatchResult, ToolError, ToolOutput, ToolRegistry, ToolType}; +use crate::tool::{ToolError, ToolOutput, ToolOwnership, ToolRegistry, ToolType}; use crate::types::io::output::{FunctionToolCall, GatewayCallStatus, McpCallStatus}; use crate::types::io::{InputItem, OutputItem, ResponsesInput}; use crate::types::request_response::ResponsePayload; use crate::utils::common::{serialize_to_string, serialize_to_value}; -/// Max gateway tool calls executing at once within a round. A sliding window: +/// Upper bound on gateway tool calls executing at once within a round. A sliding window: /// as one call finishes, the next is admitted, so a round with N calls never /// runs more than this many concurrently but still drains all N. Bounds /// outbound fan-out without a hard per-round count cap. +/// Per-tool self-exclusion may reduce actual concurrency below this limit. /// /// The call count is bounded upstream by the model's output size — there is no /// unbounded in-memory materialisation from the model emitting arbitrarily many /// tool calls. The window + per-call timeout bound outbound HTTP and latency. -const MAX_CONCURRENT_GATEWAY_CALLS: usize = 5; +/// +/// Resolved once from [`Config::tools.max_concurrent_gateway_calls`](crate::config::ToolRuntimeConfig::max_concurrent_gateway_calls) +/// via [`set_max_concurrent_gateway_calls`] when `ExecutionContext` is built from +/// config; falls back to [`DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS`] otherwise (e.g. +/// in tests that construct `ExecutionContext::new` directly). +static MAX_CONCURRENT_GATEWAY_CALLS: OnceLock = OnceLock::new(); + +/// Sets the process-wide gateway concurrency limit. Called once, from +/// `ExecutionContext::from_config`. Subsequent calls are no-ops: the value is +/// fixed for the lifetime of the process. +pub fn set_max_concurrent_gateway_calls(value: usize) { + let _ = MAX_CONCURRENT_GATEWAY_CALLS.set(value); +} + +fn max_concurrent_gateway_calls() -> usize { + *MAX_CONCURRENT_GATEWAY_CALLS.get_or_init(|| DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS) +} /// Per-call wall-clock budget. A tool exceeding this yields an error output fed /// back to the model (never a whole-request failure). `Duration::ZERO` disables @@ -32,53 +51,6 @@ const MAX_CONCURRENT_GATEWAY_CALLS: usize = 5; /// would be the place to cap total time end-to-end. const GATEWAY_TOOL_TIMEOUT: Duration = Duration::from_secs(60); -/// Outcome of inspecting one inference turn's output, deciding whether the -/// gateway tool loop should run another round, stop, or surface a partial result. -/// -/// `#[non_exhaustive]` so downstream variants can be added without breaking -/// existing match arms. -#[derive(Debug)] -#[non_exhaustive] -pub(super) enum LoopDecision { - /// Gateway tools were dispatched this round; loop again with their outputs - /// appended to the conversation. - Continue, - /// No gateway work remains — the turn is final and the loop terminates. - Done, - /// One or more calls are client-owned (plain `function` or Codex - /// `namespace` tools); hand the turn back to the caller to execute. - RequiresClientAction, - /// The round cap was hit before the model stopped requesting tools. The - /// response is returned with `status: "incomplete"` rather than as an error. - Incomplete(String), -} - -/// Classify one turn's output into a [`LoopDecision`]. -/// -/// Order matters: client-owned calls take precedence (they must be handed back -/// even when gateway calls are also present in the same turn), then a -/// no-gateway-work turn is `Done`. Otherwise gateway tools ran — the loop would -/// continue, unless this was the last permitted round, in which case the budget -/// is exhausted and the turn is `Incomplete`. -/// -/// `round` is zero-based; `max_rounds` is the total budget. -pub(super) fn classify_round( - has_client_owned_calls: bool, - gateway_results: &[GatewayCallResult], - round: usize, - max_rounds: usize, -) -> LoopDecision { - if has_client_owned_calls { - LoopDecision::RequiresClientAction - } else if gateway_results.is_empty() { - LoopDecision::Done - } else if round + 1 >= max_rounds { - LoopDecision::Incomplete(format!("gateway tool execution exceeded {max_rounds} rounds")) - } else { - LoopDecision::Continue - } -} - #[derive(Clone)] pub(super) struct GatewayCallResult { pub(super) call: FunctionToolCall, @@ -121,18 +93,6 @@ fn function_calls(output_items: &[OutputItem]) -> Vec { .collect() } -pub(super) fn is_gateway_owned_call(call: &FunctionToolCall, registry: &ToolRegistry) -> bool { - registry - .lookup(&call.name) - .is_some_and(|entry| entry.tool_type.is_gateway_owned()) -} - -pub(super) fn is_client_custom_call(call: &FunctionToolCall, registry: &ToolRegistry) -> bool { - registry - .lookup(&call.name) - .is_some_and(|entry| entry.tool_type == ToolType::Custom) -} - pub(super) fn has_client_owned_calls(output_items: &[OutputItem], registry: &ToolRegistry) -> bool { output_items.iter().any(|item| item.requires_client_action(registry)) } @@ -145,109 +105,134 @@ fn execution_error_output(call: &FunctionToolCall, message: &str) -> ExecutorRes }) } -async fn execute_gateway_call(call: FunctionToolCall, registry: &ToolRegistry) -> ExecutorResult { - execute_gateway_call_with_timeout(call, registry, GATEWAY_TOOL_TIMEOUT).await +/// Executes one round's gateway-owned calls with bounded concurrency and +/// per-tool same-name exclusion. +pub(super) struct GatewayRound { + timeout: Duration, } -async fn execute_gateway_call_with_timeout( - call: FunctionToolCall, - registry: &ToolRegistry, - timeout: Duration, -) -> ExecutorResult { - // Resolve the tool type up front so a timeout (which yields no dispatch - // result) can still shape the correct public output. - let Some(tool_type) = registry.lookup(&call.name).map(|entry| entry.tool_type) else { - return Err(ExecutorError::InvalidRequest(format!( - "gateway tool '{}' was not dispatchable", - call.name - ))); - }; - - // Per-call timeout: a hung tool becomes an error output fed back to the - // model, never a whole-request failure. `Duration::ZERO` opts out. - let dispatched = if timeout.is_zero() { - registry.dispatch(&call).await - } else { - match tokio::time::timeout(timeout, registry.dispatch(&call)).await { - Ok(dispatched) => dispatched, - Err(_elapsed) => Some(GatewayDispatchResult { - tool_type, - output: Err(ToolError::Execution(format!( - "gateway tool '{}' timed out after {timeout:?}", - call.name - ))), - }), +impl GatewayRound { + pub(super) fn new() -> Self { + Self { + timeout: GATEWAY_TOOL_TIMEOUT, } - }; - - // An entry exists (the call was filtered to gateway-owned) but carries no - // handler — this server was built without that tool's executor. Treat it - // like the timeout path: surface an error output fed back to the model - // rather than failing the whole request, keeping the "never a - // whole-request failure" contract total. - let dispatch = dispatched.unwrap_or_else(|| GatewayDispatchResult { - tool_type, - output: Err(ToolError::Execution(format!( - "gateway tool '{}' has no registered handler", - call.name - ))), - }); - let (output, status) = match dispatch.output { - Ok(output) => (output, GatewayCallStatus::Completed), - Err(ToolError::Execution(message) | ToolError::Config(message)) => { - (execution_error_output(&call, &message)?, GatewayCallStatus::Failed) - } - }; - let public_output = gateway_public_output(dispatch.tool_type, &call, &output, status, registry); - Ok(GatewayCallResult { - call, - input_item: InputItem::FunctionCallOutput(output.into()), - public_output, - }) -} + } -fn gateway_public_output( - tool_type: ToolType, - call: &FunctionToolCall, - output: &ToolOutput, - status: GatewayCallStatus, - registry: &ToolRegistry, -) -> Option { - match tool_type { - ToolType::WebSearch => Some(crate::tool::web_search::output_item(call, output, status)), - ToolType::Mcp => registry - .mcp_tool_ref(&call.name) - .map(|tool_ref| crate::tool::mcp::handler::output_item(call, output, status, tool_ref)), - ToolType::Function - | ToolType::Custom - | ToolType::CodexNamespace - | ToolType::FileSearch - | ToolType::CodeInterpreter => None, + /// Same as [`Self::new`] but with an injectable per-call timeout, so tests + /// can exercise the timeout path without waiting out the real budget. + #[cfg(test)] + fn with_timeout(timeout: Duration) -> Self { + Self { timeout } } -} -pub(super) async fn execute_output_calls( - output_items: &[OutputItem], - registry: &ToolRegistry, -) -> ExecutorResult> { - let calls = function_calls(output_items); - let gateway_calls = registry.gateway_owned(&calls); - - // Execute all gateway calls concurrently with a sliding window of - // `MAX_CONCURRENT_GATEWAY_CALLS`: `buffered` admits the next call as soon as - // one finishes, so arbitrary fan-out drains safely without a hard count cap. - // Each call is individually timeout-bounded in `execute_gateway_call`. - futures_stream::iter( - gateway_calls - .into_iter() - .cloned() - .map(|call| execute_gateway_call(call, registry)), - ) - .buffered(MAX_CONCURRENT_GATEWAY_CALLS) - .collect::>() - .await - .into_iter() - .collect() + /// Runs every gateway-owned call in `output_items` under the + /// `max_concurrent_gateway_calls()` upper bound. `buffered` admits the next + /// call as soon as one finishes; each resolved binding may additionally + /// serialize calls to its own tool name. Result order matches call order + /// regardless of completion order. + pub(super) async fn execute( + &self, + output_items: &[OutputItem], + registry: &ToolRegistry, + ) -> ExecutorResult> { + let calls = function_calls(output_items); + let gateway_calls = registry.gateway_owned(&calls); + + futures_stream::iter( + gateway_calls + .into_iter() + .cloned() + .map(|call| self.run_one(call, registry)), + ) + .buffered(max_concurrent_gateway_calls()) + .collect::>() + .await + .into_iter() + .collect() + } + + /// Resolves the call's `GatewayBinding`, takes its `self_exclusion` permit + /// if it has one (gating only concurrent calls to this SAME tool name — + /// never other tools), dispatches with a timeout, and shapes the public + /// output via the resolved handler. + async fn run_one(&self, call: FunctionToolCall, registry: &ToolRegistry) -> ExecutorResult { + let Some(entry) = registry.lookup(&call.name) else { + return Err(ExecutorError::InvalidRequest(format!( + "gateway tool '{}' was not dispatchable", + call.name + ))); + }; + let ToolOwnership::Gateway(binding) = &entry.ownership else { + return Err(ExecutorError::InvalidRequest(format!( + "'{}' is not a gateway tool", + call.name + ))); + }; + let config = entry.config.clone(); + + let Some(binding) = binding else { + // Registered as gateway-owned but no handler implemented yet + // (`FileSearch`/`CodeInterpreter` today). Surface an error output + // fed back to the model rather than failing the whole request. + let output = execution_error_output( + &call, + &format!("gateway tool '{}' has no registered handler", call.name), + )?; + return Ok(GatewayCallResult { + call, + input_item: InputItem::FunctionCallOutput(output.into()), + public_output: None, + }); + }; + + let _permit = match &binding.self_exclusion { + Some(semaphore) => Some(semaphore.acquire().await.expect("semaphore is never closed")), + None => None, + }; + + // Per-call timeout: a hung tool becomes an error output fed back to + // the model, never a whole-request failure. A zero timeout opts out + // (used by tests exercising the "no registered handler" path without + // waiting). + let dispatched = if self.timeout.is_zero() { + binding + .handler + .execute(&call.call_id, &call.name, &call.arguments, &config) + .await + } else { + match tokio::time::timeout( + self.timeout, + binding + .handler + .execute(&call.call_id, &call.name, &call.arguments, &config), + ) + .await + { + Ok(output) => output, + Err(_elapsed) => Err(ToolError::Execution(format!( + "gateway tool '{}' timed out after {:?}", + call.name, self.timeout + ))), + } + }; + let (output, status) = match dispatched { + Ok(output) => (output, GatewayCallStatus::Completed), + Err(ToolError::Execution(message) | ToolError::Config(message)) => { + (execution_error_output(&call, &message)?, GatewayCallStatus::Failed) + } + // No `GatewayExecutor::execute` implementation ever returns this — + // it's only raised as a request-validation error before dispatch + // begins (`executor::rehydrate`). Propagate rather than treat as a + // per-call failure if that invariant is ever violated. + Err(error @ ToolError::MissingOutput { .. }) => return Err(ExecutorError::from(error)), + }; + let public_output = binding.handler.public_output(&call, &output, status); + Ok(GatewayCallResult { + call, + input_item: InputItem::FunctionCallOutput(output.into()), + public_output, + }) + } } pub(super) fn public_output_items( @@ -258,14 +243,10 @@ pub(super) fn public_output_items( output_items .iter() .map(|item| match item { - OutputItem::FunctionCall(call) - if registry - .lookup(&call.name) - .is_some_and(|entry| entry.tool_type == ToolType::Custom) => - { + OutputItem::FunctionCall(call) if registry.is_client_custom_name(&call.name) => { crate::tool::CustomHandler::output_item(call) } - OutputItem::FunctionCall(call) if is_gateway_owned_call(call, registry) => gateway_results + OutputItem::FunctionCall(call) if registry.is_gateway_owned_name(&call.name) => gateway_results .iter() .find(|result| result.call.call_id == call.call_id) .and_then(|result| result.public_output.clone()) @@ -285,22 +266,12 @@ pub(super) fn gateway_event_plans( for item in output_items { if let OutputItem::FunctionCall(call) = item && let Some(entry) = registry.lookup(&call.name) - && entry.tool_type.is_gateway_owned() + && let ToolOwnership::Gateway(Some(binding)) = &entry.ownership { plans.push(GatewayEventPlan { output_index: u32::try_from(output_index).unwrap_or(u32::MAX), arguments: (entry.tool_type == ToolType::Mcp).then(|| call.arguments.clone()), - started_output: match entry.tool_type { - ToolType::WebSearch => Some(crate::tool::web_search::started_output_item(call)), - ToolType::Mcp => registry - .mcp_tool_ref(&call.name) - .map(|tool_ref| crate::tool::mcp::handler::started_output_item(call, tool_ref)), - ToolType::Function - | ToolType::Custom - | ToolType::CodexNamespace - | ToolType::FileSearch - | ToolType::CodeInterpreter => None, - }, + started_output: binding.handler.started_output(call), completed_output: None, }); } @@ -543,7 +514,7 @@ pub(super) async fn execute_and_emit_output_calls( if let Some((stream_accumulator, stream_sender)) = stream.as_mut() { emit_gateway_start_events(&event_plans, stream_accumulator, stream_sender)?; } - let gateway_results = execute_output_calls(output_items, registry).await?; + let gateway_results = GatewayRound::new().execute(output_items, registry).await?; complete_gateway_event_plans(&mut event_plans, &gateway_results); if let Some((stream_accumulator, stream_sender)) = stream.as_mut() { emit_gateway_completed_events(&gateway_results, &event_plans, stream_accumulator, stream_sender)?; @@ -575,7 +546,7 @@ pub(super) fn append_input_item(input: &mut ResponsesInput, item: InputItem) { } pub(super) fn append_output_items_to_input(input: &mut ResponsesInput, output_items: &[OutputItem]) { - for input_item in output_items.iter().filter_map(OutputItem::to_input_item) { + for input_item in output_items.iter().flat_map(OutputItem::to_input_item) { append_input_item(input, input_item); } } @@ -596,20 +567,20 @@ pub(super) fn append_gateway_calls_to_new_input( let OutputItem::FunctionCall(call) = item else { return None; }; - is_gateway_owned_call(call, registry).then(|| InputItem::FunctionCall(call.clone().into())) + registry + .is_gateway_owned_name(&call.name) + .then(|| InputItem::FunctionCall(call.clone().into())) })); } #[cfg(test)] mod tests { - use super::{GatewayCallResult, LoopDecision, classify_round}; + use super::GatewayCallResult; use crate::executor::accumulator::ResponseAccumulator; use crate::types::io::output::{FunctionToolCall, McpListTool, McpListTools}; use crate::types::io::{CompactionItem, InputItem, McpCallStatus}; use tokio::sync::mpsc; - const MAX: usize = 10; - fn parse_named_sse_event(content: &str) -> Value { let body = content.strip_suffix("\n\n").expect("SSE event terminator"); let (event_line, data_line) = body.split_once('\n').expect("named SSE event and data lines"); @@ -620,74 +591,15 @@ mod tests { event } - fn dummy_result() -> GatewayCallResult { - let call = FunctionToolCall { - id: "id".to_owned(), - call_id: "call".to_owned(), - name: "web_search".to_owned(), - arguments: "{}".to_owned(), - status: crate::types::event::MessageStatus::Completed, - namespace: None, - }; - GatewayCallResult { - call, - input_item: InputItem::FunctionCallOutput( - crate::tool::ToolOutput { - call_id: "call".to_owned(), - output: "{}".to_owned(), - } - .into(), - ), - public_output: None, - } - } - - #[test] - fn client_owned_calls_take_precedence_over_gateway_results() { - // Even with gateway results present in the same turn, a client-owned call - // must hand control back to the caller. - let decision = classify_round(true, &[dummy_result()], 0, MAX); - assert!(matches!(decision, LoopDecision::RequiresClientAction)); - } - - #[test] - fn no_gateway_work_is_done() { - let decision = classify_round(false, &[], 0, MAX); - assert!(matches!(decision, LoopDecision::Done)); - } - - #[test] - fn gateway_results_with_budget_remaining_continue() { - let decision = classify_round(false, &[dummy_result()], 0, MAX); - assert!(matches!(decision, LoopDecision::Continue)); - } - - #[test] - fn gateway_results_on_final_round_are_incomplete() { - // round is zero-based: round 9 is the 10th and last permitted round. - let decision = classify_round(false, &[dummy_result()], MAX - 1, MAX); - match decision { - LoopDecision::Incomplete(reason) => assert!(reason.contains("exceeded 10 rounds")), - other => panic!("expected Incomplete, got {other:?}"), - } - } - - #[test] - fn incomplete_only_fires_when_gateway_work_remains() { - // On the final round with no gateway work, the turn is still Done — the - // cap only matters when the model is still requesting tools. - let decision = classify_round(false, &[], MAX - 1, MAX); - assert!(matches!(decision, LoopDecision::Done)); - } - use std::pin::Pin; use std::sync::Arc; use serde_json::Value; - use super::execute_gateway_call_with_timeout; + use super::GatewayRound; use crate::tool::{GatewayExecutor, GatewayExecutors, ToolError, ToolHandler, ToolOutput, ToolRegistry, ToolType}; use crate::types::io::OutputItem; + use crate::types::io::output::GatewayCallStatus; use crate::types::io::tools::FunctionTool; use crate::types::tools::ResponsesTool; @@ -724,6 +636,23 @@ mod tests { }) }) } + + fn supports_parallel_execution(&self) -> bool { + true + } + + fn started_output(&self, call: &FunctionToolCall) -> Option { + Some(crate::tool::web_search::started_output_item(call)) + } + + fn public_output( + &self, + call: &FunctionToolCall, + output: &ToolOutput, + status: GatewayCallStatus, + ) -> Option { + Some(crate::tool::web_search::output_item(call, output, status)) + } } fn web_search_call(call_id: &str) -> FunctionToolCall { @@ -750,13 +679,10 @@ mod tests { // 1ms budget vs a 50ms tool → the timeout fires. Must return (not hang): // the stuck call becomes an error output the loop can feed back. - let result = execute_gateway_call_with_timeout( - web_search_call("call_hang"), - ®istry, - std::time::Duration::from_millis(1), - ) - .await - .expect("timeout is isolated as an error output, not a dispatch failure"); + let result = GatewayRound::with_timeout(std::time::Duration::from_millis(1)) + .run_one(web_search_call("call_hang"), ®istry) + .await + .expect("timeout is isolated as an error output, not a dispatch failure"); assert_eq!(result.call.call_id, "call_hang"); // A failed web_search still yields a public web_search_call item. @@ -773,11 +699,12 @@ mod tests { } #[tokio::test] - async fn gateway_call_without_registered_handler_becomes_error_output() { - // Declare web_search but build the registry with NO executor for it — - // the entry exists and is gateway-owned, so the call is not filtered - // out, but `dispatch` yields `None`. This must surface an error output, - // not fail the whole request. + async fn gateway_call_without_configured_provider_becomes_error_output() { + // Declare web_search but build the registry with NO provider for it — + // `web_search_handler()` falls back to `WebSearchHandler::spec_only()`, + // so the entry still has a real handler (public_output/started_output + // work normally) but `execute()` fails. This must surface an error + // output, not fail the whole request. let web_search: ResponsesTool = serde_json::from_value(serde_json::json!({"type": "web_search_preview"})).expect("web_search tool param"); let mut tools = [web_search]; @@ -786,10 +713,10 @@ mod tests { .await .expect("registry builds"); - let result = - execute_gateway_call_with_timeout(web_search_call("call_no_handler"), ®istry, std::time::Duration::ZERO) - .await - .expect("a missing handler is isolated as an error output, not a dispatch failure"); + let result = GatewayRound::with_timeout(std::time::Duration::ZERO) + .run_one(web_search_call("call_no_handler"), ®istry) + .await + .expect("a missing provider is isolated as an error output, not a dispatch failure"); assert_eq!(result.call.call_id, "call_no_handler"); assert!(matches!(result.public_output, Some(OutputItem::WebSearchCall(_)))); @@ -798,8 +725,116 @@ mod tests { }; let body = serde_json::to_string(msg).expect("serialize output"); assert!( - body.contains("no registered handler"), - "error output should mention the missing handler: {body}" + body.contains("spec-only handler cannot execute tools"), + "error output should mention the missing provider: {body}" + ); + } + + /// Proves that a handler which opts into same-tool parallel execution really + /// overlaps calls under the global window. Four 50ms calls sequentially would + /// take ~200ms; with the default window of five they should finish near one slot. + #[tokio::test] + async fn gateway_round_overlaps_parallel_safe_same_tool_calls() { + let web_search: ResponsesTool = + serde_json::from_value(serde_json::json!({"type": "web_search_preview"})).expect("web_search tool param"); + let mut executors = GatewayExecutors::default(); + executors.insert(Arc::new(SlowExecutor)); + let mut tools = [web_search]; + let registry = ToolRegistry::build_with_handlers(&mut tools, &mut executors) + .await + .expect("registry builds"); + + let output_items: Vec = ["call_a", "call_b", "call_c", "call_d"] + .into_iter() + .map(|call_id| OutputItem::FunctionCall(web_search_call(call_id))) + .collect(); + + let started = std::time::Instant::now(); + let results = GatewayRound::new() + .execute(&output_items, ®istry) + .await + .expect("all calls execute"); + let elapsed = started.elapsed(); + + assert_eq!(results.len(), 4); + // Well under the ~200ms four sequential 50ms calls would take, and close to + // one 50ms slot -- proves the calls actually overlapped in wall-clock time. + assert!( + elapsed < std::time::Duration::from_millis(150), + "four concurrent 50ms calls took {elapsed:?}, expected well under 150ms" + ); + // buffered() preserves call order regardless of completion order. + assert_eq!( + results.iter().map(|r| r.call.call_id.as_str()).collect::>(), + vec!["call_a", "call_b", "call_c", "call_d"] + ); + } + + /// A handler that inherits the conservative `false` default serializes calls + /// to its own tool name. This does not prevent different tool names from + /// overlapping elsewhere in the same round. + struct ExclusiveSlowExecutor; + + impl ToolHandler for ExclusiveSlowExecutor { + fn tool_type(&self) -> ToolType { + ToolType::WebSearch + } + fn validate(&self, _param: &Value) -> Result<(), ToolError> { + Ok(()) + } + fn normalize(&self, _param: &Value) -> Vec { + Vec::new() + } + } + + impl GatewayExecutor for ExclusiveSlowExecutor { + fn execute( + &self, + call_id: &str, + _tool_name: &str, + _arguments: &str, + _config: &Value, + ) -> Pin> + Send + '_>> { + let call_id = call_id.to_owned(); + Box::pin(async move { + tokio::time::sleep(std::time::Duration::from_millis(50)).await; + Ok(ToolOutput { + call_id, + output: "unreachable".to_owned(), + }) + }) + } + } + + #[tokio::test] + async fn gateway_round_serializes_non_parallel_safe_same_tool_calls() { + let web_search: ResponsesTool = + serde_json::from_value(serde_json::json!({"type": "web_search_preview"})).expect("web_search tool param"); + let mut executors = GatewayExecutors::default(); + executors.insert(Arc::new(ExclusiveSlowExecutor)); + let mut tools = [web_search]; + let registry = ToolRegistry::build_with_handlers(&mut tools, &mut executors) + .await + .expect("registry builds"); + + let output_items: Vec = ["call_a", "call_b", "call_c", "call_d"] + .into_iter() + .map(|call_id| OutputItem::FunctionCall(web_search_call(call_id))) + .collect(); + + let started = std::time::Instant::now(); + let results = GatewayRound::new() + .execute(&output_items, ®istry) + .await + .expect("all calls execute"); + let elapsed = started.elapsed(); + + assert_eq!(results.len(), 4); + // Four 50ms calls run sequentially (one at a time) should take close to + // 200ms -- well above what four *concurrent* 50ms calls would take. + assert!( + elapsed >= std::time::Duration::from_millis(180), + "four exclusive 50ms calls took {elapsed:?}, expected close to 200ms" ); } diff --git a/crates/agentic-server-core/src/executor/mod.rs b/crates/agentic-server-core/src/executor/mod.rs index 7f261d72..be9860ac 100644 --- a/crates/agentic-server-core/src/executor/mod.rs +++ b/crates/agentic-server-core/src/executor/mod.rs @@ -16,6 +16,7 @@ pub mod request; mod gateway; pub mod gateway_accumulator; +mod pending_calls; mod upstream; pub use compaction::compact_response; diff --git a/crates/agentic-server-core/src/executor/pending_calls.rs b/crates/agentic-server-core/src/executor/pending_calls.rs new file mode 100644 index 00000000..20270cb5 --- /dev/null +++ b/crates/agentic-server-core/src/executor/pending_calls.rs @@ -0,0 +1,120 @@ +//! Detects calls in an item sequence that never received a resolving output. +//! +//! Gateway-owned calls are always resolved within the same turn (their +//! output is appended before the turn ends), so anything still unresolved +//! after scanning a full item sequence is, by construction, something the +//! *client* owed a resolution for. + +use crate::types::io::InputItem; + +/// A client-owned call (plain `function`, Codex `namespace` member, or +/// `custom` tool) with no later matching output in the same item sequence. +pub(super) struct PendingCall { + pub(super) call_id: String, +} + +/// Scans `items` in order and returns every call left unresolved, in +/// emission order. A call counts as resolved once a later matching +/// `FunctionCallOutput`/`CustomToolCallOutput` with the same `call_id` +/// appears. Namespace member calls are represented as `InputItem::FunctionCall` +/// (their flattened name lives in the `name` field), so they're covered by +/// the same check as plain function calls. +pub(super) fn pending_calls(items: &[InputItem]) -> Vec { + let mut pending = Vec::new(); + for item in items { + match item { + InputItem::FunctionCall(call) => pending.push(call.call_id.clone()), + InputItem::CustomToolCall(call) => pending.push(call.call_id.clone()), + InputItem::FunctionCallOutput(output) => pending.retain(|call_id| *call_id != output.call_id), + InputItem::CustomToolCallOutput(output) => pending.retain(|call_id| *call_id != output.call_id), + InputItem::Message(_) + | InputItem::Reasoning(_) + | InputItem::McpListTools(_) + | InputItem::Compaction(_) + | InputItem::CompactionTrigger + | InputItem::Unknown => {} + } + } + pending.into_iter().map(|call_id| PendingCall { call_id }).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::types::io::{ + CustomToolCall, CustomToolCallOutputMessage, FunctionToolResultMessage, InputFunctionToolCall, ToolCallOutput, + }; + + fn function_call(call_id: &str) -> InputItem { + InputItem::FunctionCall(InputFunctionToolCall { + id: None, + call_id: call_id.to_owned(), + name: "get_weather".to_owned(), + namespace: None, + arguments: "{}".to_owned(), + status: None, + }) + } + + fn function_call_output(call_id: &str) -> InputItem { + InputItem::FunctionCallOutput(FunctionToolResultMessage { + call_id: call_id.to_owned(), + output: ToolCallOutput::Text(String::new()), + }) + } + + fn custom_tool_call(call_id: &str) -> InputItem { + InputItem::CustomToolCall(CustomToolCall { + id: String::new(), + status: None, + call_id: call_id.to_owned(), + name: "freeform".to_owned(), + input: String::new(), + }) + } + + fn custom_tool_call_output(call_id: &str) -> InputItem { + InputItem::CustomToolCallOutput(CustomToolCallOutputMessage { + call_id: call_id.to_owned(), + name: None, + output: ToolCallOutput::Text(String::new()), + }) + } + + #[test] + fn resolved_calls_are_not_pending() { + let items = vec![function_call("call_1"), function_call_output("call_1")]; + assert!(pending_calls(&items).is_empty()); + } + + #[test] + fn unresolved_function_call_is_reported_in_order() { + let items = vec![ + function_call("call_1"), + function_call("call_2"), + function_call_output("call_1"), + ]; + let pending = pending_calls(&items); + assert_eq!(pending.len(), 1); + assert_eq!(pending[0].call_id, "call_2"); + } + + #[test] + fn unresolved_custom_tool_call_is_reported() { + let items = vec![custom_tool_call("call_1")]; + let pending = pending_calls(&items); + assert_eq!(pending.len(), 1); + assert_eq!(pending[0].call_id, "call_1"); + } + + #[test] + fn custom_tool_call_output_resolves_custom_tool_call() { + let items = vec![custom_tool_call("call_1"), custom_tool_call_output("call_1")]; + assert!(pending_calls(&items).is_empty()); + } + + #[test] + fn empty_items_have_no_pending_calls() { + assert!(pending_calls(&[]).is_empty()); + } +} diff --git a/crates/agentic-server-core/src/executor/rehydrate.rs b/crates/agentic-server-core/src/executor/rehydrate.rs index 6b9fdf08..8a31d018 100644 --- a/crates/agentic-server-core/src/executor/rehydrate.rs +++ b/crates/agentic-server-core/src/executor/rehydrate.rs @@ -4,8 +4,10 @@ //! injecting them into the enriched request before it is forwarded to the LLM. use crate::executor::error::{ExecutorError, ExecutorResult}; +use crate::executor::pending_calls::pending_calls; use crate::executor::request::{ExecutionContext, RequestContext}; use crate::storage::InOutItem; +use crate::tool::ToolError; use crate::types::io::{InputItem, ResponsesInput, resolve_tool_choice, resolve_tools}; use crate::types::request_response::RequestPayload; use crate::utils::uuid7_str; @@ -49,15 +51,12 @@ pub async fn rehydrate_conversation( if ctx.original_request.conversation_id.is_some() { from_conversation(&mut ctx, exec_ctx).await?; - return Ok(ctx); - } - - if ctx.original_request.previous_response_id.is_some() { + } else if ctx.original_request.previous_response_id.is_some() { from_response(&mut ctx, exec_ctx).await?; - return Ok(ctx); + } else { + ctx.enriched_request.input = ResponsesInput::Items(ctx.new_input_items.clone()); } - ctx.enriched_request.input = ResponsesInput::Items(ctx.new_input_items.clone()); Ok(ctx) } @@ -73,6 +72,11 @@ async fn from_response(ctx: &mut RequestContext, exec_ctx: &ExecutionContext) -> let mut items = InOutItem::into_input_items(history); items.reserve(ctx.new_input_items.len()); items.extend(ctx.new_input_items.iter().cloned()); + if let Some(pending) = pending_calls(&items).into_iter().next() { + return Err(ExecutorError::Tool(ToolError::MissingOutput { + call_id: pending.call_id, + })); + } ctx.enriched_request.previous_response_id = None; ctx.enriched_request.input = ResponsesInput::Items(items); @@ -109,6 +113,11 @@ async fn from_conversation(ctx: &mut RequestContext, exec_ctx: &ExecutionContext let mut items = InOutItem::into_input_items(snapshot.items); items.reserve(ctx.new_input_items.len()); items.extend(ctx.new_input_items.iter().cloned()); + if let Some(pending) = pending_calls(&items).into_iter().next() { + return Err(ExecutorError::Tool(ToolError::MissingOutput { + call_id: pending.call_id, + })); + } ctx.enriched_request.input = ResponsesInput::Items(items); ctx.conversation_id = Some(conv_data.conversation_id); @@ -125,6 +134,7 @@ mod tests { use crate::storage::{ ConversationStore, ConversationVersion, InOutItem, ResponseMetadata, ResponseStore, create_pool_with_schema, }; + use crate::types::io::output::{McpListTools, OutputItem}; use crate::types::request_response::RequestPayload; fn request(conversation_id: Option<&str>, previous_response_id: Option<&str>) -> RequestPayload { @@ -198,6 +208,45 @@ mod tests { Ok(()) } + #[tokio::test] + async fn conversation_rehydration_remembers_listed_mcp_servers() -> Result<(), Box> { + let pool = create_pool_with_schema(Some("sqlite://?mode=memory")).await?; + let conversation_store = ConversationStore::new(pool); + let conversation = conversation_store.create().await?; + conversation_store + .persist( + &conversation.conversation_id, + "resp_prior", + None, + vec![InOutItem::Output(OutputItem::McpListTools(McpListTools::new( + "mcpl_prior", + "counter", + Vec::new(), + )))], + &ResponseMetadata::default(), + ) + .await?; + let exec_ctx = execution_context(conversation_store, ResponseStore::disabled()); + + let ctx = rehydrate_conversation(request(Some(&conversation.conversation_id), None), &exec_ctx).await?; + + let ResponsesInput::Items(items) = &ctx.enriched_request.input else { + panic!("rehydrated input should contain items"); + }; + assert!( + matches!(items.first(), Some(InputItem::McpListTools(list_tools)) if list_tools.server_label == "counter") + ); + let ResponsesInput::Items(model_items) = ctx.enriched_request.input.model_input().into_owned() else { + panic!("model input should contain items"); + }; + assert!( + model_items + .iter() + .all(|item| !matches!(item, InputItem::McpListTools(_))) + ); + Ok(()) + } + #[tokio::test] async fn request_without_continuation_has_no_conversation_version() -> Result<(), Box> { let exec_ctx = execution_context(ConversationStore::disabled(), ResponseStore::disabled()); @@ -222,4 +271,41 @@ mod tests { assert_eq!(ctx.conversation_version, None); Ok(()) } + + #[tokio::test] + async fn previous_response_rehydration_remembers_listed_mcp_servers() -> Result<(), Box> { + let pool = create_pool_with_schema(Some("sqlite://?mode=memory")).await?; + let response_store = ResponseStore::new(pool); + response_store + .persist( + "resp_prior", + None, + vec![InOutItem::Output(OutputItem::McpListTools(McpListTools::new( + "mcpl_prior", + "counter", + Vec::new(), + )))], + &ResponseMetadata::default(), + ) + .await?; + let exec_ctx = execution_context(ConversationStore::disabled(), response_store); + + let ctx = rehydrate_conversation(request(None, Some("resp_prior")), &exec_ctx).await?; + + let ResponsesInput::Items(items) = &ctx.enriched_request.input else { + panic!("rehydrated input should contain items"); + }; + assert!( + matches!(items.first(), Some(InputItem::McpListTools(list_tools)) if list_tools.server_label == "counter") + ); + let ResponsesInput::Items(model_items) = ctx.enriched_request.input.model_input().into_owned() else { + panic!("model input should contain items"); + }; + assert!( + model_items + .iter() + .all(|item| !matches!(item, InputItem::McpListTools(_))) + ); + Ok(()) + } } diff --git a/crates/agentic-server-core/src/executor/request.rs b/crates/agentic-server-core/src/executor/request.rs index 158b8e22..3a6e9dbf 100644 --- a/crates/agentic-server-core/src/executor/request.rs +++ b/crates/agentic-server-core/src/executor/request.rs @@ -3,6 +3,7 @@ use std::time::Duration; use crate::config::{Config, default_database_url}; use crate::error::Error; +use crate::executor::gateway::set_max_concurrent_gateway_calls; use crate::executor::modes::{ConversationHandler, ResponseHandler}; use crate::storage::backend::redact_database_urls; use crate::storage::{ @@ -157,6 +158,7 @@ impl ExecutionContext { let client = Arc::new(reqwest::Client::new()); let gateway_executors = GatewayExecutors::from_config(Arc::clone(&client), &cfg.tools) .map_err(|error| Error::Config(format!("failed to validate configured MCP server policies: {error}")))?; + set_max_concurrent_gateway_calls(cfg.tools.max_concurrent_gateway_calls); Ok(Self { conv_handler, diff --git a/crates/agentic-server-core/src/executor/upstream.rs b/crates/agentic-server-core/src/executor/upstream.rs index 90a48c80..febc36f2 100644 --- a/crates/agentic-server-core/src/executor/upstream.rs +++ b/crates/agentic-server-core/src/executor/upstream.rs @@ -261,8 +261,7 @@ fn emit_mcp_discovery_lifecycle( stream_sender: &tokio::sync::mpsc::UnboundedSender, ) -> ExecutorResult<()> { let discovered_output = registry - .mcp_list_tools_items() - .iter() + .mcp_list_tool_items() .map(crate::tool::mcp::handler::list_tools_output_item) .collect::>(); let public_output = public_output_items(&discovered_output, registry, &[]); diff --git a/crates/agentic-server-core/src/storage/types/item.rs b/crates/agentic-server-core/src/storage/types/item.rs index 5159d4ea..f839d2c2 100644 --- a/crates/agentic-server-core/src/storage/types/item.rs +++ b/crates/agentic-server-core/src/storage/types/item.rs @@ -102,12 +102,13 @@ impl TryFrom<&InOutItem> for String { } impl InOutItem { - /// Converts stored history into input items suitable for a model request. + /// Converts stored history into input items for continuation processing. + /// Internal items are removed later by `ResponsesInput::model_input`. #[must_use] pub fn into_input_items(history: Vec) -> Vec { history .into_iter() - .filter_map(|i| match i { + .filter_map(|item| match item { InOutItem::Input(item) if item.is_unknown() => None, InOutItem::Input(item) => Some(item), InOutItem::Output(output) => output.to_input_item(), @@ -120,9 +121,10 @@ impl InOutItem { mod tests { use super::*; use crate::types::event::MessageStatus; + use crate::types::io::output::McpListTools; use crate::types::io::{ FunctionToolCall, InputContent, InputMessage, InputMessageContent, OutputMessage, OutputTextContent, - ReasoningOutput, ReasoningTextContent, + ReasoningOutput, ReasoningTextContent, ResponsesInput, }; #[test] @@ -243,6 +245,27 @@ mod tests { } } + #[test] + fn input_items_preserve_mcp_list_tools_until_model_input() { + let history = vec![InOutItem::Output(OutputItem::McpListTools(McpListTools::new( + "mcpl_1", + "counter", + Vec::new(), + )))]; + + let input_items = InOutItem::into_input_items(history); + + assert!(matches!( + input_items.as_slice(), + [InputItem::McpListTools(list_tools)] if list_tools.server_label == "counter" + )); + let model_input = ResponsesInput::Items(input_items).model_input().into_owned(); + let ResponsesInput::Items(model_items) = model_input else { + panic!("model input should contain items"); + }; + assert!(model_items.is_empty()); + } + #[test] fn test_item_kind_serialization() { let kind = ItemKind::Input; diff --git a/crates/agentic-server-core/src/tool/codex.rs b/crates/agentic-server-core/src/tool/codex.rs index 5130b8a6..d69ce175 100644 --- a/crates/agentic-server-core/src/tool/codex.rs +++ b/crates/agentic-server-core/src/tool/codex.rs @@ -58,12 +58,7 @@ pub(crate) fn insert_namespace_entries(entries: &mut HashMap, if entries .insert( name.clone(), - ToolEntry { - tool_type: ToolType::CodexNamespace, - config: config.clone(), - server_label: Some(p.name.clone()), - handler: None, - }, + ToolEntry::client(ToolType::CodexNamespace, config.clone(), Some(p.name.clone())), ) .is_some() { diff --git a/crates/agentic-server-core/src/tool/custom.rs b/crates/agentic-server-core/src/tool/custom.rs index b8590ec9..d129b4ab 100644 --- a/crates/agentic-server-core/src/tool/custom.rs +++ b/crates/agentic-server-core/src/tool/custom.rs @@ -260,12 +260,7 @@ pub(crate) fn insert_custom_entry(entries: &mut HashMap, para |config| { entries.insert( param.name.as_str().to_owned(), - ToolEntry { - tool_type: ToolType::Custom, - config, - server_label: None, - handler: None, - }, + ToolEntry::client(ToolType::Custom, config, None), ); }, (), diff --git a/crates/agentic-server-core/src/tool/executors.rs b/crates/agentic-server-core/src/tool/executors.rs index 7db9ffaa..0514af9c 100644 --- a/crates/agentic-server-core/src/tool/executors.rs +++ b/crates/agentic-server-core/src/tool/executors.rs @@ -124,9 +124,14 @@ impl GatewayExecutors { } } + /// Always returns a real handler — falls back to [`WebSearchHandler::spec_only`] + /// when no provider was configured, so callers never need to handle a + /// missing gateway-owned `web_search` handler themselves. #[must_use] - pub fn web_search_handler(&self) -> Option> { - self.web_search.clone() + pub fn web_search_handler(&self) -> Arc { + self.web_search + .clone() + .unwrap_or_else(|| Arc::new(WebSearchHandler::spec_only())) } #[must_use] diff --git a/crates/agentic-server-core/src/tool/function.rs b/crates/agentic-server-core/src/tool/function.rs index 45fa6b67..10b99afb 100644 --- a/crates/agentic-server-core/src/tool/function.rs +++ b/crates/agentic-server-core/src/tool/function.rs @@ -66,12 +66,7 @@ pub(crate) fn insert_function_entry(entries: &mut HashMap, p: if entries .insert( p.name.as_str().to_owned(), - ToolEntry { - tool_type: ToolType::Function, - config, - server_label: None, - handler: None, - }, + ToolEntry::client(ToolType::Function, config, None), ) .is_some() { diff --git a/crates/agentic-server-core/src/tool/handler.rs b/crates/agentic-server-core/src/tool/handler.rs index 4ec6953f..81b5f8ca 100644 --- a/crates/agentic-server-core/src/tool/handler.rs +++ b/crates/agentic-server-core/src/tool/handler.rs @@ -4,6 +4,7 @@ use std::pin::Pin; use serde_json::Value; use crate::types::io::FunctionTool; +use crate::types::io::output::{FunctionToolCall, GatewayCallStatus, OutputItem}; #[derive(Debug, Clone)] pub struct ToolOutput { @@ -17,6 +18,10 @@ pub enum ToolError { Execution(String), #[error("invalid tool config: {0}")] Config(String), + /// A continuation request omitted the output for a pending function call + /// from the prior turn. + #[error("No tool output found for function call {call_id}.")] + MissingOutput { call_id: String }, } /// Trait implemented by every tool type — client-owned and gateway-owned alike. @@ -44,14 +49,16 @@ pub trait ToolHandler: Send + Sync { /// Extension of [`ToolHandler`] for tool types that are executed by the gateway. /// -/// Only gateway-owned tools (`Mcp`, `WebSearch`, `FileSearch`, `CodeInterpreter`) -/// implement this trait. Client-owned tools (`Function`) do not — the type system -/// makes it impossible to call `execute()` on them. +/// Only executable gateway handlers implement this trait. MCP and web search +/// implement it today. File search and code interpreter are gateway-owned in +/// the registry but do not yet have executors. Client-owned tools (`Function`, +/// `Custom`, `CodexNamespace`) do not implement it, so they cannot be dispatched +/// through this interface. /// /// ## Note on `async fn` in traits /// -/// Native `async fn` in traits (Rust 1.75+) is not yet `dyn`-compatible. Since -/// PR B will store handlers as `Arc`, we use explicit +/// Native `async fn` in traits (Rust 1.75+) is not yet `dyn`-compatible. Handlers +/// are stored as `Arc`, so this trait uses explicit /// `Pin>` return types. pub trait GatewayExecutor: ToolHandler + 'static { /// Execute a tool call and return the result. @@ -72,6 +79,35 @@ pub trait GatewayExecutor: ToolHandler + 'static { arguments: &str, config: &Value, ) -> Pin> + Send + '_>>; + + /// Whether multiple calls to this same model-visible tool name may overlap. + /// Defaults to `false`, which serializes only same-name calls; calls to + /// different tools may still execute concurrently in the same round. + #[must_use] + fn supports_parallel_execution(&self) -> bool { + false + } + + /// The placeholder output item shown while this call is in progress. + /// Defaults to `None` (no lifecycle placeholder). + #[must_use] + fn started_output(&self, call: &FunctionToolCall) -> Option { + let _ = call; + None + } + + /// The public output item for a completed or failed call. + /// Defaults to `None` (no gateway-specific shape). + #[must_use] + fn public_output( + &self, + call: &FunctionToolCall, + output: &ToolOutput, + status: GatewayCallStatus, + ) -> Option { + let _ = (call, output, status); + None + } } #[cfg(test)] diff --git a/crates/agentic-server-core/src/tool/mcp/handler.rs b/crates/agentic-server-core/src/tool/mcp/handler.rs index bfc2e941..b7d37b6a 100644 --- a/crates/agentic-server-core/src/tool/mcp/handler.rs +++ b/crates/agentic-server-core/src/tool/mcp/handler.rs @@ -19,50 +19,13 @@ use crate::utils::uuid7_str; use super::{McpClient, McpError}; -#[derive(Clone, Debug, Eq, PartialEq)] -pub(crate) struct McpToolRef { - server_label: String, - tool_name: String, -} - -impl From<&McpDiscoveredToolParam> for McpToolRef { - fn from(param: &McpDiscoveredToolParam) -> Self { - Self { - server_label: param.server_label.clone(), - tool_name: param.tool_name.clone(), - } - } -} - -/// Request-scoped mapping from model-visible internal names to public MCP -/// server and tool identities. -#[derive(Clone, Debug, Default)] -pub(crate) struct McpToolMap { - calls: HashMap, -} - -impl McpToolMap { - pub(crate) fn record(&mut self, internal_name: String, tool_ref: McpToolRef) { - debug_assert!(self.calls.insert(internal_name, tool_ref).is_none()); - } - - pub(crate) fn tool_ref(&self, internal_name: &str) -> Option<&McpToolRef> { - self.calls.get(internal_name) - } - - pub(crate) fn contains_server_label(&self, server_label: &str) -> bool { - self.calls - .values() - .any(|tool_ref| tool_ref.server_label == server_label) - } -} - #[must_use] pub(crate) fn output_item( call: &FunctionToolCall, output: &ToolOutput, status: GatewayCallStatus, - tool_ref: &McpToolRef, + server_label: &str, + tool_name: &str, ) -> OutputItem { let error = if status == GatewayCallStatus::Failed { Some(McpCallError::tool_execution(error_text_from_output(&output.output))) @@ -73,8 +36,8 @@ pub(crate) fn output_item( OutputItem::McpCall(McpCall::new( call_output_id(call), - tool_ref.server_label.clone(), - tool_ref.tool_name.clone(), + server_label.to_owned(), + tool_name.to_owned(), call.arguments.clone(), status.into(), successful_output, @@ -83,11 +46,11 @@ pub(crate) fn output_item( } #[must_use] -pub(crate) fn started_output_item(call: &FunctionToolCall, tool_ref: &McpToolRef) -> OutputItem { +pub(crate) fn started_output_item(call: &FunctionToolCall, server_label: &str, tool_name: &str) -> OutputItem { OutputItem::McpCall(McpCall::new( call_output_id(call), - tool_ref.server_label.clone(), - tool_ref.tool_name.clone(), + server_label.to_owned(), + tool_name.to_owned(), "", McpCallStatus::InProgress, None, @@ -109,8 +72,15 @@ pub(crate) fn started_list_tools_output_item(item: &McpListTools) -> OutputItem /// /// A handler with no client is used only while normalizing the discovered tool /// metadata stored on `McpToolParam` into model-visible function tools. +#[derive(Clone)] +struct McpIdentity { + client: Arc, + server_label: String, + tool_name: String, +} + pub struct McpHandler { - client: Option>, + identity: Option, } #[derive(Deserialize)] @@ -156,12 +126,18 @@ impl McpHandler { #[must_use] pub const fn discovered_tool_spec_only() -> Self { - Self { client: None } + Self { identity: None } } #[must_use] - pub fn tool_call(client: Arc) -> Self { - Self { client: Some(client) } + pub fn tool_call(client: Arc, server_label: String, tool_name: String) -> Self { + Self { + identity: Some(McpIdentity { + client, + server_label, + tool_name, + }), + } } /// Discovers and normalizes the tools exposed by one MCP server. @@ -188,6 +164,11 @@ impl McpHandler { continue; } let internal_name = internal_mcp_tool_name(server_label, &tool_name, &mut internal_names); + let handler = Arc::new(Self::tool_call( + Arc::clone(&client), + server_label.to_owned(), + tool_name.clone(), + )); discovered_handlers.push(McpDiscoveredHandler { param: McpDiscoveredToolParam { server_label: server_label.to_owned(), @@ -195,7 +176,7 @@ impl McpHandler { internal_name, tool, }, - handler: Arc::new(Self::tool_call(Arc::clone(&client))), + handler, }); } @@ -292,24 +273,54 @@ impl GatewayExecutor for McpHandler { call_id: &str, _tool_name: &str, arguments: &str, - config: &Value, + _config: &Value, ) -> Pin> + Send + '_>> { let call_id = call_id.to_owned(); let arguments = arguments.to_owned(); - let config = config.clone(); + let identity = self.identity.clone(); Box::pin(async move { - let Some(client) = &self.client else { + let Some(identity) = &identity else { return Err(ToolError::Config( "MCP tool spec-only handler cannot execute tools".to_owned(), )); }; - let param = mcp_tool_param(&config)?; - let output = execute_tool_call(client, ¶m.server_label, ¶m.tool_name, &arguments).await?; + let output = execute_tool_call( + &identity.client, + &identity.server_label, + &identity.tool_name, + &arguments, + ) + .await?; Ok(ToolOutput { call_id, output }) }) } + + fn supports_parallel_execution(&self) -> bool { + true + } + + fn started_output(&self, call: &FunctionToolCall) -> Option { + let identity = self.identity.as_ref()?; + Some(started_output_item(call, &identity.server_label, &identity.tool_name)) + } + + fn public_output( + &self, + call: &FunctionToolCall, + output: &ToolOutput, + status: GatewayCallStatus, + ) -> Option { + let identity = self.identity.as_ref()?; + Some(output_item( + call, + output, + status, + &identity.server_label, + &identity.tool_name, + )) + } } async fn execute_tool_call( @@ -363,11 +374,6 @@ fn mcp_tool_result_text(result: &rmcp::model::CallToolResult) -> Result Result { - deserialize_from_value::(value.clone()) - .map_err(|error| ToolError::Config(format!("invalid MCP tool config: {error}"))) -} - pub(crate) fn discovered_mcp_function_tool(param: &McpDiscoveredToolParam) -> FunctionTool { mcp_tool_to_function_tool(¶m.internal_name, ¶m.tool) } @@ -621,19 +627,6 @@ mod tests { assert_eq!(name, "mcp__counter_server__increment_value"); } - #[test] - fn tool_map_resolves_internal_name_to_public_mcp_identity() { - let param = discovered_param(); - let tool_ref = McpToolRef::from(¶m); - let mut map = McpToolMap::default(); - - map.record(param.internal_name.clone(), tool_ref.clone()); - - assert_eq!(map.tool_ref(¶m.internal_name), Some(&tool_ref)); - assert!(map.contains_server_label("counter")); - assert!(!map.contains_server_label("missing")); - } - #[test] fn discovered_tool_output_uses_public_mcp_identity() { let call = FunctionToolCall { @@ -648,9 +641,10 @@ mod tests { call_id: call.call_id.clone(), output: "1".to_owned(), }; - let tool_ref = McpToolRef::from(&discovered_param()); - let OutputItem::McpCall(item) = output_item(&call, &output, GatewayCallStatus::Completed, &tool_ref) else { + let OutputItem::McpCall(item) = + output_item(&call, &output, GatewayCallStatus::Completed, "counter", "increment") + else { panic!("expected mcp_call"); }; @@ -674,12 +668,12 @@ mod tests { call_id: call.call_id.clone(), output: "1".to_owned(), }; - let tool_ref = McpToolRef::from(&discovered_param()); - let OutputItem::McpCall(started) = started_output_item(&call, &tool_ref) else { + let OutputItem::McpCall(started) = started_output_item(&call, "counter", "increment") else { panic!("expected started mcp_call"); }; - let OutputItem::McpCall(completed) = output_item(&call, &output, GatewayCallStatus::Completed, &tool_ref) + let OutputItem::McpCall(completed) = + output_item(&call, &output, GatewayCallStatus::Completed, "counter", "increment") else { panic!("expected completed mcp_call"); }; @@ -702,12 +696,11 @@ mod tests { })) .expect("valid second function call"), ]; - let tool_ref = McpToolRef::from(&discovered_param()); let public_ids = calls .iter() .map(|call| { - let OutputItem::McpCall(started) = started_output_item(call, &tool_ref) else { + let OutputItem::McpCall(started) = started_output_item(call, "counter", "increment") else { panic!("expected started mcp_call"); }; let output = ToolOutput { @@ -715,7 +708,7 @@ mod tests { output: "1".to_owned(), }; let OutputItem::McpCall(completed) = - output_item(call, &output, GatewayCallStatus::Completed, &tool_ref) + output_item(call, &output, GatewayCallStatus::Completed, "counter", "increment") else { panic!("expected completed mcp_call"); }; @@ -765,11 +758,7 @@ mod tests { call_id: call.call_id.clone(), output: r#"{"error":"missing field `b`"}"#.to_owned(), }; - let mut param = discovered_param(); - param.tool_name = "sum".to_owned(); - let tool_ref = McpToolRef::from(¶m); - - let item = output_item(&call, &output, GatewayCallStatus::Failed, &tool_ref); + let item = output_item(&call, &output, GatewayCallStatus::Failed, "counter", "sum"); let json = serde_json::to_value(item).expect("serializable mcp_call"); assert_eq!(json["status"], "failed"); diff --git a/crates/agentic-server-core/src/tool/mcp/registry.rs b/crates/agentic-server-core/src/tool/mcp/registry.rs index 264a5d11..47c723e0 100644 --- a/crates/agentic-server-core/src/tool/mcp/registry.rs +++ b/crates/agentic-server-core/src/tool/mcp/registry.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use crate::tool::{ToolEntry, ToolType}; +use crate::tool::{GatewayBinding, ToolEntry, ToolType}; use crate::types::tools::McpDiscoveredToolParam; use crate::utils::common::serialize_to_value_or_custom_default; @@ -25,11 +25,11 @@ pub(crate) fn insert_discovered_mcp_entry(entries: &mut HashMap, + /// `Some` when this handler must not run concurrently with a second call + /// to the SAME tool name (built from `!handler.supports_parallel_execution()` + /// at registration time); `None` when it's safe to call itself concurrently. + /// Never gates against other tool names. + pub self_exclusion: Option>, +} + +impl Clone for GatewayBinding { + fn clone(&self) -> Self { + Self { + handler: Arc::clone(&self.handler), + self_exclusion: self.self_exclusion.clone(), + } + } +} + +impl GatewayBinding { + #[must_use] + pub fn new(handler: Arc) -> Self { + let self_exclusion = (!handler.supports_parallel_execution()).then(|| Arc::new(tokio::sync::Semaphore::new(1))); + Self { + handler, + self_exclusion, + } + } +} + +pub enum ToolOwnership { + Client, + /// `None` means this tool type is gateway-owned in principle but has no + /// handler implemented yet (e.g. `FileSearch`/`CodeInterpreter` today). + Gateway(Option), +} + +impl Clone for ToolOwnership { + fn clone(&self) -> Self { + match self { + Self::Client => Self::Client, + Self::Gateway(binding) => Self::Gateway(binding.clone()), + } + } +} + +impl ToolOwnership { + #[must_use] + pub fn is_gateway(&self) -> bool { + matches!(self, Self::Gateway(_)) + } +} diff --git a/crates/agentic-server-core/src/tool/registry.rs b/crates/agentic-server-core/src/tool/registry.rs index 5f2be463..cb937a39 100644 --- a/crates/agentic-server-core/src/tool/registry.rs +++ b/crates/agentic-server-core/src/tool/registry.rs @@ -9,14 +9,14 @@ use super::codex::insert_namespace_entries; use super::custom::{CustomHandler, CustomToolMap, insert_custom_entry}; use super::executors::GatewayExecutors; use super::function::insert_function_entry; -use super::mcp::handler::{McpToolMap, McpToolRef}; use super::mcp::registry::insert_discovered_mcp_entry; +use super::ownership::{GatewayBinding, ToolOwnership}; use super::web_search::insert_web_search_entry; use super::{CodexNamespaceHandler, GatewayExecutor, McpHandler, NamespaceMap, ToolError, ToolOutput}; use crate::events::WireEvent; -use crate::types::io::OutputItem; use crate::types::io::output::{FunctionToolCall, McpListTools}; +use crate::types::io::{InputItem, OutputItem, ResponsesInput}; use crate::types::tools::{CodeInterpreterToolParam, FileSearchToolParam, ResponsesTool}; use crate::utils::common::serialize_to_value_or_custom_default; @@ -49,6 +49,10 @@ impl ToolType { } } + /// Whether this kind of tool is gateway-owned by design, independent of + /// any specific registry entry. Used before a `ToolEntry` exists (e.g. + /// classifying a raw declaration); once an entry exists, prefer + /// `ToolOwnership::is_gateway` on it directly. #[must_use] pub const fn is_gateway_owned(self) -> bool { !matches!(self, Self::Function | Self::Custom | Self::CodexNamespace) @@ -63,7 +67,7 @@ pub struct ToolEntry { pub config: Value, /// For MCP tools: which server this tool belongs to. pub server_label: Option, - pub handler: Option>, + pub ownership: ToolOwnership, } impl std::fmt::Debug for ToolEntry { @@ -72,11 +76,43 @@ impl std::fmt::Debug for ToolEntry { .field("tool_type", &self.tool_type) .field("config", &self.config) .field("server_label", &self.server_label) - .field("handler", &self.handler.is_some()) + .field("is_gateway", &self.ownership.is_gateway()) .finish() } } +impl ToolEntry { + /// Builds a client-owned entry. `tool_type.is_gateway_owned()` is the + /// single source of truth for the ownership discriminant; this asserts + /// the caller picked the constructor matching its own tool type. + pub(crate) fn client(tool_type: ToolType, config: Value, server_label: Option) -> Self { + debug_assert!(!tool_type.is_gateway_owned()); + Self { + tool_type, + config, + server_label, + ownership: ToolOwnership::Client, + } + } + + /// Builds a gateway-owned entry. `handler` is `None` for tool types that + /// are gateway-owned in principle but have no executor yet. + pub(crate) fn gateway( + tool_type: ToolType, + config: Value, + server_label: Option, + handler: Option, + ) -> Self { + debug_assert!(tool_type.is_gateway_owned()); + Self { + tool_type, + config, + server_label, + ownership: ToolOwnership::Gateway(handler), + } + } +} + fn insert_unique_tool_entries( entries: &mut HashMap, insert: impl FnOnce(&mut HashMap), @@ -119,12 +155,7 @@ fn insert_file_search_entry( |config| { entries.insert( "file_search".to_owned(), - ToolEntry { - tool_type: ToolType::FileSearch, - config, - server_label: None, - handler, - }, + ToolEntry::gateway(ToolType::FileSearch, config, None, handler.map(GatewayBinding::new)), ); }, (), @@ -144,12 +175,12 @@ fn insert_code_interpreter_entry( |config| { entries.insert( "code_interpreter".to_owned(), - ToolEntry { - tool_type: ToolType::CodeInterpreter, + ToolEntry::gateway( + ToolType::CodeInterpreter, config, - server_label: None, - handler, - }, + None, + handler.map(GatewayBinding::new), + ), ); }, (), @@ -170,12 +201,9 @@ pub struct ToolRegistry { /// for response lifecycle metadata restoration. custom_tool_map: Option, - /// Maps model-visible MCP function names back to their public server and - /// tool identities without reparsing executor configuration. - mcp_tool_map: McpToolMap, - - /// Request-scoped MCP discovery output items retained in declaration order. - mcp_list_tools_items: Vec, + /// MCP tool-list items grouped by server label. Current discovery is stored + /// first while building and rehydrated historical records are appended. + mcp_list_tools_items: HashMap>, } impl ToolRegistry { @@ -201,8 +229,7 @@ impl ToolRegistry { executors: &mut GatewayExecutors, ) -> Result { let mut entries = HashMap::with_capacity(tools.len()); - let mut mcp_tool_map = McpToolMap::default(); - let mut mcp_list_tools_items = Vec::new(); + let mut mcp_list_tools_items = HashMap::>::new(); // Namespace members must be keyed by the same flat, model-visible name // the model will call, so resolve them first — the same pure pass used // to build the upstream request. @@ -220,22 +247,25 @@ impl ToolRegistry { // Config errors mean the declaration is invalid; the client can fix it. Err(error @ ToolError::Config(_)) => return Err(error), Err(error) => { - mcp_list_tools_items.push(McpHandler::failed_list_tools_item(&p.server_label, &error)); + mcp_list_tools_items + .entry(p.server_label.clone()) + .or_default() + .push(McpHandler::failed_list_tools_item(&p.server_label, &error)); continue; } }; let handlers = tool_set.discovered_handlers; - mcp_list_tools_items.push(tool_set.list_tools_item); + mcp_list_tools_items + .entry(p.server_label.clone()) + .or_default() + .push(tool_set.list_tools_item); if let ResponsesTool::Mcp(declaration) = &mut tools[index] { declaration.discovered_tools = handlers.iter().map(|item| item.param.clone()).collect(); } for discovered in handlers { - let internal_name = discovered.param.internal_name.clone(); - let tool_ref = McpToolRef::from(&discovered.param); insert_unique_tool_entries(&mut entries, |resolved| { insert_discovered_mcp_entry(resolved, discovered); })?; - mcp_tool_map.record(internal_name, tool_ref); } } ResponsesTool::WebSearch(p) => { @@ -270,7 +300,6 @@ impl ToolRegistry { entries, namespace_map, custom_tool_map, - mcp_tool_map, mcp_list_tools_items, }) } @@ -299,16 +328,40 @@ impl ToolRegistry { #[must_use] pub fn contains_mcp_server_label(&self, server_label: &str) -> bool { - self.mcp_tool_map.contains_server_label(server_label) + self.entries + .values() + .any(|entry| entry.tool_type == ToolType::Mcp && entry.server_label.as_deref() == Some(server_label)) + } + + pub(crate) fn cache_listed_mcp_tools(&mut self, input: &ResponsesInput) { + if let ResponsesInput::Items(items) = input { + for item in items { + let InputItem::McpListTools(list_tools) = item else { + continue; + }; + // Only a currently declared MCP server can emit discovery in + // this request. Ignore history for labels absent from the + // current registry instead of turning it into a new candidate. + if let Some(items) = self.mcp_list_tools_items.get_mut(&list_tools.server_label) { + items.push(list_tools.clone()); + } + } + } } - pub(crate) fn mcp_tool_ref(&self, internal_name: &str) -> Option<&McpToolRef> { - self.mcp_tool_map.tool_ref(internal_name) + /// Current discovery items whose server label has no rehydrated list-tools + /// history. A vector of length greater than one contains the current item + /// followed by at least one historical item and is therefore suppressed. + pub(crate) fn mcp_list_tool_items(&self) -> impl Iterator { + self.mcp_list_tools_items + .values() + .filter(|items| items.len() == 1) + .filter_map(|items| items.first()) } - #[must_use] - pub(crate) fn mcp_list_tools_items(&self) -> &[McpListTools] { - &self.mcp_list_tools_items + /// Marks the current request's discovery lifecycle as consumed. + pub(crate) fn clear_mcp_list_tool_items(&mut self) { + self.mcp_list_tools_items.clear(); } pub fn restore_final_payload_output(&self, output: &mut [OutputItem]) { @@ -325,19 +378,20 @@ impl ToolRegistry { pub fn gateway_owned<'a>(&self, calls: &'a [FunctionToolCall]) -> Vec<&'a FunctionToolCall> { calls .iter() - .filter(|c| { - self.entries - .get(&c.name) - .is_some_and(|e| e.tool_type.is_gateway_owned()) - }) + .filter(|c| self.entries.get(&c.name).is_some_and(|e| e.ownership.is_gateway())) .collect() } #[must_use] pub fn is_gateway_owned_name(&self, name: &str) -> bool { + self.entries.get(name).is_some_and(|entry| entry.ownership.is_gateway()) + } + + #[must_use] + pub fn is_client_custom_name(&self, name: &str) -> bool { self.entries .get(name) - .is_some_and(|entry| entry.tool_type.is_gateway_owned()) + .is_some_and(|entry| entry.tool_type == ToolType::Custom) } /// Returns the subset of `calls` whose names map to client-owned tools @@ -346,22 +400,21 @@ impl ToolRegistry { pub fn client_owned<'a>(&self, calls: &'a [FunctionToolCall]) -> Vec<&'a FunctionToolCall> { calls .iter() - .filter(|c| { - self.entries - .get(&c.name) - .is_none_or(|e| !e.tool_type.is_gateway_owned()) - }) + .filter(|c| self.entries.get(&c.name).is_none_or(|e| !e.ownership.is_gateway())) .collect() } pub async fn dispatch(&self, call: &FunctionToolCall) -> Option { let entry = self.entries.get(&call.name)?; - let handler = entry.handler.clone()?; + let ToolOwnership::Gateway(Some(binding)) = &entry.ownership else { + return None; + }; let tool_type = entry.tool_type; let config = entry.config.clone(); Some(GatewayDispatchResult { tool_type, - output: handler + output: binding + .handler .execute(&call.call_id, &call.name, &call.arguments, &config) .await, }) @@ -458,7 +511,7 @@ mod tests { } fn assert_mcp_list_tools_metadata(registry: &ToolRegistry) { - let [list_tools] = registry.mcp_list_tools_items() else { + let [list_tools] = registry.mcp_list_tools_items["counter"].as_slice() else { panic!("expected one MCP list-tools item"); }; assert!(list_tools.id.starts_with("mcpl_")); @@ -479,6 +532,49 @@ mod tests { ); } + #[test] + fn ignores_mcp_list_history_for_servers_absent_from_current_registry() { + let mut registry = ToolRegistry::default(); + let input = ResponsesInput::Items(vec![ + InputItem::McpListTools(McpListTools::new("mcpl_1", "counter", Vec::new())), + InputItem::McpListTools(McpListTools::new("mcpl_2", "search", Vec::new())), + ]); + + registry.cache_listed_mcp_tools(&input); + + assert_eq!(registry.mcp_list_tool_items().count(), 0); + assert!(registry.mcp_list_tools_items.is_empty()); + } + + #[test] + fn mcp_list_tools_map_excludes_labels_with_history_and_clears_after_emission() { + let mut registry = ToolRegistry::default(); + registry.mcp_list_tools_items.insert( + "counter".to_owned(), + vec![ + McpListTools::new("mcpl_current", "counter", Vec::new()), + McpListTools::new("mcpl_prior", "counter", Vec::new()), + ], + ); + registry.mcp_list_tools_items.insert( + "search".to_owned(), + vec![McpListTools::new("mcpl_search_current", "search", Vec::new())], + ); + + let current = registry.mcp_list_tool_items().collect::>(); + + assert_eq!( + current.iter().map(|item| item.id.as_str()).collect::>(), + ["mcpl_search_current"] + ); + assert_eq!(registry.mcp_list_tools_items["counter"].len(), 2); + + registry.clear_mcp_list_tool_items(); + + assert_eq!(registry.mcp_list_tool_items().count(), 0); + assert!(registry.mcp_list_tools_items.is_empty()); + } + #[tokio::test] async fn build_with_handlers_registers_mixed_tools_and_runtime_metadata() { let mut executors = GatewayExecutors::from_env(Arc::new(reqwest::Client::new())); @@ -525,7 +621,11 @@ mod tests { server_label, "unexpected server label for '{name}'" ); - assert_eq!(entry.handler.is_some(), has_handler, "unexpected handler for '{name}'"); + assert_eq!( + matches!(entry.ownership, ToolOwnership::Gateway(Some(_))), + has_handler, + "unexpected handler for '{name}'" + ); } assert_eq!(registry.lookup("freeform").unwrap().config["name"], "freeform"); assert_eq!(registry.lookup("echo").unwrap().config["name"], "echo"); @@ -590,7 +690,7 @@ mod tests { .await .expect("discovery failures should become response metadata"); - let [list_tools] = registry.mcp_list_tools_items() else { + let [list_tools] = registry.mcp_list_tools_items["unreachable"].as_slice() else { panic!("expected one MCP list-tools item"); }; assert_eq!(list_tools.server_label, "unreachable"); diff --git a/crates/agentic-server-core/src/tool/web_search.rs b/crates/agentic-server-core/src/tool/web_search.rs index 1d6b82c4..5d8a51a3 100644 --- a/crates/agentic-server-core/src/tool/web_search.rs +++ b/crates/agentic-server-core/src/tool/web_search.rs @@ -12,6 +12,7 @@ use crate::types::tools::{WebSearchContextSize, WebSearchToolParam}; use crate::utils::common::serialize_to_value_or_custom_default; use super::handler::{GatewayExecutor, ToolError, ToolHandler, ToolOutput}; +use super::ownership::GatewayBinding; use super::registry::{ToolEntry, ToolType}; const YOU_API_KEY: &str = "YOU_API_KEY"; @@ -20,7 +21,7 @@ const YOU_API_BASE_URL: &str = "YOU_API_BASE_URL"; pub(crate) fn insert_web_search_entry( entries: &mut HashMap, p: &WebSearchToolParam, - handler: Option>, + handler: Arc, ) { serialize_to_value_or_custom_default( p, @@ -28,12 +29,7 @@ pub(crate) fn insert_web_search_entry( |config| { entries.insert( "web_search".to_owned(), - ToolEntry { - tool_type: ToolType::WebSearch, - config, - server_label: None, - handler, - }, + ToolEntry::gateway(ToolType::WebSearch, config, None, Some(GatewayBinding::new(handler))), ); }, (), @@ -55,6 +51,11 @@ pub(crate) fn web_search_function_tool() -> FunctionTool { "type": "string", "description": "The natural language web search query." }, + "queries": { + "type": "array", + "items": {"type": "string"}, + "description": "Multiple independent search queries to run in parallel, instead of a single query." + }, "count": { "type": "integer", "description": "Maximum results per section, from 1 to 100." @@ -82,7 +83,10 @@ pub(crate) fn web_search_function_tool() -> FunctionTool { "description": "Optional domain blocklist." } }, - "required": ["query"] + "anyOf": [ + {"required": ["query"]}, + {"required": ["queries"]} + ] })), strict: Some(false), } @@ -91,13 +95,13 @@ pub(crate) fn web_search_function_tool() -> FunctionTool { #[must_use] pub(crate) fn output_item(call: &FunctionToolCall, output: &ToolOutput, status: WebSearchCallStatus) -> OutputItem { let parsed_output = serde_json::from_str::(&output.output).ok(); - let query = parsed_output + let queries = parsed_output .as_ref() - .and_then(|value| clean_json_str(value.get("query"))) - .or_else(|| query_from_arguments(&call.arguments)) - .unwrap_or_default(); + .and_then(queries_from_value) + .or_else(|| queries_from_arguments(&call.arguments)) + .unwrap_or_else(|| vec![String::new()]); let sources = parsed_output.as_ref().map(sources_from_output).unwrap_or_default(); - OutputItem::WebSearchCall(WebSearchCall::new(call_output_id(call), status, query, sources)) + OutputItem::WebSearchCall(WebSearchCall::new(call_output_id(call), status, queries, sources)) } #[must_use] @@ -105,14 +109,14 @@ pub(crate) fn started_output_item(call: &FunctionToolCall) -> OutputItem { OutputItem::WebSearchCall(WebSearchCall::new( call_output_id(call), WebSearchCallStatus::InProgress, - query_from_arguments(&call.arguments).unwrap_or_default(), + queries_from_arguments(&call.arguments).unwrap_or_else(|| vec![String::new()]), Vec::new(), )) } #[derive(Debug, Clone)] pub struct WebSearchHandler { - provider: Arc, + provider: Option>, } impl WebSearchHandler { @@ -128,31 +132,61 @@ impl WebSearchHandler { #[must_use] pub fn from_values(client: Arc, api_key: Option, base_url: Option) -> Self { Self { - provider: Arc::new(YouSearchProvider::from_values(client, api_key, base_url)), + provider: Some(Arc::new(YouSearchProvider::from_values(client, api_key, base_url))), } } #[must_use] pub fn with_api_key(client: Arc, api_key: String, base_url: &str) -> Self { Self { - provider: Arc::new(YouSearchProvider::with_api_key(client, api_key, base_url)), + provider: Some(Arc::new(YouSearchProvider::with_api_key(client, api_key, base_url))), } } + /// Builds a handler usable only for shaping placeholder/error output + /// (`ToolHandler::normalize`, `GatewayExecutor::started_output`/`public_output`) + /// when no real provider is configured — `execute()` always fails. + #[must_use] + pub const fn spec_only() -> Self { + Self { provider: None } + } + #[cfg(test)] fn with_provider(provider: Arc) -> Self { - Self { provider } + Self { + provider: Some(provider), + } } async fn execute_search(&self, call_id: &str, arguments: &str, config: &Value) -> Result { + let provider = self + .provider + .as_ref() + .ok_or_else(|| ToolError::Config("web_search spec-only handler cannot execute tools".to_owned()))?; let args = WebSearchArguments::from_json(arguments)?; let config = serde_json::from_value::(config.clone()) .map_err(|e| ToolError::Config(format!("invalid web_search config: {e}")))?; - let response = self.provider.search(&args, &config).await?; + let queries = args.all_queries(); + let responses = + futures::future::try_join_all(queries.iter().map(|query| provider.search(query, &args, &config))).await?; + + let mut web = Vec::new(); + let mut news = Vec::new(); + let mut metadata = Vec::new(); + for response in responses { + if let Some(results) = response.results.get("web").and_then(Value::as_array) { + web.extend(results.iter().cloned()); + } + if let Some(results) = response.results.get("news").and_then(Value::as_array) { + news.extend(results.iter().cloned()); + } + metadata.push(response.metadata); + } let output = serde_json::to_string(&serde_json::json!({ - "query": response.query, - "results": response.results, - "metadata": response.metadata + "query": queries[0], + "queries": queries, + "results": {"web": web, "news": news}, + "metadata": metadata })) .map_err(|e| ToolError::Execution(format!("failed to serialize web_search output: {e}")))?; @@ -166,13 +200,13 @@ impl WebSearchHandler { trait WebSearchProvider: std::fmt::Debug + Send + Sync { fn search<'a>( &'a self, + query: &'a str, args: &'a WebSearchArguments, config: &'a WebSearchToolParam, ) -> Pin> + Send + 'a>>; } struct WebSearchProviderResponse { - query: String, results: Value, metadata: Value, } @@ -209,6 +243,7 @@ impl YouSearchProvider { impl WebSearchProvider for YouSearchProvider { fn search<'a>( &'a self, + query: &'a str, args: &'a WebSearchArguments, config: &'a WebSearchToolParam, ) -> Pin> + Send + 'a>> { @@ -220,7 +255,7 @@ impl WebSearchProvider for YouSearchProvider { let base_url = self.base_url.as_deref().ok_or_else(|| { ToolError::Config(format!("{YOU_API_BASE_URL} must be set to use the web_search tool")) })?; - let request = YouSearchRequest::from_args_and_config(args, config)?; + let request = YouSearchRequest::from_args_and_config(query, args, config)?; let resp = self .client .get(format!("{base_url}/v1/search")) @@ -245,7 +280,6 @@ impl WebSearchProvider for YouSearchProvider { let response: Value = serde_json::from_str(&response_text) .map_err(|e| ToolError::Execution(format!("You.com search returned invalid JSON: {e}")))?; Ok(WebSearchProviderResponse { - query: request.query, results: response .get("results") .cloned() @@ -293,11 +327,31 @@ impl GatewayExecutor for WebSearchHandler { self.execute_search(&call_id, &arguments, &config).await }) } + + fn supports_parallel_execution(&self) -> bool { + true + } + + fn started_output(&self, call: &FunctionToolCall) -> Option { + Some(started_output_item(call)) + } + + fn public_output( + &self, + call: &FunctionToolCall, + output: &ToolOutput, + status: WebSearchCallStatus, + ) -> Option { + Some(output_item(call, output, status)) + } } #[derive(Debug, Deserialize)] struct WebSearchArguments { - query: String, + #[serde(default)] + query: Option, + #[serde(default)] + queries: Option>, count: Option, freshness: Option, country: Option, @@ -315,11 +369,21 @@ impl WebSearchArguments { fn from_json(arguments: &str) -> Result { let args = serde_json::from_str::(arguments) .map_err(|e| ToolError::Config(format!("web_search arguments must be valid JSON: {e}")))?; - if args.query.trim().is_empty() { - return Err(ToolError::Config("web_search query must not be empty".to_owned())); + if args.all_queries().is_empty() { + return Err(ToolError::Config( + "web_search requires a non-empty query or queries".to_owned(), + )); } Ok(args) } + + fn all_queries(&self) -> Vec { + let queries = clean_vec(self.queries.as_deref()).unwrap_or_default(); + if !queries.is_empty() { + return queries; + } + clean_string(self.query.as_deref()).into_iter().collect() + } } #[derive(Debug, Serialize)] @@ -388,7 +452,11 @@ impl YouSearchRequest { params } - fn from_args_and_config(args: &WebSearchArguments, config: &WebSearchToolParam) -> Result { + fn from_args_and_config( + query: &str, + args: &WebSearchArguments, + config: &WebSearchToolParam, + ) -> Result { let count = args .count .or_else(|| { @@ -424,7 +492,7 @@ impl YouSearchRequest { .map(|value| value.to_ascii_uppercase()); Ok(Self { - query: args.query.trim().to_owned(), + query: query.trim().to_owned(), count, freshness: clean_string(args.freshness.as_deref()), country, @@ -485,9 +553,19 @@ fn call_output_id(call: &FunctionToolCall) -> String { crate::utils::uuid7_str("ws_") } -fn query_from_arguments(arguments: &str) -> Option { +fn queries_from_value(value: &Value) -> Option> { + let queries: Vec = value + .get("queries")? + .as_array()? + .iter() + .filter_map(|item| clean_json_str(Some(item))) + .collect(); + (!queries.is_empty()).then_some(queries) +} + +fn queries_from_arguments(arguments: &str) -> Option> { let args = serde_json::from_str::(arguments).ok()?; - clean_json_str(args.get("query")) + queries_from_value(&args).or_else(|| clean_json_str(args.get("query")).map(|query| vec![query])) } fn sources_from_output(output: &Value) -> Vec { @@ -531,12 +609,12 @@ mod tests { impl WebSearchProvider for MockSearchProvider { fn search<'a>( &'a self, - args: &'a WebSearchArguments, + _query: &'a str, + _args: &'a WebSearchArguments, _config: &'a WebSearchToolParam, ) -> Pin> + Send + 'a>> { Box::pin(async move { Ok(WebSearchProviderResponse { - query: args.query.trim().to_owned(), results: serde_json::json!({ "web": [ { @@ -567,7 +645,27 @@ mod tests { let body: Value = serde_json::from_str(&output.output).unwrap(); assert_eq!(output.call_id, "call_search"); assert_eq!(body["query"], "potato"); - assert_eq!(body["metadata"]["provider"], "mock"); + assert_eq!(body["queries"], serde_json::json!(["potato"])); + assert_eq!(body["metadata"][0]["provider"], "mock"); assert_eq!(body["results"]["web"][0]["url"], "https://example.com/potato"); } + + #[tokio::test] + async fn web_search_handler_fans_out_multiple_queries() { + let handler = WebSearchHandler::with_provider(Arc::new(MockSearchProvider)); + let output = handler + .execute( + "call_search", + "web_search", + r#"{"queries":["potato","tomato"]}"#, + &serde_json::json!({"type": "web_search_preview"}), + ) + .await + .unwrap(); + let body: Value = serde_json::from_str(&output.output).unwrap(); + assert_eq!(body["query"], "potato"); + assert_eq!(body["queries"], serde_json::json!(["potato", "tomato"])); + assert_eq!(body["results"]["web"].as_array().unwrap().len(), 2); + assert_eq!(body["metadata"].as_array().unwrap().len(), 2); + } } diff --git a/crates/agentic-server-core/src/types/io/input.rs b/crates/agentic-server-core/src/types/io/input.rs index 625f41c9..84093e82 100644 --- a/crates/agentic-server-core/src/types/io/input.rs +++ b/crates/agentic-server-core/src/types/io/input.rs @@ -6,7 +6,7 @@ use serde_json::Value; use crate::types::event::MessageStatus; use crate::utils::common::deserialize_from_value; -use super::output::{CustomToolCall, FunctionToolCall, ReasoningOutput}; +use super::output::{CustomToolCall, FunctionToolCall, McpListTools, ReasoningOutput}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct InputTextContent { @@ -211,6 +211,10 @@ pub enum InputItem { CustomToolCallOutput(CustomToolCallOutputMessage), #[serde(rename = "reasoning")] Reasoning(ReasoningOutput), + /// Internal history record used by gateway orchestration to remember that + /// an MCP server's tools were already listed. It is never sent to the model. + #[serde(rename = "mcp_list_tools")] + McpListTools(McpListTools), #[serde(rename = "compaction")] Compaction(CompactionItem), /// Codex CLI's remote-compaction V2 marker. Signals the server to run its @@ -235,6 +239,7 @@ impl<'de> Deserialize<'de> for InputItem { Some("custom_tool_call") => deserialize_from_value(value).map(Self::CustomToolCall), Some("custom_tool_call_output") => deserialize_from_value(value).map(Self::CustomToolCallOutput), Some("reasoning") => deserialize_from_value(value).map(Self::Reasoning), + Some("mcp_list_tools") => deserialize_from_value(value).map(Self::McpListTools), Some("compaction") => deserialize_from_value(value).map(Self::Compaction), Some("compaction_trigger") => Ok(Self::CompactionTrigger), Some(_) => return Ok(Self::Unknown), @@ -253,6 +258,11 @@ impl InputItem { pub(crate) fn is_compaction_trigger(&self) -> bool { matches!(self, Self::CompactionTrigger) } + + #[must_use] + pub(crate) fn is_model_visible(&self) -> bool { + !matches!(self, Self::McpListTools(_) | Self::CompactionTrigger) + } } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -324,7 +334,8 @@ impl ResponsesInput { /// vLLM does not understand public `compaction` items, so the latest item /// becomes an assistant message containing the locally generated summary. /// Items before that checkpoint are superseded and are omitted. - /// `compaction_trigger` markers are stripped and never reach the model. + /// Internal MCP-list records and `compaction_trigger` markers are stripped + /// and never reach the model. #[must_use] pub fn model_input(&self) -> Cow<'_, Self> { let Self::Items(items) = self else { @@ -332,12 +343,8 @@ impl ResponsesInput { }; let Some(window) = latest_compaction_window(items) else { - if items.iter().any(InputItem::is_compaction_trigger) { - let stripped = items - .iter() - .filter(|item| !item.is_compaction_trigger()) - .cloned() - .collect(); + if items.iter().any(|item| !item.is_model_visible()) { + let stripped = items.iter().filter(|item| item.is_model_visible()).cloned().collect(); return Cow::Owned(Self::Items(stripped)); } return Cow::Borrowed(self); @@ -346,7 +353,7 @@ impl ResponsesInput { let model_items = window .retained_user_items(items) .chain(items[window.latest_index()..].iter()) - .filter(|item| !item.is_compaction_trigger()) + .filter(|item| item.is_model_visible()) .map(|item| match item { InputItem::Compaction(compaction) => InputItem::Message(InputMessage { id: None, @@ -490,6 +497,28 @@ mod tests { assert_eq!(serialized[0]["content"], "history"); } + #[test] + fn model_input_strips_internal_mcp_list_tools() { + let input = ResponsesInput::Items(vec![ + InputItem::McpListTools(McpListTools::new("mcpl_1", "counter", Vec::new())), + InputItem::Message(InputMessage { + id: None, + role: "user".to_owned(), + status: None, + content: InputMessageContent::Text("continue".to_owned()), + }), + ]); + + let serialized = serde_json::to_value(input.model_input()).expect("model input serializes"); + assert_eq!(serialized.as_array().map(Vec::len), Some(1)); + assert_eq!(serialized[0]["content"], "continue"); + assert!( + serialized + .as_array() + .is_some_and(|items| { items.iter().all(|item| item["type"] != "mcp_list_tools") }) + ); + } + #[test] fn model_input_strips_compaction_trigger_after_window() { let input: ResponsesInput = serde_json::from_value(serde_json::json!([ diff --git a/crates/agentic-server-core/src/types/io/output.rs b/crates/agentic-server-core/src/types/io/output.rs index 85867627..3cce8180 100644 --- a/crates/agentic-server-core/src/types/io/output.rs +++ b/crates/agentic-server-core/src/types/io/output.rs @@ -271,7 +271,7 @@ pub struct WebSearchActionSearch { #[serde(skip, default = "default_web_search_action_search_type")] pub type_: String, pub query: String, - #[serde(default, skip_serializing_if = "Vec::is_empty")] + #[serde(default)] pub queries: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub sources: Vec, @@ -282,12 +282,16 @@ fn default_web_search_action_search_type() -> String { } impl WebSearchActionSearch { + /// # Panics + /// + /// Panics if `queries` is empty. #[must_use] - pub fn new(query: impl Into, sources: Vec) -> Self { + pub fn new(queries: Vec, sources: Vec) -> Self { + let query = queries.first().expect("queries must have at least one entry").clone(); Self { type_: default_web_search_action_search_type(), - query: query.into(), - queries: Vec::new(), + query, + queries, sources, } } @@ -345,13 +349,13 @@ impl WebSearchCall { pub fn new( id: impl Into, status: WebSearchCallStatus, - query: impl Into, + queries: Vec, sources: Vec, ) -> Self { Self { id: id.into(), status, - action: WebSearchAction::Search(WebSearchActionSearch::new(query, sources)), + action: WebSearchAction::Search(WebSearchActionSearch::new(queries, sources)), } } } @@ -753,7 +757,7 @@ impl OutputItem { match self { Self::FunctionCall(call) => registry .lookup(&call.name) - .is_none_or(|entry| !entry.tool_type.is_gateway_owned()), + .is_none_or(|entry| !entry.ownership.is_gateway()), Self::CustomToolCall(_) => true, Self::Message(_) | Self::WebSearchCall(_) @@ -765,6 +769,10 @@ impl OutputItem { } } + /// Shapes a stored output item as continuation input. + /// Gateway-owned public tool output is omitted because its model-facing + /// function call and result are persisted separately as input items. MCP + /// list metadata is retained here and removed by `ResponsesInput::model_input`. #[must_use] pub fn to_input_item(&self) -> Option { match self { @@ -772,8 +780,9 @@ impl OutputItem { Self::Reasoning(reasoning) => Some(InputItem::Reasoning(reasoning.clone())), Self::FunctionCall(call) => Some(InputItem::FunctionCall(InputFunctionToolCall::from(call.clone()))), Self::CustomToolCall(call) => Some(InputItem::FunctionCall(call.clone().into())), + Self::McpListTools(list_tools) => Some(InputItem::McpListTools(list_tools.clone())), Self::Compaction(item) => Some(InputItem::Compaction(item.clone())), - Self::WebSearchCall(_) | Self::McpCall(_) | Self::McpListTools(_) | Self::Unknown => None, + Self::WebSearchCall(_) | Self::McpCall(_) | Self::Unknown => None, } } } @@ -831,6 +840,28 @@ mod tests { assert_eq!(call.arguments, r#"{"input":"*** Begin Patch\n*** End Patch"}"#); } + #[test] + fn gateway_public_tool_outputs_are_not_replayed_as_model_input() { + let web_search = OutputItem::WebSearchCall(WebSearchCall::new( + "ws_1", + WebSearchCallStatus::Completed, + vec!["rust async".to_owned()], + Vec::new(), + )); + let mcp = OutputItem::McpCall(McpCall::new( + "mcp_1", + "counter", + "increment", + "{}", + McpCallStatus::Completed, + Some("1".to_owned()), + None, + )); + + assert!(web_search.to_input_item().is_none()); + assert!(mcp.to_input_item().is_none()); + } + #[test] fn custom_tool_call_status_remains_optional_on_the_wire() { let call: CustomToolCall = serde_json::from_value(serde_json::json!({ diff --git a/crates/agentic-server-core/src/types/request_response.rs b/crates/agentic-server-core/src/types/request_response.rs index 72ae5eee..410e00cb 100644 --- a/crates/agentic-server-core/src/types/request_response.rs +++ b/crates/agentic-server-core/src/types/request_response.rs @@ -121,10 +121,13 @@ impl RequestPayload { /// member, or when a custom tool declares a format whose constrained /// decoding cannot be preserved upstream. pub fn to_upstream_request(&self, stream: bool) -> Result, ToolError> { - // The gateway currently executes tool calls serially. Accept the client's - // preference for compatibility, but do not advertise parallel execution - // to the upstream model. - let parallel_tool_calls = Some(false); + // This is only the upstream model-generation preference: it controls + // whether the model may emit parallel calls, not how the gateway + // schedules calls after inference. Forward an explicit client value; + // preserve this gateway's existing default of `false` when omitted. + // `GatewayRound` independently applies its bounded fan-out and each + // handler's same-tool parallel-safety policy to whatever calls appear. + let parallel_tool_calls = Some(self.parallel_tool_calls.unwrap_or(false)); let renamed_tools = self .tools @@ -394,7 +397,7 @@ mod tests { } #[test] - fn to_upstream_request_serializes_parallel_tool_calls_for_client_function_tools() { + fn to_upstream_request_allows_parallel_tool_calls_for_client_function_tools() { let payload: RequestPayload = serde_json::from_value(serde_json::json!({ "model": "test", "input": "hi", @@ -405,13 +408,13 @@ mod tests { let upstream = payload .to_upstream_request(false) - .expect("function tools are serialized by the gateway"); + .expect("function tools allow parallel calls"); let value = serde_json::to_value(upstream).unwrap(); - assert_eq!(value["parallel_tool_calls"], false); + assert_eq!(value["parallel_tool_calls"], true); } #[test] - fn to_upstream_request_serializes_parallel_tool_calls_for_mixed_tools() { + fn to_upstream_request_preserves_parallel_tool_calls_for_mixed_tools() { for built_in_tool in builtin_tool_declarations() { for parallel_tool_calls in [false, true] { let payload: RequestPayload = serde_json::from_value(serde_json::json!({ @@ -428,16 +431,16 @@ mod tests { let value = serde_json::to_value( payload .to_upstream_request(false) - .expect("mixed tools are serialized by the gateway"), + .expect("mixed tools preserve the client's parallel_tool_calls value"), ) .unwrap(); - assert_eq!(value["parallel_tool_calls"], false); + assert_eq!(value["parallel_tool_calls"], parallel_tool_calls); } } } #[test] - fn to_upstream_request_sets_serial_tool_calls_for_builtin_tools() { + fn to_upstream_request_defaults_parallel_tool_calls_to_false_when_omitted() { for tool in builtin_tool_declarations() { let payload: RequestPayload = serde_json::from_value(serde_json::json!({ "model": "test", @@ -448,14 +451,14 @@ mod tests { let upstream = payload .to_upstream_request(false) - .expect("built-in tools default to serial tool calls"); + .expect("omitted parallel_tool_calls defaults to false"); let value = serde_json::to_value(upstream).unwrap(); assert_eq!(value["parallel_tool_calls"], false); } } #[test] - fn to_upstream_request_serializes_parallel_tool_calls_for_builtin_tools() { + fn to_upstream_request_allows_parallel_tool_calls_for_builtin_tools() { for tool in builtin_tool_declarations() { let payload: RequestPayload = serde_json::from_value(serde_json::json!({ "model": "test", @@ -467,9 +470,9 @@ mod tests { let upstream = payload .to_upstream_request(false) - .expect("parallel tool calls are ignored by the gateway"); + .expect("built-in tools allow parallel calls"); let value = serde_json::to_value(upstream).unwrap(); - assert_eq!(value["parallel_tool_calls"], false); + assert_eq!(value["parallel_tool_calls"], true); } } diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml new file mode 100644 index 00000000..e484b457 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml @@ -0,0 +1,752 @@ +turns: +- filename: t1 + request: + body: + input: 'Do two separate web_search calls in parallel, in this single turn -- + do not wait for one to finish before starting the other. The first web_search + call must batch two exact queries together: "potato nutrition facts" and "tomato + nutrition facts". The second web_search call must batch two different exact + queries together: "cucumber nutrition facts" and "carrot nutrition facts". + Issue both calls now, then summarize each of the four results in one sentence.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787834162 + error: null + id: resp_01a04338-4154-7d31-857b-58f1902e197e + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - id: mcpl_01a04338-4782-7f51-bbff-e96b2656eeb7 + server_label: gitmcp_tiktoken + tools: + - annotations: + read_only: false + description: 'Semantically search within the fetched documentation from + GitHub repository: openai/tiktoken. Useful for specific queries.' + input_schema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + properties: + query: + description: The search query to find relevant documentation + type: string + required: + - query + type: object + name: search_tiktoken_documentation + type: mcp_list_tools + - content: + - text: 'The user wants me to make two separate web_search calls in parallel, + each with two queries batched together. They want both calls issued now, + not waiting for one to finish before starting the other. + + + Let me structure this properly: + + + 1. First call: Batch "potato nutrition facts" and "tomato nutrition facts" + + 2. Second call: Batch "cucumber nutrition facts" and "carrot nutrition + facts" + + + I need to use the web_search function with the "queries" parameter (plural) + to batch multiple queries together in parallel. + + + Let me make both calls now. + + ' + type: reasoning_text + encrypted_content: null + id: rs_be155de4326b3b78 + status: null + summary: [] + type: reasoning + - action: + queries: + - potato nutrition facts + - tomato nutrition facts + query: potato nutrition facts + sources: + - title: Potato Nutrition Facts | Nutrients, Calories, Benefits of a Potato + url: https://potatogoodness.com/nutrition/ + - title: Potato + url: https://www.fda.gov/media/76882/download + - title: 'Potatoes 101: Nutrition Facts, Health Benefits, and Types' + url: https://www.healthline.com/nutrition/foods/potatoes + - title: Potato Facts + url: https://www.idahopotatomuseum.com/potato-facts/ + - title: Potato Nutrition & Facts + url: https://alsum.com/products/potato-nutrition-facts/ + - title: Nutritional Value - National Potato Council + url: https://www.nationalpotatocouncil.org/benefits-of-potatoes/nutritional-value/ + - title: Nutrition - Side Delights + url: https://www.sidedelights.com/potatoes/nutrition/ + - title: Are Potatoes Healthy? • The Nutrition Source + url: https://nutritionsource.hsph.harvard.edu/potatoes/ + - title: Food Search | USDA FoodData Central + url: https://fdc.nal.usda.gov/food-search/?query=potato + - title: Nutrition Facts – The Alliance for Potato Research & Education + url: https://apre.org/potatoes-and-public-health/nutrition-facts/ + - title: 'Tomatoes: Nutrition Facts and Health Benefits' + url: https://www.healthline.com/nutrition/tomatoes + - title: Tomatoes | SNAP-Ed + url: https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/tomatoes + - title: Tomato Nutrition Facts and Health Benefits + url: https://www.verywellhealth.com/tomato-nutrition-12012681 + - title: Nutrition Facts - URMC.Rochester.edu + url: https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11529-1 + - title: 'Tomatoes: A Nutritional Powerhouse and Culinary Favorite - UF/IFAS + ...' + url: https://blogs.ifas.ufl.edu/brevardco/2025/04/07/tomatoes-a-nutritional-powerhouse-and-culinary-favorite/ + - title: 'Tomatoes: Health Benefits, Nutrients per Serving, Preparation + ...' + url: https://www.webmd.com/diet/health-benefits-tomatoes + - title: Nutritional Composition and Bioactive Compounds in ... - PMC + url: https://pmc.ncbi.nlm.nih.gov/articles/PMC7823427/ + - title: 'Tomatoes 101: Nutrition Facts and Health Benefits' + url: https://www.healthline.com/nutrition/foods/tomatoes + - title: Tomato nutrition — British Tomato Growers Association + url: https://www.britishtomatoes.co.uk/tomato-nutrition + - title: 1 Oz Of Tomatoes Nutrition Facts - Eat This Much + url: https://www.eatthismuch.com/calories/tomatoes-2498?a=0.11812500000000001%3A5 + type: search + id: ws_98a8abf8a87525ab + status: completed + type: web_search_call + - action: + queries: + - cucumber nutrition facts + - carrot nutrition facts + query: cucumber nutrition facts + sources: + - title: Cucumber Nutrition Facts and Benefits - Franklin County Center + ... + url: https://franklin.ces.ncsu.edu/news/cucumber-nutrition-facts-and-benefits/ + - title: Health Benefits of Cucumber + url: https://www.webmd.com/food-recipes/cucumber-health-benefits + - title: Cucumbers | SNAP-Ed + url: https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/cucumbers + - title: Nutrition Facts - URMC.Rochester.edu + url: https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11206-1 + - title: Cucumber Nutrition Facts - Eat This Much + url: https://www.eatthismuch.com/calories/cucumber-1972 + - title: Nutrition Facts for Cucumber + url: https://tools.myfooddata.com/nutrition-facts/168409/wt9 + - title: Health Benefits of Cucumber + url: https://www.healthline.com/nutrition/health-benefits-of-cucumber + - title: Cucumbers are trendy, but how healthy are they? | American Heart + ... + url: https://www.heart.org/en/news/2025/01/17/cucumbers-are-trendy-but-how-healthy-are-they + - title: Cucumber Nutrition Facts and Health Benefits + url: https://www.verywellfit.com/cucumber-nutrition-facts-calories-and-health-benefits-4118563 + - title: Cucumber Nutritional Information + url: https://ingenaes.illinois.edu/wp-content/uploads/ING-Info-Sheet-2018_05-Cucumber-nutritional-value-Kowalewska.pdf + - title: Nutrition Facts - URMC.Rochester.edu + url: https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11124-3 + - title: 'Carrots 101: Nutrition Facts and Health Benefits' + url: https://www.healthline.com/nutrition/foods/carrots + - title: Carrots | SNAP-Ed + url: https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/carrots + - title: 'Carrots: Health Benefits, Nutrition Facts, and Risks' + url: https://www.webmd.com/food-recipes/benefits-carrots + - title: Carrots - Nutritional information | Wilcox + url: https://www.wilcoxgoodness.co.nz/helpful-info/nutritional-information/carrots + - title: Carrots, raw, 1 large (7-1/4" to 8-1/2" long) | University Hospitals + url: https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/carrots-raw-1-large-7-14-to-8-12-long + - title: Baby Carrots Nutrition Facts and Health Benefits + url: https://www.verywellfit.com/baby-carrot-nutrition-facts-and-health-benefits-5071650 + - title: Carrot Nutrition Facts 0g Fat 25 calories 0.5g Protein 1.5g Fiber + ... + url: https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf + - title: Baby Carrots Nutrition Facts - Eat This Much + url: https://www.eatthismuch.com/calories/baby-carrots-2569 + - title: Nutrition Facts for Raw Carrots + url: https://tools.myfooddata.com/nutrition-facts/170393/wt4 + type: search + id: ws_940083815464e4f3 + status: completed + type: web_search_call + - content: + - text: 'I have the results from both parallel web search calls. Let me summarize + each of the four results in one sentence: + + + 1. **Potato nutrition facts**: A medium-sized (5.3oz) skin-on potato contains + 110 calories with no fat, cholesterol, or sodium, while providing 30% + of the daily value for vitamin C, 15% for potassium, and notable amounts + of fiber, vitamin B6, and protein. + + + 2. **Tomato nutrition facts**: Tomatoes are low in calories (about 22 + calories per tomato) while being rich in vitamin C (19% of daily value), + potassium (comparable to a banana), and the antioxidant lycopene which + may reduce cancer and heart disease risk. + + + 3. **Cucumber nutrition facts**: Cucumber is approximately 95-96% water, + making it highly hydrating, with one large cucumber containing only about + 34 calories while providing modest amounts of vitamins K and C, and potassium. + + + 4. **Carrot nutrition facts**: One medium raw carrot contains about 25 + calories and is exceptionally rich in vitamin A (through beta-carotene), + also providing fiber, vitamin K, and potassium while being naturally fat-free. + + + Now I''ll present these summaries clearly. + + ' + type: reasoning_text + encrypted_content: null + id: rs_80609f3ae6519600 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + Both parallel web searches completed successfully. Here are the one-sentence + summaries for each: + + + **1. Potato nutrition facts:** A medium-sized (5.3oz) skin-on potato contains + 110 calories with no fat, cholesterol, or sodium, while providing 30% + of the daily value for vitamin C, 15% for potassium, and notable amounts + of fiber, vitamin B6, and 3g of protein. + + + **2. Tomato nutrition facts:** Tomatoes are low in calories (about 22 + calories per tomato) while being rich in vitamin C (19% of daily value), + potassium comparable to a banana, and the cancer-fighting antioxidant + lycopene linked to reduced heart disease risk. + + + **3. Cucumber nutrition facts:** Cucumber is approximately 95-96% water, + making it highly hydrating, with one large cucumber containing only about + 34 calories while providing modest amounts of vitamins K and C, and potassium. + + + **4. Carrot nutrition facts:** One medium raw carrot contains about 25 + calories and is exceptionally rich in vitamin A (through beta-carotene), + also providing fiber, vitamin K, and potassium while being naturally fat-free + and cholesterol-free.' + type: output_text + id: msg_8e69cc2a76b53048 + role: assistant + status: completed + type: message + previous_response_id: null + status: completed + usage: + input_tokens: 14575 + input_tokens_details: + cached_tokens: 0 + output_tokens: 719 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 15294 + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: 'Call gitmcp_tiktoken__search_tiktoken_documentation in parallel for + two separate exact queries -- do not wait for one to finish before starting + the other: (1) {"query":"encoding"} and (2) {"query":"tokenizer"}. Issue both + calls now in this single turn, then summarize each result in one sentence.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a04338-4154-7d31-857b-58f1902e197e + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787834170 + error: null + id: resp_01a04338-5ead-7121-9de7-513cce0fd745 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user wants me to make two parallel web_search calls using the + gitmcp_tiktoken__search_tiktoken_documentation tool for two different + queries about "encoding" and "tokenizer". They want both calls issued + in parallel without waiting for one to finish before starting the other, + then summarize each result in one sentence. + + + Let me make both calls now. + + ' + type: reasoning_text + encrypted_content: null + id: rs_9c5ba3694b2d95c6 + status: null + summary: [] + type: reasoning + - approval_request_id: null + arguments: '{"query": "encoding"}' + error: null + id: mcp_a8e0ca0a734fd5f9 + name: search_tiktoken_documentation + output: "### Search Results for: \"encoding\"\n\nNo relevant documentation\ + \ found for your query. It's either being indexed or the search query did\ + \ not match any documentation.\n\nAs a fallback, this is the documentation\ + \ for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding)\ + \ tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\n\ + enc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"\ + hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding\ + \ to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"\ + gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed\ + \ from [PyPI](https://pypi.org/project/tiktoken):\n```\npip install tiktoken\n\ + ```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample\ + \ code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\ + \n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable\ + \ open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\ + \nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast`\ + \ from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\ + \n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\ + \nIf you work at OpenAI, make sure to check the internal documentation or\ + \ feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage\ + \ models don't see text like you and I, instead they see a sequence of numbers\ + \ (known as tokens).\nByte pair encoding (BPE) is a way of converting text\ + \ into tokens. It has a couple desirable\nproperties:\n1) It's reversible\ + \ and lossless, so you can convert tokens back into the original text\n\ + 2) It works on arbitrary text, even text that is not in the tokeniser's\ + \ training data\n3) It compresses the text: the token sequence is shorter\ + \ than the bytes corresponding to the\n original text. On average, in\ + \ practice, each token corresponds to about 4 bytes.\n4) It attempts to\ + \ let the model see common subwords. For instance, \"ing\" is a common subword\ + \ in\n English, so BPE encodings will often split \"encoding\" into tokens\ + \ like \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"\ + ). Because the model will then see the \"ing\" token again and\n again\ + \ in different contexts, it helps models generalise and better understand\ + \ grammar.\n\n`tiktoken` contains an educational submodule that is friendlier\ + \ if you want to learn more about\nthe details of BPE, including code that\ + \ helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational\ + \ import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\ + \n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"\ + cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending\ + \ tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings.\ + \ There are two ways to do this.\n\n\n**Create your `Encoding` object exactly\ + \ the way you want and simply pass it around.**\n\n```python\ncl100k_base\ + \ = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the\ + \ arguments directly instead of accessing private attributes\n# See openai_public.py\ + \ for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n\ + \ # If you're changing the set of special tokens, make sure to use a\ + \ different name\n # It should be clear from the name what behaviour\ + \ to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n\ + \ mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n\ + \ **cl100k_base._special_tokens,\n \"<|im_start|>\": 100264,\n\ + \ \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext`\ + \ plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\ + \nThis is only useful if you need `tiktoken.get_encoding` to find your encoding,\ + \ otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace\ + \ package under `tiktoken_ext`.\n\nLayout your project like this, making\ + \ sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\ + ├── tiktoken_ext\n│   └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py`\ + \ should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\n\ + This is a dictionary from an encoding name to a function that takes no arguments\ + \ and returns\narguments that can be passed to `tiktoken.Encoding` to construct\ + \ that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For\ + \ precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should\ + \ look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\ + \nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=['tiktoken_ext*']),\n\ + \ install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen simply `pip\ + \ install ./my_tiktoken_extension` and you should be able to use your\n\ + custom encodings! Make sure **not** to use an editable install.\n\n\n\n\ + If you'd like to retry the search, try changing the query to increase the\ + \ likelihood of a match." + server_label: gitmcp_tiktoken + status: completed + type: mcp_call + - approval_request_id: null + arguments: '{"query": "tokenizer"}' + error: null + id: mcp_b19aa90f418844b9 + name: search_tiktoken_documentation + output: "### Search Results for: \"tokenizer\"\n\nNo relevant documentation\ + \ found for your query. It's either being indexed or the search query did\ + \ not match any documentation.\n\nAs a fallback, this is the documentation\ + \ for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding)\ + \ tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\n\ + enc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"\ + hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding\ + \ to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"\ + gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed\ + \ from [PyPI](https://pypi.org/project/tiktoken):\n```\npip install tiktoken\n\ + ```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample\ + \ code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\ + \n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable\ + \ open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\ + \nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast`\ + \ from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\ + \n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\ + \nIf you work at OpenAI, make sure to check the internal documentation or\ + \ feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage\ + \ models don't see text like you and I, instead they see a sequence of numbers\ + \ (known as tokens).\nByte pair encoding (BPE) is a way of converting text\ + \ into tokens. It has a couple desirable\nproperties:\n1) It's reversible\ + \ and lossless, so you can convert tokens back into the original text\n\ + 2) It works on arbitrary text, even text that is not in the tokeniser's\ + \ training data\n3) It compresses the text: the token sequence is shorter\ + \ than the bytes corresponding to the\n original text. On average, in\ + \ practice, each token corresponds to about 4 bytes.\n4) It attempts to\ + \ let the model see common subwords. For instance, \"ing\" is a common subword\ + \ in\n English, so BPE encodings will often split \"encoding\" into tokens\ + \ like \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"\ + ). Because the model will then see the \"ing\" token again and\n again\ + \ in different contexts, it helps models generalise and better understand\ + \ grammar.\n\n`tiktoken` contains an educational submodule that is friendlier\ + \ if you want to learn more about\nthe details of BPE, including code that\ + \ helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational\ + \ import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\ + \n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"\ + cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending\ + \ tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings.\ + \ There are two ways to do this.\n\n\n**Create your `Encoding` object exactly\ + \ the way you want and simply pass it around.**\n\n```python\ncl100k_base\ + \ = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the\ + \ arguments directly instead of accessing private attributes\n# See openai_public.py\ + \ for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n\ + \ # If you're changing the set of special tokens, make sure to use a\ + \ different name\n # It should be clear from the name what behaviour\ + \ to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n\ + \ mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n\ + \ **cl100k_base._special_tokens,\n \"<|im_start|>\": 100264,\n\ + \ \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext`\ + \ plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\ + \nThis is only useful if you need `tiktoken.get_encoding` to find your encoding,\ + \ otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace\ + \ package under `tiktoken_ext`.\n\nLayout your project like this, making\ + \ sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\ + ├── tiktoken_ext\n│   └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py`\ + \ should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\n\ + This is a dictionary from an encoding name to a function that takes no arguments\ + \ and returns\narguments that can be passed to `tiktoken.Encoding` to construct\ + \ that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For\ + \ precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should\ + \ look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\ + \nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=['tiktoken_ext*']),\n\ + \ install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen simply `pip\ + \ install ./my_tiktoken_extension` and you should be able to use your\n\ + custom encodings! Make sure **not** to use an editable install.\n\n\n\n\ + If you'd like to retry the search, try changing the query to increase the\ + \ likelihood of a match." + server_label: gitmcp_tiktoken + status: completed + type: mcp_call + - content: + - text: 'Both searches returned the same fallback documentation about tiktoken + since there was no specific match for "encoding" or "tokenizer" in the + documentation. Now I need to summarize each result in one sentence. + + ' + type: reasoning_text + encrypted_content: null + id: rs_9b01bdb06a1198f5 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + **1. Encoding query result:** Both searches returned the same fallback + documentation explaining that `tiktoken` is a fast BPE tokeniser for OpenAI''s + models, with a 3-6x performance advantage over comparable open source + tokenisers and detailed instructions on creating custom encodings. + + + **2. Tokenizer query result:** The query returned identical fallback documentation + to the encoding search, containing installation instructions, usage examples + showing how to get encodings for specific models, and a comprehensive + explanation of Byte Pair Encoding (BPE) mechanics including how it converts + text to tokens reversibly and compresses text efficiently.' + type: output_text + id: msg_bb5682d0072a4f11 + role: assistant + status: completed + type: message + previous_response_id: resp_01a04338-4154-7d31-857b-58f1902e197e + status: completed + usage: + input_tokens: 30858 + input_tokens_details: + cached_tokens: 0 + output_tokens: 318 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 31176 + headers: + content-type: application/json + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one to finish before starting the other: (1) search the web for the + exact query "latest vLLM release notes", and (2) call gitmcp_tiktoken__search_tiktoken_documentation + with {"query":"encoding"}. Do not call any other tool.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a04338-5ead-7121-9de7-513cce0fd745 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787834179 + error: null + id: resp_01a04338-7df9-7500-8004-b2b8685c8462 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user wants me to: + + 1. Call web_search for "latest vLLM release notes" + + 2. Call gitmcp_tiktoken__search_tiktoken_documentation with {"query":"encoding"} + + + Both should be done in parallel in a single turn. I''ll issue both function + calls now. + + ' + type: reasoning_text + encrypted_content: null + id: rs_a55e84708190c33c + status: null + summary: [] + type: reasoning + - action: + queries: + - latest vLLM release notes + query: latest vLLM release notes + sources: + - title: Releases · vllm-project/vllm + url: https://github.com/vllm-project/vllm/releases + - title: vLLM Release Notes - NVIDIA Docs + url: https://docs.nvidia.com/deeplearning/frameworks/vllm-release-notes/index.html + - title: Release Notes - vLLM Ascend + url: https://docs.vllm.ai/projects/ascend/en/latest/user_guide/release_notes.html + - title: Release Notes — vllm-ascend + url: https://docs.vllm.ai/projects/ascend/en/main/user_guide/release_notes.html + - title: Previous vLLM Releases | vLLM + url: https://vllm.ai/releases + - title: Releases · vllm-project/vllm-ascend + url: https://github.com/vllm-project/vllm-ascend/releases + - title: Releases · vllm-project/vllm-omni + url: https://github.com/vllm-project/vllm-omni/releases + - title: Release Notes - vLLM Hardware Plugin for Intel® Gaudi® + url: https://docs.vllm.ai/projects/gaudi/en/latest/release_notes.html + - title: RN-11517-001_v26.07 | August 2026 vLLM Release Notes + url: https://docs.nvidia.com/deeplearning/frameworks/pdf/vLLM-Release-Notes.pdf + - title: vllm-project/vllm v0.27.0 on GitHub + url: https://newreleases.io/project/github/vllm-project/vllm/release/v0.27.0 + type: search + id: ws_9641fecc06b40df5 + status: completed + type: web_search_call + - approval_request_id: null + arguments: '{"query": "encoding"}' + error: null + id: mcp_88b46610619c2d88 + name: search_tiktoken_documentation + output: "### Search Results for: \"encoding\"\n\nNo relevant documentation\ + \ found for your query. It's either being indexed or the search query did\ + \ not match any documentation.\n\nAs a fallback, this is the documentation\ + \ for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding)\ + \ tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\n\ + enc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"\ + hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding\ + \ to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"\ + gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed\ + \ from [PyPI](https://pypi.org/project/tiktoken):\n```\npip install tiktoken\n\ + ```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample\ + \ code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\ + \n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable\ + \ open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\ + \nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast`\ + \ from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\ + \n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\ + \nIf you work at OpenAI, make sure to check the internal documentation or\ + \ feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage\ + \ models don't see text like you and I, instead they see a sequence of numbers\ + \ (known as tokens).\nByte pair encoding (BPE) is a way of converting text\ + \ into tokens. It has a couple desirable\nproperties:\n1) It's reversible\ + \ and lossless, so you can convert tokens back into the original text\n\ + 2) It works on arbitrary text, even text that is not in the tokeniser's\ + \ training data\n3) It compresses the text: the token sequence is shorter\ + \ than the bytes corresponding to the\n original text. On average, in\ + \ practice, each token corresponds to about 4 bytes.\n4) It attempts to\ + \ let the model see common subwords. For instance, \"ing\" is a common subword\ + \ in\n English, so BPE encodings will often split \"encoding\" into tokens\ + \ like \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"\ + ). Because the model will then see the \"ing\" token again and\n again\ + \ in different contexts, it helps models generalise and better understand\ + \ grammar.\n\n`tiktoken` contains an educational submodule that is friendlier\ + \ if you want to learn more about\nthe details of BPE, including code that\ + \ helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational\ + \ import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\ + \n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"\ + cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending\ + \ tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings.\ + \ There are two ways to do this.\n\n\n**Create your `Encoding` object exactly\ + \ the way you want and simply pass it around.**\n\n```python\ncl100k_base\ + \ = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the\ + \ arguments directly instead of accessing private attributes\n# See openai_public.py\ + \ for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n\ + \ # If you're changing the set of special tokens, make sure to use a\ + \ different name\n # It should be clear from the name what behaviour\ + \ to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n\ + \ mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n\ + \ **cl100k_base._special_tokens,\n \"<|im_start|>\": 100264,\n\ + \ \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext`\ + \ plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\ + \nThis is only useful if you need `tiktoken.get_encoding` to find your encoding,\ + \ otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace\ + \ package under `tiktoken_ext`.\n\nLayout your project like this, making\ + \ sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\ + ├── tiktoken_ext\n│   └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py`\ + \ should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\n\ + This is a dictionary from an encoding name to a function that takes no arguments\ + \ and returns\narguments that can be passed to `tiktoken.Encoding` to construct\ + \ that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For\ + \ precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should\ + \ look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\ + \nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=['tiktoken_ext*']),\n\ + \ install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen simply `pip\ + \ install ./my_tiktoken_extension` and you should be able to use your\n\ + custom encodings! Make sure **not** to use an editable install.\n\n\n\n\ + If you'd like to retry the search, try changing the query to increase the\ + \ likelihood of a match." + server_label: gitmcp_tiktoken + status: completed + type: mcp_call + - content: + - text: 'Both parallel calls completed. Now I need to summarize each result + in one sentence. + + + 1. Web search for "latest vLLM release notes": The search found that the + latest vLLM version is v0.27.0 with 411 commits from 212 contributors + (61 new), featuring XPU optimizations including QK Norm + RoPE fusion + pass, FP8 support, and other improvements. + + + 2. GitMCP tiktoken search for "encoding": The search returned fallback + documentation explaining that tiktoken is a fast BPE tokeniser for OpenAI''s + models, with 3-6x performance advantage over comparable open source tokenisers. + + ' + type: reasoning_text + encrypted_content: null + id: rs_8047b768207eb6a9 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + **1. Web search for latest vLLM release notes:** The latest vLLM release + is v0.27.0 with 411 commits from 212 contributors, featuring XPU optimizations + including QK Norm + RoPE fusion pass, FP8 o_proj support, DeepSeek-V4 + kernel paths, and CPU improvements for Arm, Power, and s390x architectures. + + + **2. GitMCP tiktoken encoding documentation:** The search returned fallback + documentation explaining that tiktoken is a fast BPE tokeniser for OpenAI''s + models, offering 3-6x performance improvement over comparable open source + tokenisers with detailed examples of how to get encodings for specific + models and extend tiktoken with custom encodings.' + type: output_text + id: msg_bcfeec5bc5a406b5 + role: assistant + status: completed + type: message + previous_response_id: resp_01a04338-5ead-7121-9de7-513cce0fd745 + status: completed + usage: + input_tokens: 39846 + input_tokens_details: + cached_tokens: 0 + output_tokens: 430 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 40276 + headers: + content-type: application/json + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml new file mode 100644 index 00000000..7310e4fb --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml @@ -0,0 +1,13662 @@ +turns: +- filename: t1 + request: + body: + input: 'Do two separate web_search calls in parallel, in this single turn -- + do not wait for one to finish before starting the other. The first web_search + call must batch two exact queries together: "potato nutrition facts" and "tomato + nutrition facts". The second web_search call must batch two different exact + queries together: "cucumber nutrition facts" and "carrot nutrition facts". + Issue both calls now, then summarize each of the four results in one sentence.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787834130,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a04337-da11-7f50-a4de-b95f2e147f88","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","name":"mcp__gitmcp_tiktoken__search_tiktoken_documentation","output_schema":null,"parameters":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"strict":false,"type":"function"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787834130,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a04337-da11-7f50-a4de-b95f2e147f88","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","name":"mcp__gitmcp_tiktoken__search_tiktoken_documentation","output_schema":null,"parameters":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"strict":false,"type":"function"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"item":{"id":"mcpl_01a04337-df7f-7f22-ba2b-d2a58019e843","server_label":"gitmcp_tiktoken","tools":[],"type":"mcp_list_tools"},"output_index":0} + + ' + - ' + + ' + - 'event: response.mcp_list_tools.in_progress + + ' + - 'data: {"type":"response.mcp_list_tools.in_progress","sequence_number":3,"item_id":"mcpl_01a04337-df7f-7f22-ba2b-d2a58019e843","output_index":0} + + ' + - ' + + ' + - 'event: response.mcp_list_tools.completed + + ' + - 'data: {"type":"response.mcp_list_tools.completed","sequence_number":4,"item_id":"mcpl_01a04337-df7f-7f22-ba2b-d2a58019e843","output_index":0} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":5,"item":{"id":"mcpl_01a04337-df7f-7f22-ba2b-d2a58019e843","server_label":"gitmcp_tiktoken","tools":[{"annotations":{"read_only":false},"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","input_schema":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"name":"search_tiktoken_documentation"}],"type":"mcp_list_tools"},"output_index":0} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":6,"output_index":1,"item":{"content":null,"encrypted_content":null,"id":"8686e1d942b3cb83","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":7,"output_index":1,"content_index":0,"item_id":"8686e1d942b3cb83","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":1,"content_index":0,"delta":"The","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":1,"content_index":0,"delta":" + user wants me to make two","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":1,"content_index":0,"delta":" + web","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":1,"content_index":0,"delta":"_search","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":1,"content_index":0,"delta":" + calls","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":1,"content_index":0,"delta":" + in","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":1,"content_index":0,"delta":" + parallel","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":1,"content_index":0,"delta":".","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":1,"content_index":0,"delta":" + Each","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":1,"content_index":0,"delta":" + call","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":1,"content_index":0,"delta":" + should","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":1,"content_index":0,"delta":" + have","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":1,"content_index":0,"delta":" + two","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":1,"content_index":0,"delta":" + queries","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":1,"content_index":0,"delta":" + batch","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":1,"content_index":0,"delta":"ed","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":1,"content_index":0,"delta":" + together","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":1,"content_index":0,"delta":".","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":1,"content_index":0,"delta":" + I","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":1,"content_index":0,"delta":" + need","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":1,"content_index":0,"delta":" + to","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":1,"content_index":0,"delta":" + issue","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":1,"content_index":0,"delta":" + both","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":1,"content_index":0,"delta":" + calls","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":1,"content_index":0,"delta":" + now","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":1,"content_index":0,"delta":" + and","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":1,"content_index":0,"delta":" + then","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":1,"content_index":0,"delta":" + summarize","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":1,"content_index":0,"delta":" + each","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":1,"content_index":0,"delta":" + of","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":1,"content_index":0,"delta":" + the","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":1,"content_index":0,"delta":" + four","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":1,"content_index":0,"delta":" + results","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":1,"content_index":0,"delta":" + in","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":1,"content_index":0,"delta":" + one","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":1,"content_index":0,"delta":" + sentence","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":1,"content_index":0,"delta":".","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":1,"content_index":0,"delta":"Let","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":1,"content_index":0,"delta":" + me","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":1,"content_index":0,"delta":" + make","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":1,"content_index":0,"delta":" + both","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":1,"content_index":0,"delta":" + calls","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":1,"content_index":0,"delta":" + simultaneously","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":1,"content_index":0,"delta":" + using","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":1,"content_index":0,"delta":" + the","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":1,"content_index":0,"delta":" + queries","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":1,"content_index":0,"delta":" + parameter","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":1,"content_index":0,"delta":" + which","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":1,"content_index":0,"delta":" + allows","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":1,"content_index":0,"delta":" + multiple","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":1,"content_index":0,"delta":" + queries","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":1,"content_index":0,"delta":" + to","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":1,"content_index":0,"delta":" + be","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":1,"content_index":0,"delta":" + run","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":1,"content_index":0,"delta":" + in","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":1,"content_index":0,"delta":" + parallel","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":1,"content_index":0,"delta":".","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":1,"content_index":0,"delta":"First","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":1,"content_index":0,"delta":" + call","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":1,"content_index":0,"delta":":","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":1,"content_index":0,"delta":" + \"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":1,"content_index":0,"delta":"pot","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":1,"content_index":0,"delta":"ato","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":1,"content_index":0,"delta":" + nutrition","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":1,"content_index":0,"delta":" + facts","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":1,"content_index":0,"delta":"\"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":1,"content_index":0,"delta":" + and","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":1,"content_index":0,"delta":" + \"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":1,"content_index":0,"delta":"tom","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":1,"content_index":0,"delta":"ato","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":1,"content_index":0,"delta":" + nutrition","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":81,"output_index":1,"content_index":0,"delta":" + facts","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":82,"output_index":1,"content_index":0,"delta":"\"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":83,"output_index":1,"content_index":0,"delta":"\n","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":84,"output_index":1,"content_index":0,"delta":"Second","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":85,"output_index":1,"content_index":0,"delta":" + call","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":86,"output_index":1,"content_index":0,"delta":":","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":87,"output_index":1,"content_index":0,"delta":" + \"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":88,"output_index":1,"content_index":0,"delta":"c","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":89,"output_index":1,"content_index":0,"delta":"ucumber","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":90,"output_index":1,"content_index":0,"delta":" + nutrition","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":91,"output_index":1,"content_index":0,"delta":" + facts","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":1,"content_index":0,"delta":"\"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":93,"output_index":1,"content_index":0,"delta":" + and","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":94,"output_index":1,"content_index":0,"delta":" + \"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":95,"output_index":1,"content_index":0,"delta":"car","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":96,"output_index":1,"content_index":0,"delta":"rot","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":97,"output_index":1,"content_index":0,"delta":" + nutrition","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":98,"output_index":1,"content_index":0,"delta":" + facts\"","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":99,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":100,"output_index":1,"content_index":0,"delta":"I","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":101,"output_index":1,"content_index":0,"delta":"''ll","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":102,"output_index":1,"content_index":0,"delta":" + structure","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":103,"output_index":1,"content_index":0,"delta":" + this","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":104,"output_index":1,"content_index":0,"delta":" + properly","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":105,"output_index":1,"content_index":0,"delta":" + with","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":106,"output_index":1,"content_index":0,"delta":" + the","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":107,"output_index":1,"content_index":0,"delta":" + queries","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":108,"output_index":1,"content_index":0,"delta":" + parameter","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":109,"output_index":1,"content_index":0,"delta":" + as","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":110,"output_index":1,"content_index":0,"delta":" + an","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":111,"output_index":1,"content_index":0,"delta":" + array","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":112,"output_index":1,"content_index":0,"delta":" + for","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":113,"output_index":1,"content_index":0,"delta":" + each","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":114,"output_index":1,"content_index":0,"delta":" + call","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":115,"output_index":1,"content_index":0,"delta":".","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":116,"output_index":1,"content_index":0,"delta":"\n","item_id":"8686e1d942b3cb83"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":117,"output_index":1,"content_index":0,"item_id":"8686e1d942b3cb83","text":"The + user wants me to make two web_search calls in parallel. Each call should have + two queries batched together. I need to issue both calls now and then summarize + each of the four results in one sentence.\n\nLet me make both calls simultaneously + using the queries parameter which allows multiple queries to be run in parallel.\n\nFirst + call: \"potato nutrition facts\" and \"tomato nutrition facts\"\nSecond call: + \"cucumber nutrition facts\" and \"carrot nutrition facts\"\n\nI''ll structure + this properly with the queries parameter as an array for each call.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":118,"output_index":1,"content_index":0,"item_id":"8686e1d942b3cb83","part":{"text":"The + user wants me to make two web_search calls in parallel. Each call should have + two queries batched together. I need to issue both calls now and then summarize + each of the four results in one sentence.\n\nLet me make both calls simultaneously + using the queries parameter which allows multiple queries to be run in parallel.\n\nFirst + call: \"potato nutrition facts\" and \"tomato nutrition facts\"\nSecond call: + \"cucumber nutrition facts\" and \"carrot nutrition facts\"\n\nI''ll structure + this properly with the queries parameter as an array for each call.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":119,"output_index":1,"item":{"content":[{"text":"The + user wants me to make two web_search calls in parallel. Each call should have + two queries batched together. I need to issue both calls now and then summarize + each of the four results in one sentence.\n\nLet me make both calls simultaneously + using the queries parameter which allows multiple queries to be run in parallel.\n\nFirst + call: \"potato nutrition facts\" and \"tomato nutrition facts\"\nSecond call: + \"cucumber nutrition facts\" and \"carrot nutrition facts\"\n\nI''ll structure + this properly with the queries parameter as an array for each call.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8686e1d942b3cb83","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":120,"item":{"action":{"queries":["potato + nutrition facts","tomato nutrition facts"],"query":"potato nutrition facts","type":"search"},"id":"ws_b0a1388bc3fc8164","status":"in_progress","type":"web_search_call"},"output_index":2} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","sequence_number":121,"item_id":"ws_b0a1388bc3fc8164","output_index":2} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","sequence_number":122,"item_id":"ws_b0a1388bc3fc8164","output_index":2} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":123,"item":{"action":{"queries":["cucumber + nutrition facts","carrot nutrition facts"],"query":"cucumber nutrition facts","type":"search"},"id":"ws_a77170dd568c8dec","status":"in_progress","type":"web_search_call"},"output_index":3} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","sequence_number":124,"item_id":"ws_a77170dd568c8dec","output_index":3} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","sequence_number":125,"item_id":"ws_a77170dd568c8dec","output_index":3} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","sequence_number":126,"item":{"action":{"queries":["potato + nutrition facts","tomato nutrition facts"],"query":"potato nutrition facts","sources":[{"title":"Potato + Nutrition Facts | Nutrients, Calories, Benefits of a Potato","url":"https://potatogoodness.com/nutrition/"},{"title":"Potato","url":"https://www.fda.gov/media/76882/download"},{"title":"Potatoes + 101: Nutrition Facts, Health Benefits, and Types","url":"https://www.healthline.com/nutrition/foods/potatoes"},{"title":"Potato + Facts","url":"https://www.idahopotatomuseum.com/potato-facts/"},{"title":"Potato + Nutrition & Facts","url":"https://alsum.com/products/potato-nutrition-facts/"},{"title":"Nutritional + Value - National Potato Council","url":"https://www.nationalpotatocouncil.org/benefits-of-potatoes/nutritional-value/"},{"title":"Nutrition + - Side Delights","url":"https://www.sidedelights.com/potatoes/nutrition/"},{"title":"Are + Potatoes Healthy? • The Nutrition Source","url":"https://nutritionsource.hsph.harvard.edu/potatoes/"},{"title":"Food + Search | USDA FoodData Central","url":"https://fdc.nal.usda.gov/food-search/?query=potato"},{"title":"Nutrition + Facts – The Alliance for Potato Research & Education","url":"https://apre.org/potatoes-and-public-health/nutrition-facts/"},{"title":"Tomatoes: + Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/tomatoes"},{"title":"Tomatoes + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/tomatoes"},{"title":"Tomato + Nutrition Facts and Health Benefits","url":"https://www.verywellhealth.com/tomato-nutrition-12012681"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11529-1"},{"title":"Tomatoes: + A Nutritional Powerhouse and Culinary Favorite - UF/IFAS ...","url":"https://blogs.ifas.ufl.edu/brevardco/2025/04/07/tomatoes-a-nutritional-powerhouse-and-culinary-favorite/"},{"title":"Tomatoes: + Health Benefits, Nutrients per Serving, Preparation ...","url":"https://www.webmd.com/diet/health-benefits-tomatoes"},{"title":"Nutritional + Composition and Bioactive Compounds in ... - PMC","url":"https://pmc.ncbi.nlm.nih.gov/articles/PMC7823427/"},{"title":"Tomatoes + 101: Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/foods/tomatoes"},{"title":"Tomato + nutrition — British Tomato Growers Association","url":"https://www.britishtomatoes.co.uk/tomato-nutrition"},{"title":"1 + Oz Of Tomatoes Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/tomatoes-2498?a=0.11812500000000001%3A5"}],"type":"search"},"id":"ws_b0a1388bc3fc8164","status":"completed","type":"web_search_call"},"item_id":"ws_b0a1388bc3fc8164","output_index":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":127,"item":{"action":{"queries":["potato + nutrition facts","tomato nutrition facts"],"query":"potato nutrition facts","sources":[{"title":"Potato + Nutrition Facts | Nutrients, Calories, Benefits of a Potato","url":"https://potatogoodness.com/nutrition/"},{"title":"Potato","url":"https://www.fda.gov/media/76882/download"},{"title":"Potatoes + 101: Nutrition Facts, Health Benefits, and Types","url":"https://www.healthline.com/nutrition/foods/potatoes"},{"title":"Potato + Facts","url":"https://www.idahopotatomuseum.com/potato-facts/"},{"title":"Potato + Nutrition & Facts","url":"https://alsum.com/products/potato-nutrition-facts/"},{"title":"Nutritional + Value - National Potato Council","url":"https://www.nationalpotatocouncil.org/benefits-of-potatoes/nutritional-value/"},{"title":"Nutrition + - Side Delights","url":"https://www.sidedelights.com/potatoes/nutrition/"},{"title":"Are + Potatoes Healthy? • The Nutrition Source","url":"https://nutritionsource.hsph.harvard.edu/potatoes/"},{"title":"Food + Search | USDA FoodData Central","url":"https://fdc.nal.usda.gov/food-search/?query=potato"},{"title":"Nutrition + Facts – The Alliance for Potato Research & Education","url":"https://apre.org/potatoes-and-public-health/nutrition-facts/"},{"title":"Tomatoes: + Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/tomatoes"},{"title":"Tomatoes + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/tomatoes"},{"title":"Tomato + Nutrition Facts and Health Benefits","url":"https://www.verywellhealth.com/tomato-nutrition-12012681"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11529-1"},{"title":"Tomatoes: + A Nutritional Powerhouse and Culinary Favorite - UF/IFAS ...","url":"https://blogs.ifas.ufl.edu/brevardco/2025/04/07/tomatoes-a-nutritional-powerhouse-and-culinary-favorite/"},{"title":"Tomatoes: + Health Benefits, Nutrients per Serving, Preparation ...","url":"https://www.webmd.com/diet/health-benefits-tomatoes"},{"title":"Nutritional + Composition and Bioactive Compounds in ... - PMC","url":"https://pmc.ncbi.nlm.nih.gov/articles/PMC7823427/"},{"title":"Tomatoes + 101: Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/foods/tomatoes"},{"title":"Tomato + nutrition — British Tomato Growers Association","url":"https://www.britishtomatoes.co.uk/tomato-nutrition"},{"title":"1 + Oz Of Tomatoes Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/tomatoes-2498?a=0.11812500000000001%3A5"}],"type":"search"},"id":"ws_b0a1388bc3fc8164","status":"completed","type":"web_search_call"},"output_index":2} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","sequence_number":128,"item":{"action":{"queries":["cucumber + nutrition facts","carrot nutrition facts"],"query":"cucumber nutrition facts","sources":[{"title":"Cucumber + Nutrition Facts and Benefits - Franklin County Center ...","url":"https://franklin.ces.ncsu.edu/news/cucumber-nutrition-facts-and-benefits/"},{"title":"Health + Benefits of Cucumber","url":"https://www.webmd.com/food-recipes/cucumber-health-benefits"},{"title":"Cucumbers + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/cucumbers"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11206-1"},{"title":"Cucumber + Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/cucumber-1972"},{"title":"Nutrition + Facts for Cucumber","url":"https://tools.myfooddata.com/nutrition-facts/168409/wt9"},{"title":"Health + Benefits of Cucumber","url":"https://www.healthline.com/nutrition/health-benefits-of-cucumber"},{"title":"Cucumbers + are trendy, but how healthy are they? | American Heart ...","url":"https://www.heart.org/en/news/2025/01/17/cucumbers-are-trendy-but-how-healthy-are-they"},{"title":"Cucumber + Nutrition Facts and Health Benefits","url":"https://www.verywellfit.com/cucumber-nutrition-facts-calories-and-health-benefits-4118563"},{"title":"Cucumber + Nutritional Information","url":"https://ingenaes.illinois.edu/wp-content/uploads/ING-Info-Sheet-2018_05-Cucumber-nutritional-value-Kowalewska.pdf"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11124-3"},{"title":"Carrots + 101: Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/foods/carrots"},{"title":"Carrots + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/carrots"},{"title":"Carrots: + Health Benefits, Nutrition Facts, and Risks","url":"https://www.webmd.com/food-recipes/benefits-carrots"},{"title":"Carrots + - Nutritional information | Wilcox","url":"https://www.wilcoxgoodness.co.nz/helpful-info/nutritional-information/carrots"},{"title":"Carrots, + raw, 1 large (7-1/4\" to 8-1/2\" long) | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/carrots-raw-1-large-7-14-to-8-12-long"},{"title":"Baby + Carrots Nutrition Facts and Health Benefits","url":"https://www.verywellfit.com/baby-carrot-nutrition-facts-and-health-benefits-5071650"},{"title":"Carrot + Nutrition Facts 0g Fat 25 calories 0.5g Protein 1.5g Fiber ...","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf"},{"title":"Baby + Carrots Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/baby-carrots-2569"},{"title":"Nutrition + Facts for Raw Carrots","url":"https://tools.myfooddata.com/nutrition-facts/170393/wt4"}],"type":"search"},"id":"ws_a77170dd568c8dec","status":"completed","type":"web_search_call"},"item_id":"ws_a77170dd568c8dec","output_index":3} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":129,"item":{"action":{"queries":["cucumber + nutrition facts","carrot nutrition facts"],"query":"cucumber nutrition facts","sources":[{"title":"Cucumber + Nutrition Facts and Benefits - Franklin County Center ...","url":"https://franklin.ces.ncsu.edu/news/cucumber-nutrition-facts-and-benefits/"},{"title":"Health + Benefits of Cucumber","url":"https://www.webmd.com/food-recipes/cucumber-health-benefits"},{"title":"Cucumbers + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/cucumbers"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11206-1"},{"title":"Cucumber + Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/cucumber-1972"},{"title":"Nutrition + Facts for Cucumber","url":"https://tools.myfooddata.com/nutrition-facts/168409/wt9"},{"title":"Health + Benefits of Cucumber","url":"https://www.healthline.com/nutrition/health-benefits-of-cucumber"},{"title":"Cucumbers + are trendy, but how healthy are they? | American Heart ...","url":"https://www.heart.org/en/news/2025/01/17/cucumbers-are-trendy-but-how-healthy-are-they"},{"title":"Cucumber + Nutrition Facts and Health Benefits","url":"https://www.verywellfit.com/cucumber-nutrition-facts-calories-and-health-benefits-4118563"},{"title":"Cucumber + Nutritional Information","url":"https://ingenaes.illinois.edu/wp-content/uploads/ING-Info-Sheet-2018_05-Cucumber-nutritional-value-Kowalewska.pdf"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11124-3"},{"title":"Carrots + 101: Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/foods/carrots"},{"title":"Carrots + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/carrots"},{"title":"Carrots: + Health Benefits, Nutrition Facts, and Risks","url":"https://www.webmd.com/food-recipes/benefits-carrots"},{"title":"Carrots + - Nutritional information | Wilcox","url":"https://www.wilcoxgoodness.co.nz/helpful-info/nutritional-information/carrots"},{"title":"Carrots, + raw, 1 large (7-1/4\" to 8-1/2\" long) | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/carrots-raw-1-large-7-14-to-8-12-long"},{"title":"Baby + Carrots Nutrition Facts and Health Benefits","url":"https://www.verywellfit.com/baby-carrot-nutrition-facts-and-health-benefits-5071650"},{"title":"Carrot + Nutrition Facts 0g Fat 25 calories 0.5g Protein 1.5g Fiber ...","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf"},{"title":"Baby + Carrots Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/baby-carrots-2569"},{"title":"Nutrition + Facts for Raw Carrots","url":"https://tools.myfooddata.com/nutrition-facts/170393/wt4"}],"type":"search"},"id":"ws_a77170dd568c8dec","status":"completed","type":"web_search_call"},"output_index":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":130,"output_index":4,"item":{"content":null,"encrypted_content":null,"id":"897dbddc054dbb0b","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":131,"output_index":4,"content_index":0,"item_id":"897dbddc054dbb0b","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":132,"output_index":4,"content_index":0,"delta":"Both","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":133,"output_index":4,"content_index":0,"delta":" + searches","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":134,"output_index":4,"content_index":0,"delta":" + completed","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":135,"output_index":4,"content_index":0,"delta":" + successfully","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":136,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":137,"output_index":4,"content_index":0,"delta":" + Let","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":138,"output_index":4,"content_index":0,"delta":" + me","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":139,"output_index":4,"content_index":0,"delta":" + summarize","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":140,"output_index":4,"content_index":0,"delta":" + each","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":141,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":142,"output_index":4,"content_index":0,"delta":" + the","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":143,"output_index":4,"content_index":0,"delta":" + four","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":144,"output_index":4,"content_index":0,"delta":" + results","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":145,"output_index":4,"content_index":0,"delta":" + in","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":146,"output_index":4,"content_index":0,"delta":" + one","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":147,"output_index":4,"content_index":0,"delta":" + sentence","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":148,"output_index":4,"content_index":0,"delta":" + each","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":149,"output_index":4,"content_index":0,"delta":":","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":150,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":151,"output_index":4,"content_index":0,"delta":"1","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":152,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":153,"output_index":4,"content_index":0,"delta":" + Potato","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":154,"output_index":4,"content_index":0,"delta":" + nutrition","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":155,"output_index":4,"content_index":0,"delta":" + facts","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":156,"output_index":4,"content_index":0,"delta":":","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":157,"output_index":4,"content_index":0,"delta":" + A","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":158,"output_index":4,"content_index":0,"delta":" + medium","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":159,"output_index":4,"content_index":0,"delta":"-sized","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":160,"output_index":4,"content_index":0,"delta":" + potato","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":161,"output_index":4,"content_index":0,"delta":" + with","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":162,"output_index":4,"content_index":0,"delta":" + skin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":163,"output_index":4,"content_index":0,"delta":" + contains","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":164,"output_index":4,"content_index":0,"delta":" + approximately","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":165,"output_index":4,"content_index":0,"delta":" + ","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":166,"output_index":4,"content_index":0,"delta":"1","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":167,"output_index":4,"content_index":0,"delta":"1","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":168,"output_index":4,"content_index":0,"delta":"0","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":169,"output_index":4,"content_index":0,"delta":" + calories","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":170,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":171,"output_index":4,"content_index":0,"delta":" + is","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":172,"output_index":4,"content_index":0,"delta":" + fat","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":173,"output_index":4,"content_index":0,"delta":"-free","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":174,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":175,"output_index":4,"content_index":0,"delta":" + cholesterol","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":176,"output_index":4,"content_index":0,"delta":"-free","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":177,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":178,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":179,"output_index":4,"content_index":0,"delta":" + provides","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":180,"output_index":4,"content_index":0,"delta":" + significant","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":181,"output_index":4,"content_index":0,"delta":" + amounts","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":182,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":183,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":184,"output_index":4,"content_index":0,"delta":" + C","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":185,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":186,"output_index":4,"content_index":0,"delta":"3","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":187,"output_index":4,"content_index":0,"delta":"0","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":188,"output_index":4,"content_index":0,"delta":"%","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":189,"output_index":4,"content_index":0,"delta":" + DV","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":190,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":191,"output_index":4,"content_index":0,"delta":" + potassium","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":192,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":193,"output_index":4,"content_index":0,"delta":"1","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":194,"output_index":4,"content_index":0,"delta":"5","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":195,"output_index":4,"content_index":0,"delta":"-","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":196,"output_index":4,"content_index":0,"delta":"2","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":197,"output_index":4,"content_index":0,"delta":"0","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":198,"output_index":4,"content_index":0,"delta":"%","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":199,"output_index":4,"content_index":0,"delta":" + DV","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":200,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":201,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":202,"output_index":4,"content_index":0,"delta":" + B","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":203,"output_index":4,"content_index":0,"delta":"6","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":204,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":205,"output_index":4,"content_index":0,"delta":"1","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":206,"output_index":4,"content_index":0,"delta":"0","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":207,"output_index":4,"content_index":0,"delta":"%),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":208,"output_index":4,"content_index":0,"delta":" + fiber","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":209,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":210,"output_index":4,"content_index":0,"delta":"7","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":211,"output_index":4,"content_index":0,"delta":"%),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":212,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":213,"output_index":4,"content_index":0,"delta":" + carbohydrates","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":214,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":215,"output_index":4,"content_index":0,"delta":"2","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":216,"output_index":4,"content_index":0,"delta":"6","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":217,"output_index":4,"content_index":0,"delta":"g","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":218,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":219,"output_index":4,"content_index":0,"delta":" + making","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":220,"output_index":4,"content_index":0,"delta":" + it","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":221,"output_index":4,"content_index":0,"delta":" + a","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":222,"output_index":4,"content_index":0,"delta":" + nutrient","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":223,"output_index":4,"content_index":0,"delta":"-d","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":224,"output_index":4,"content_index":0,"delta":"ense","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":225,"output_index":4,"content_index":0,"delta":" + food","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":226,"output_index":4,"content_index":0,"delta":" + that","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":227,"output_index":4,"content_index":0,"delta":" + can","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":228,"output_index":4,"content_index":0,"delta":" + be","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":229,"output_index":4,"content_index":0,"delta":" + part","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":230,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":231,"output_index":4,"content_index":0,"delta":" + a","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":232,"output_index":4,"content_index":0,"delta":" + healthy","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":233,"output_index":4,"content_index":0,"delta":" + diet","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":234,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":235,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":236,"output_index":4,"content_index":0,"delta":"2","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":237,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":238,"output_index":4,"content_index":0,"delta":" + Tomato","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":239,"output_index":4,"content_index":0,"delta":" + nutrition","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":240,"output_index":4,"content_index":0,"delta":" + facts","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":241,"output_index":4,"content_index":0,"delta":":","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":242,"output_index":4,"content_index":0,"delta":" + Tom","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":243,"output_index":4,"content_index":0,"delta":"atoes","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":244,"output_index":4,"content_index":0,"delta":" + are","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":245,"output_index":4,"content_index":0,"delta":" + low","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":246,"output_index":4,"content_index":0,"delta":" + in","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":247,"output_index":4,"content_index":0,"delta":" + calories","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":248,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":249,"output_index":4,"content_index":0,"delta":"about","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":250,"output_index":4,"content_index":0,"delta":" + ","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":251,"output_index":4,"content_index":0,"delta":"2","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":252,"output_index":4,"content_index":0,"delta":"3","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":253,"output_index":4,"content_index":0,"delta":" + per","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":254,"output_index":4,"content_index":0,"delta":" + tomato","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":255,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":256,"output_index":4,"content_index":0,"delta":" + rich","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":257,"output_index":4,"content_index":0,"delta":" + in","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":258,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":259,"output_index":4,"content_index":0,"delta":" + C","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":260,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":261,"output_index":4,"content_index":0,"delta":"1","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":262,"output_index":4,"content_index":0,"delta":"9","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":263,"output_index":4,"content_index":0,"delta":"%","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":264,"output_index":4,"content_index":0,"delta":" + DV","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":265,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":266,"output_index":4,"content_index":0,"delta":" + potassium","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":267,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":268,"output_index":4,"content_index":0,"delta":"com","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":269,"output_index":4,"content_index":0,"delta":"parable","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":270,"output_index":4,"content_index":0,"delta":" + to","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":271,"output_index":4,"content_index":0,"delta":" + bananas","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":272,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":273,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":274,"output_index":4,"content_index":0,"delta":" + are","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":275,"output_index":4,"content_index":0,"delta":" + the","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":276,"output_index":4,"content_index":0,"delta":" + major","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":277,"output_index":4,"content_index":0,"delta":" + dietary","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":278,"output_index":4,"content_index":0,"delta":" + source","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":279,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":280,"output_index":4,"content_index":0,"delta":" + l","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":281,"output_index":4,"content_index":0,"delta":"ycop","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":282,"output_index":4,"content_index":0,"delta":"ene","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":283,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":284,"output_index":4,"content_index":0,"delta":" + an","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":285,"output_index":4,"content_index":0,"delta":" + antioxidant","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":286,"output_index":4,"content_index":0,"delta":" + linked","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":287,"output_index":4,"content_index":0,"delta":" + to","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":288,"output_index":4,"content_index":0,"delta":" + reduced","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":289,"output_index":4,"content_index":0,"delta":" + risk","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":290,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":291,"output_index":4,"content_index":0,"delta":" + heart","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":292,"output_index":4,"content_index":0,"delta":" + disease","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":293,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":294,"output_index":4,"content_index":0,"delta":" + certain","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":295,"output_index":4,"content_index":0,"delta":" + cancers","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":296,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":297,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":298,"output_index":4,"content_index":0,"delta":"3","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":299,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":300,"output_index":4,"content_index":0,"delta":" + C","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":301,"output_index":4,"content_index":0,"delta":"ucumber","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":302,"output_index":4,"content_index":0,"delta":" + nutrition","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":303,"output_index":4,"content_index":0,"delta":" + facts","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":304,"output_index":4,"content_index":0,"delta":":","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":305,"output_index":4,"content_index":0,"delta":" + Cuc","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":306,"output_index":4,"content_index":0,"delta":"um","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":307,"output_index":4,"content_index":0,"delta":"bers","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":308,"output_index":4,"content_index":0,"delta":" + are","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":309,"output_index":4,"content_index":0,"delta":" + ","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":310,"output_index":4,"content_index":0,"delta":"9","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":311,"output_index":4,"content_index":0,"delta":"5","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":312,"output_index":4,"content_index":0,"delta":"-","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":313,"output_index":4,"content_index":0,"delta":"9","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":314,"output_index":4,"content_index":0,"delta":"6","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":315,"output_index":4,"content_index":0,"delta":"%","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":316,"output_index":4,"content_index":0,"delta":" + water","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":317,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":318,"output_index":4,"content_index":0,"delta":" + very","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":319,"output_index":4,"content_index":0,"delta":" + low","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":320,"output_index":4,"content_index":0,"delta":" + in","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":321,"output_index":4,"content_index":0,"delta":" + calories","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":322,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":323,"output_index":4,"content_index":0,"delta":"about","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":324,"output_index":4,"content_index":0,"delta":" + ","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":325,"output_index":4,"content_index":0,"delta":"8","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":326,"output_index":4,"content_index":0,"delta":" + calories","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":327,"output_index":4,"content_index":0,"delta":" + per","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":328,"output_index":4,"content_index":0,"delta":" + half","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":329,"output_index":4,"content_index":0,"delta":" + cup","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":330,"output_index":4,"content_index":0,"delta":" + sliced","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":331,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":332,"output_index":4,"content_index":0,"delta":" + providing","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":333,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":334,"output_index":4,"content_index":0,"delta":" + K","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":335,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":336,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":337,"output_index":4,"content_index":0,"delta":" + C","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":338,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":339,"output_index":4,"content_index":0,"delta":" + potassium","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":340,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":341,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":342,"output_index":4,"content_index":0,"delta":" + trace","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":343,"output_index":4,"content_index":0,"delta":" + amounts","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":344,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":345,"output_index":4,"content_index":0,"delta":" + other","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":346,"output_index":4,"content_index":0,"delta":" + nutrients","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":347,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":348,"output_index":4,"content_index":0,"delta":" + making","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":349,"output_index":4,"content_index":0,"delta":" + them","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":350,"output_index":4,"content_index":0,"delta":" + excellent","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":351,"output_index":4,"content_index":0,"delta":" + for","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":352,"output_index":4,"content_index":0,"delta":" + hydration","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":353,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":354,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":355,"output_index":4,"content_index":0,"delta":"4","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":356,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":357,"output_index":4,"content_index":0,"delta":" + Car","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":358,"output_index":4,"content_index":0,"delta":"rot","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":359,"output_index":4,"content_index":0,"delta":" + nutrition","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":360,"output_index":4,"content_index":0,"delta":" + facts","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":361,"output_index":4,"content_index":0,"delta":":","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":362,"output_index":4,"content_index":0,"delta":" + Car","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":363,"output_index":4,"content_index":0,"delta":"rots","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":364,"output_index":4,"content_index":0,"delta":" + are","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":365,"output_index":4,"content_index":0,"delta":" + low","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":366,"output_index":4,"content_index":0,"delta":" + in","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":367,"output_index":4,"content_index":0,"delta":" + calories","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":368,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":369,"output_index":4,"content_index":0,"delta":"about","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":370,"output_index":4,"content_index":0,"delta":" + ","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":371,"output_index":4,"content_index":0,"delta":"2","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":372,"output_index":4,"content_index":0,"delta":"5","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":373,"output_index":4,"content_index":0,"delta":" + calories","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":374,"output_index":4,"content_index":0,"delta":" + per","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":375,"output_index":4,"content_index":0,"delta":" + medium","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":376,"output_index":4,"content_index":0,"delta":" + carrot","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":377,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":378,"output_index":4,"content_index":0,"delta":" + low","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":379,"output_index":4,"content_index":0,"delta":" + in","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":380,"output_index":4,"content_index":0,"delta":" + fat","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":381,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":382,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":383,"output_index":4,"content_index":0,"delta":" + are","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":384,"output_index":4,"content_index":0,"delta":" + an","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":385,"output_index":4,"content_index":0,"delta":" + excellent","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":386,"output_index":4,"content_index":0,"delta":" + source","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":387,"output_index":4,"content_index":0,"delta":" + of","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":388,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":389,"output_index":4,"content_index":0,"delta":" + A","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":390,"output_index":4,"content_index":0,"delta":" + (","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":391,"output_index":4,"content_index":0,"delta":"from","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":392,"output_index":4,"content_index":0,"delta":" + beta","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":393,"output_index":4,"content_index":0,"delta":"-car","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":394,"output_index":4,"content_index":0,"delta":"ot","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":395,"output_index":4,"content_index":0,"delta":"ene","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":396,"output_index":4,"content_index":0,"delta":"),","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":397,"output_index":4,"content_index":0,"delta":" + vitamin","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":398,"output_index":4,"content_index":0,"delta":" + K","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":399,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":400,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":401,"output_index":4,"content_index":0,"delta":" + potassium","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":402,"output_index":4,"content_index":0,"delta":",","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":403,"output_index":4,"content_index":0,"delta":" + making","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":404,"output_index":4,"content_index":0,"delta":" + them","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":405,"output_index":4,"content_index":0,"delta":" + highly","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":406,"output_index":4,"content_index":0,"delta":" + nutritious","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":407,"output_index":4,"content_index":0,"delta":" + for","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":408,"output_index":4,"content_index":0,"delta":" + eye","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":409,"output_index":4,"content_index":0,"delta":" + and","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":410,"output_index":4,"content_index":0,"delta":" + heart","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":411,"output_index":4,"content_index":0,"delta":" + health","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":412,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":413,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":414,"output_index":4,"content_index":0,"delta":"Let","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":415,"output_index":4,"content_index":0,"delta":" + me","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":416,"output_index":4,"content_index":0,"delta":" + write","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":417,"output_index":4,"content_index":0,"delta":" + these","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":418,"output_index":4,"content_index":0,"delta":" + as","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":419,"output_index":4,"content_index":0,"delta":" + one","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":420,"output_index":4,"content_index":0,"delta":" + sentence","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":421,"output_index":4,"content_index":0,"delta":" + each","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":422,"output_index":4,"content_index":0,"delta":".","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":423,"output_index":4,"content_index":0,"delta":"\n","item_id":"897dbddc054dbb0b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":424,"output_index":4,"content_index":0,"item_id":"897dbddc054dbb0b","text":"Both + searches completed successfully. Let me summarize each of the four results in + one sentence each:\n\n1. Potato nutrition facts: A medium-sized potato with + skin contains approximately 110 calories, is fat-free, cholesterol-free, and + provides significant amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin + B6 (10%), fiber (7%), and carbohydrates (26g), making it a nutrient-dense food + that can be part of a healthy diet.\n\n2. Tomato nutrition facts: Tomatoes are + low in calories (about 23 per tomato), rich in vitamin C (19% DV), potassium + (comparable to bananas), and are the major dietary source of lycopene, an antioxidant + linked to reduced risk of heart disease and certain cancers.\n\n3. Cucumber + nutrition facts: Cucumbers are 95-96% water and very low in calories (about + 8 calories per half cup sliced), providing vitamin K, vitamin C, potassium, + and trace amounts of other nutrients, making them excellent for hydration.\n\n4. + Carrot nutrition facts: Carrots are low in calories (about 25 calories per medium + carrot), low in fat, and are an excellent source of vitamin A (from beta-carotene), + vitamin K, and potassium, making them highly nutritious for eye and heart health.\n\nLet + me write these as one sentence each.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":425,"output_index":4,"content_index":0,"item_id":"897dbddc054dbb0b","part":{"text":"Both + searches completed successfully. Let me summarize each of the four results in + one sentence each:\n\n1. Potato nutrition facts: A medium-sized potato with + skin contains approximately 110 calories, is fat-free, cholesterol-free, and + provides significant amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin + B6 (10%), fiber (7%), and carbohydrates (26g), making it a nutrient-dense food + that can be part of a healthy diet.\n\n2. Tomato nutrition facts: Tomatoes are + low in calories (about 23 per tomato), rich in vitamin C (19% DV), potassium + (comparable to bananas), and are the major dietary source of lycopene, an antioxidant + linked to reduced risk of heart disease and certain cancers.\n\n3. Cucumber + nutrition facts: Cucumbers are 95-96% water and very low in calories (about + 8 calories per half cup sliced), providing vitamin K, vitamin C, potassium, + and trace amounts of other nutrients, making them excellent for hydration.\n\n4. + Carrot nutrition facts: Carrots are low in calories (about 25 calories per medium + carrot), low in fat, and are an excellent source of vitamin A (from beta-carotene), + vitamin K, and potassium, making them highly nutritious for eye and heart health.\n\nLet + me write these as one sentence each.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":426,"output_index":4,"item":{"content":[{"text":"Both + searches completed successfully. Let me summarize each of the four results in + one sentence each:\n\n1. Potato nutrition facts: A medium-sized potato with + skin contains approximately 110 calories, is fat-free, cholesterol-free, and + provides significant amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin + B6 (10%), fiber (7%), and carbohydrates (26g), making it a nutrient-dense food + that can be part of a healthy diet.\n\n2. Tomato nutrition facts: Tomatoes are + low in calories (about 23 per tomato), rich in vitamin C (19% DV), potassium + (comparable to bananas), and are the major dietary source of lycopene, an antioxidant + linked to reduced risk of heart disease and certain cancers.\n\n3. Cucumber + nutrition facts: Cucumbers are 95-96% water and very low in calories (about + 8 calories per half cup sliced), providing vitamin K, vitamin C, potassium, + and trace amounts of other nutrients, making them excellent for hydration.\n\n4. + Carrot nutrition facts: Carrots are low in calories (about 25 calories per medium + carrot), low in fat, and are an excellent source of vitamin A (from beta-carotene), + vitamin K, and potassium, making them highly nutritious for eye and heart health.\n\nLet + me write these as one sentence each.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"897dbddc054dbb0b","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":427,"output_index":5,"item":{"content":[],"id":"891f9ccda096f430","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":428,"output_index":5,"content_index":0,"item_id":"891f9ccda096f430","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":429,"output_index":5,"content_index":0,"delta":"\n\nBased","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":430,"output_index":5,"content_index":0,"delta":" + on","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":431,"output_index":5,"content_index":0,"delta":" + the","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":432,"output_index":5,"content_index":0,"delta":" + parallel","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":433,"output_index":5,"content_index":0,"delta":" + search","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":434,"output_index":5,"content_index":0,"delta":" + results","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":435,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":436,"output_index":5,"content_index":0,"delta":" + here","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":437,"output_index":5,"content_index":0,"delta":"''s","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":438,"output_index":5,"content_index":0,"delta":" + a","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":439,"output_index":5,"content_index":0,"delta":" + one","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":440,"output_index":5,"content_index":0,"delta":"-s","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":441,"output_index":5,"content_index":0,"delta":"entence","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":442,"output_index":5,"content_index":0,"delta":" + summary","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":443,"output_index":5,"content_index":0,"delta":" + for","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":444,"output_index":5,"content_index":0,"delta":" + each","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":445,"output_index":5,"content_index":0,"delta":":","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":446,"output_index":5,"content_index":0,"delta":"\n\n","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":447,"output_index":5,"content_index":0,"delta":"1","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":448,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":449,"output_index":5,"content_index":0,"delta":" + **","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":450,"output_index":5,"content_index":0,"delta":"Pot","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":451,"output_index":5,"content_index":0,"delta":"ato","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":452,"output_index":5,"content_index":0,"delta":" + nutrition","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":453,"output_index":5,"content_index":0,"delta":" + facts","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":454,"output_index":5,"content_index":0,"delta":"**:","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":455,"output_index":5,"content_index":0,"delta":" + A","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":456,"output_index":5,"content_index":0,"delta":" + medium","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":457,"output_index":5,"content_index":0,"delta":"-sized","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":458,"output_index":5,"content_index":0,"delta":" + potato","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":459,"output_index":5,"content_index":0,"delta":" + with","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":460,"output_index":5,"content_index":0,"delta":" + skin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":461,"output_index":5,"content_index":0,"delta":" + contains","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":462,"output_index":5,"content_index":0,"delta":" + approximately","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":463,"output_index":5,"content_index":0,"delta":" + ","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":464,"output_index":5,"content_index":0,"delta":"1","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":465,"output_index":5,"content_index":0,"delta":"1","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":466,"output_index":5,"content_index":0,"delta":"0","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":467,"output_index":5,"content_index":0,"delta":" + calories","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":468,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":469,"output_index":5,"content_index":0,"delta":" + is","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":470,"output_index":5,"content_index":0,"delta":" + naturally","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":471,"output_index":5,"content_index":0,"delta":" + fat","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":472,"output_index":5,"content_index":0,"delta":"-free","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":473,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":474,"output_index":5,"content_index":0,"delta":" + cholesterol","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":475,"output_index":5,"content_index":0,"delta":"-free","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":476,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":477,"output_index":5,"content_index":0,"delta":" + while","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":478,"output_index":5,"content_index":0,"delta":" + providing","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":479,"output_index":5,"content_index":0,"delta":" + significant","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":480,"output_index":5,"content_index":0,"delta":" + amounts","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":481,"output_index":5,"content_index":0,"delta":" + of","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":482,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":483,"output_index":5,"content_index":0,"delta":" + C","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":484,"output_index":5,"content_index":0,"delta":" + (","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":485,"output_index":5,"content_index":0,"delta":"3","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":486,"output_index":5,"content_index":0,"delta":"0","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":487,"output_index":5,"content_index":0,"delta":"%","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":488,"output_index":5,"content_index":0,"delta":" + DV","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":489,"output_index":5,"content_index":0,"delta":"),","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":490,"output_index":5,"content_index":0,"delta":" + potassium","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":491,"output_index":5,"content_index":0,"delta":" + (","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":492,"output_index":5,"content_index":0,"delta":"1","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":493,"output_index":5,"content_index":0,"delta":"5","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":494,"output_index":5,"content_index":0,"delta":"-","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":495,"output_index":5,"content_index":0,"delta":"2","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":496,"output_index":5,"content_index":0,"delta":"0","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":497,"output_index":5,"content_index":0,"delta":"%","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":498,"output_index":5,"content_index":0,"delta":" + DV","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":499,"output_index":5,"content_index":0,"delta":"),","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":500,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":501,"output_index":5,"content_index":0,"delta":" + B","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":502,"output_index":5,"content_index":0,"delta":"6","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":503,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":504,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":505,"output_index":5,"content_index":0,"delta":" + fiber","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":506,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":507,"output_index":5,"content_index":0,"delta":"\n\n","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":508,"output_index":5,"content_index":0,"delta":"2","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":509,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":510,"output_index":5,"content_index":0,"delta":" + **","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":511,"output_index":5,"content_index":0,"delta":"Tom","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":512,"output_index":5,"content_index":0,"delta":"ato","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":513,"output_index":5,"content_index":0,"delta":" + nutrition","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":514,"output_index":5,"content_index":0,"delta":" + facts","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":515,"output_index":5,"content_index":0,"delta":"**:","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":516,"output_index":5,"content_index":0,"delta":" + Tom","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":517,"output_index":5,"content_index":0,"delta":"atoes","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":518,"output_index":5,"content_index":0,"delta":" + are","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":519,"output_index":5,"content_index":0,"delta":" + low","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":520,"output_index":5,"content_index":0,"delta":" + in","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":521,"output_index":5,"content_index":0,"delta":" + calories","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":522,"output_index":5,"content_index":0,"delta":" + (","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":523,"output_index":5,"content_index":0,"delta":"about","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":524,"output_index":5,"content_index":0,"delta":" + ","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":525,"output_index":5,"content_index":0,"delta":"2","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":526,"output_index":5,"content_index":0,"delta":"3","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":527,"output_index":5,"content_index":0,"delta":" + per","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":528,"output_index":5,"content_index":0,"delta":" + tomato","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":529,"output_index":5,"content_index":0,"delta":"),","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":530,"output_index":5,"content_index":0,"delta":" + rich","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":531,"output_index":5,"content_index":0,"delta":" + in","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":532,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":533,"output_index":5,"content_index":0,"delta":" + C","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":534,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":535,"output_index":5,"content_index":0,"delta":" + potassium","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":536,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":537,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":538,"output_index":5,"content_index":0,"delta":" + are","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":539,"output_index":5,"content_index":0,"delta":" + the","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":540,"output_index":5,"content_index":0,"delta":" + major","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":541,"output_index":5,"content_index":0,"delta":" + dietary","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":542,"output_index":5,"content_index":0,"delta":" + source","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":543,"output_index":5,"content_index":0,"delta":" + of","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":544,"output_index":5,"content_index":0,"delta":" + l","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":545,"output_index":5,"content_index":0,"delta":"ycop","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":546,"output_index":5,"content_index":0,"delta":"ene","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":547,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":548,"output_index":5,"content_index":0,"delta":" + an","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":549,"output_index":5,"content_index":0,"delta":" + antioxidant","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":550,"output_index":5,"content_index":0,"delta":" + linked","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":551,"output_index":5,"content_index":0,"delta":" + to","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":552,"output_index":5,"content_index":0,"delta":" + reduced","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":553,"output_index":5,"content_index":0,"delta":" + risk","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":554,"output_index":5,"content_index":0,"delta":" + of","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":555,"output_index":5,"content_index":0,"delta":" + heart","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":556,"output_index":5,"content_index":0,"delta":" + disease","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":557,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":558,"output_index":5,"content_index":0,"delta":" + certain","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":559,"output_index":5,"content_index":0,"delta":" + cancers","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":560,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":561,"output_index":5,"content_index":0,"delta":"\n\n","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":562,"output_index":5,"content_index":0,"delta":"3","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":563,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":564,"output_index":5,"content_index":0,"delta":" + **","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":565,"output_index":5,"content_index":0,"delta":"C","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":566,"output_index":5,"content_index":0,"delta":"ucumber","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":567,"output_index":5,"content_index":0,"delta":" + nutrition","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":568,"output_index":5,"content_index":0,"delta":" + facts","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":569,"output_index":5,"content_index":0,"delta":"**:","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":570,"output_index":5,"content_index":0,"delta":" + Cuc","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":571,"output_index":5,"content_index":0,"delta":"um","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":572,"output_index":5,"content_index":0,"delta":"bers","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":573,"output_index":5,"content_index":0,"delta":" + are","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":574,"output_index":5,"content_index":0,"delta":" + ","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":575,"output_index":5,"content_index":0,"delta":"9","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":576,"output_index":5,"content_index":0,"delta":"5","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":577,"output_index":5,"content_index":0,"delta":"-","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":578,"output_index":5,"content_index":0,"delta":"9","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":579,"output_index":5,"content_index":0,"delta":"6","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":580,"output_index":5,"content_index":0,"delta":"%","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":581,"output_index":5,"content_index":0,"delta":" + water","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":582,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":583,"output_index":5,"content_index":0,"delta":" + extremely","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":584,"output_index":5,"content_index":0,"delta":" + low","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":585,"output_index":5,"content_index":0,"delta":" + in","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":586,"output_index":5,"content_index":0,"delta":" + calories","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":587,"output_index":5,"content_index":0,"delta":" + (","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":588,"output_index":5,"content_index":0,"delta":"about","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":589,"output_index":5,"content_index":0,"delta":" + ","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":590,"output_index":5,"content_index":0,"delta":"8","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":591,"output_index":5,"content_index":0,"delta":" + calories","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":592,"output_index":5,"content_index":0,"delta":" + per","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":593,"output_index":5,"content_index":0,"delta":" + half","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":594,"output_index":5,"content_index":0,"delta":" + cup","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":595,"output_index":5,"content_index":0,"delta":" + sliced","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":596,"output_index":5,"content_index":0,"delta":"),","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":597,"output_index":5,"content_index":0,"delta":" + while","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":598,"output_index":5,"content_index":0,"delta":" + providing","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":599,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":600,"output_index":5,"content_index":0,"delta":" + K","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":601,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":602,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":603,"output_index":5,"content_index":0,"delta":" + C","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":604,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":605,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":606,"output_index":5,"content_index":0,"delta":" + potassium","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":607,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":608,"output_index":5,"content_index":0,"delta":" + making","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":609,"output_index":5,"content_index":0,"delta":" + them","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":610,"output_index":5,"content_index":0,"delta":" + excellent","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":611,"output_index":5,"content_index":0,"delta":" + for","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":612,"output_index":5,"content_index":0,"delta":" + hydration","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":613,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":614,"output_index":5,"content_index":0,"delta":"\n\n","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":615,"output_index":5,"content_index":0,"delta":"4","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":616,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":617,"output_index":5,"content_index":0,"delta":" + **","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":618,"output_index":5,"content_index":0,"delta":"Car","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":619,"output_index":5,"content_index":0,"delta":"rot","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":620,"output_index":5,"content_index":0,"delta":" + nutrition","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":621,"output_index":5,"content_index":0,"delta":" + facts","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":622,"output_index":5,"content_index":0,"delta":"**:","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":623,"output_index":5,"content_index":0,"delta":" + Car","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":624,"output_index":5,"content_index":0,"delta":"rots","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":625,"output_index":5,"content_index":0,"delta":" + are","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":626,"output_index":5,"content_index":0,"delta":" + low","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":627,"output_index":5,"content_index":0,"delta":" + in","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":628,"output_index":5,"content_index":0,"delta":" + calories","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":629,"output_index":5,"content_index":0,"delta":" + (","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":630,"output_index":5,"content_index":0,"delta":"about","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":631,"output_index":5,"content_index":0,"delta":" + ","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":632,"output_index":5,"content_index":0,"delta":"2","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":633,"output_index":5,"content_index":0,"delta":"5","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":634,"output_index":5,"content_index":0,"delta":" + per","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":635,"output_index":5,"content_index":0,"delta":" + medium","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":636,"output_index":5,"content_index":0,"delta":" + carrot","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":637,"output_index":5,"content_index":0,"delta":")","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":638,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":639,"output_index":5,"content_index":0,"delta":" + are","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":640,"output_index":5,"content_index":0,"delta":" + an","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":641,"output_index":5,"content_index":0,"delta":" + excellent","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":642,"output_index":5,"content_index":0,"delta":" + source","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":643,"output_index":5,"content_index":0,"delta":" + of","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":644,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":645,"output_index":5,"content_index":0,"delta":" + A","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":646,"output_index":5,"content_index":0,"delta":" + (","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":647,"output_index":5,"content_index":0,"delta":"from","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":648,"output_index":5,"content_index":0,"delta":" + beta","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":649,"output_index":5,"content_index":0,"delta":"-car","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":650,"output_index":5,"content_index":0,"delta":"ot","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":651,"output_index":5,"content_index":0,"delta":"ene","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":652,"output_index":5,"content_index":0,"delta":"),","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":653,"output_index":5,"content_index":0,"delta":" + vitamin","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":654,"output_index":5,"content_index":0,"delta":" + K","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":655,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":656,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":657,"output_index":5,"content_index":0,"delta":" + potassium","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":658,"output_index":5,"content_index":0,"delta":",","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":659,"output_index":5,"content_index":0,"delta":" + supporting","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":660,"output_index":5,"content_index":0,"delta":" + eye","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":661,"output_index":5,"content_index":0,"delta":" + and","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":662,"output_index":5,"content_index":0,"delta":" + heart","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":663,"output_index":5,"content_index":0,"delta":" + health","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":664,"output_index":5,"content_index":0,"delta":".","item_id":"891f9ccda096f430","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":665,"output_index":5,"content_index":0,"item_id":"891f9ccda096f430","logprobs":[],"text":"\n\nBased + on the parallel search results, here''s a one-sentence summary for each:\n\n1. + **Potato nutrition facts**: A medium-sized potato with skin contains approximately + 110 calories, is naturally fat-free and cholesterol-free, while providing significant + amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin B6, and fiber.\n\n2. + **Tomato nutrition facts**: Tomatoes are low in calories (about 23 per tomato), + rich in vitamin C and potassium, and are the major dietary source of lycopene, + an antioxidant linked to reduced risk of heart disease and certain cancers.\n\n3. + **Cucumber nutrition facts**: Cucumbers are 95-96% water and extremely low in + calories (about 8 calories per half cup sliced), while providing vitamin K, + vitamin C, and potassium, making them excellent for hydration.\n\n4. **Carrot + nutrition facts**: Carrots are low in calories (about 25 per medium carrot) + and are an excellent source of vitamin A (from beta-carotene), vitamin K, and + potassium, supporting eye and heart health."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":666,"output_index":5,"content_index":0,"item_id":"891f9ccda096f430","part":{"annotations":[],"logprobs":null,"text":"\n\nBased + on the parallel search results, here''s a one-sentence summary for each:\n\n1. + **Potato nutrition facts**: A medium-sized potato with skin contains approximately + 110 calories, is naturally fat-free and cholesterol-free, while providing significant + amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin B6, and fiber.\n\n2. + **Tomato nutrition facts**: Tomatoes are low in calories (about 23 per tomato), + rich in vitamin C and potassium, and are the major dietary source of lycopene, + an antioxidant linked to reduced risk of heart disease and certain cancers.\n\n3. + **Cucumber nutrition facts**: Cucumbers are 95-96% water and extremely low in + calories (about 8 calories per half cup sliced), while providing vitamin K, + vitamin C, and potassium, making them excellent for hydration.\n\n4. **Carrot + nutrition facts**: Carrots are low in calories (about 25 per medium carrot) + and are an excellent source of vitamin A (from beta-carotene), vitamin K, and + potassium, supporting eye and heart health.","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":667,"output_index":5,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\nBased + on the parallel search results, here''s a one-sentence summary for each:\n\n1. + **Potato nutrition facts**: A medium-sized potato with skin contains approximately + 110 calories, is naturally fat-free and cholesterol-free, while providing significant + amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin B6, and fiber.\n\n2. + **Tomato nutrition facts**: Tomatoes are low in calories (about 23 per tomato), + rich in vitamin C and potassium, and are the major dietary source of lycopene, + an antioxidant linked to reduced risk of heart disease and certain cancers.\n\n3. + **Cucumber nutrition facts**: Cucumbers are 95-96% water and extremely low in + calories (about 8 calories per half cup sliced), while providing vitamin K, + vitamin C, and potassium, making them excellent for hydration.\n\n4. **Carrot + nutrition facts**: Carrots are low in calories (about 25 per medium carrot) + and are an excellent source of vitamin A (from beta-carotene), vitamin K, and + potassium, supporting eye and heart health.","type":"output_text"}],"id":"891f9ccda096f430","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":668,"response":{"conversation_id":null,"created_at":1787834137,"error":null,"id":"resp_01a04337-da11-7f50-a4de-b95f2e147f88","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"id":"mcpl_01a04337-df7f-7f22-ba2b-d2a58019e843","server_label":"gitmcp_tiktoken","tools":[{"annotations":{"read_only":false},"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","input_schema":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"name":"search_tiktoken_documentation"}],"type":"mcp_list_tools"},{"content":[{"text":"The + user wants me to make two web_search calls in parallel. Each call should have + two queries batched together. I need to issue both calls now and then summarize + each of the four results in one sentence.\n\nLet me make both calls simultaneously + using the queries parameter which allows multiple queries to be run in parallel.\n\nFirst + call: \"potato nutrition facts\" and \"tomato nutrition facts\"\nSecond call: + \"cucumber nutrition facts\" and \"carrot nutrition facts\"\n\nI''ll structure + this properly with the queries parameter as an array for each call.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8686e1d942b3cb83","status":null,"summary":[],"type":"reasoning"},{"action":{"queries":["potato + nutrition facts","tomato nutrition facts"],"query":"potato nutrition facts","sources":[{"title":"Potato + Nutrition Facts | Nutrients, Calories, Benefits of a Potato","url":"https://potatogoodness.com/nutrition/"},{"title":"Potato","url":"https://www.fda.gov/media/76882/download"},{"title":"Potatoes + 101: Nutrition Facts, Health Benefits, and Types","url":"https://www.healthline.com/nutrition/foods/potatoes"},{"title":"Potato + Facts","url":"https://www.idahopotatomuseum.com/potato-facts/"},{"title":"Potato + Nutrition & Facts","url":"https://alsum.com/products/potato-nutrition-facts/"},{"title":"Nutritional + Value - National Potato Council","url":"https://www.nationalpotatocouncil.org/benefits-of-potatoes/nutritional-value/"},{"title":"Nutrition + - Side Delights","url":"https://www.sidedelights.com/potatoes/nutrition/"},{"title":"Are + Potatoes Healthy? • The Nutrition Source","url":"https://nutritionsource.hsph.harvard.edu/potatoes/"},{"title":"Food + Search | USDA FoodData Central","url":"https://fdc.nal.usda.gov/food-search/?query=potato"},{"title":"Nutrition + Facts – The Alliance for Potato Research & Education","url":"https://apre.org/potatoes-and-public-health/nutrition-facts/"},{"title":"Tomatoes: + Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/tomatoes"},{"title":"Tomatoes + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/tomatoes"},{"title":"Tomato + Nutrition Facts and Health Benefits","url":"https://www.verywellhealth.com/tomato-nutrition-12012681"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11529-1"},{"title":"Tomatoes: + A Nutritional Powerhouse and Culinary Favorite - UF/IFAS ...","url":"https://blogs.ifas.ufl.edu/brevardco/2025/04/07/tomatoes-a-nutritional-powerhouse-and-culinary-favorite/"},{"title":"Tomatoes: + Health Benefits, Nutrients per Serving, Preparation ...","url":"https://www.webmd.com/diet/health-benefits-tomatoes"},{"title":"Nutritional + Composition and Bioactive Compounds in ... - PMC","url":"https://pmc.ncbi.nlm.nih.gov/articles/PMC7823427/"},{"title":"Tomatoes + 101: Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/foods/tomatoes"},{"title":"Tomato + nutrition — British Tomato Growers Association","url":"https://www.britishtomatoes.co.uk/tomato-nutrition"},{"title":"1 + Oz Of Tomatoes Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/tomatoes-2498?a=0.11812500000000001%3A5"}],"type":"search"},"id":"ws_b0a1388bc3fc8164","status":"completed","type":"web_search_call"},{"action":{"queries":["cucumber + nutrition facts","carrot nutrition facts"],"query":"cucumber nutrition facts","sources":[{"title":"Cucumber + Nutrition Facts and Benefits - Franklin County Center ...","url":"https://franklin.ces.ncsu.edu/news/cucumber-nutrition-facts-and-benefits/"},{"title":"Health + Benefits of Cucumber","url":"https://www.webmd.com/food-recipes/cucumber-health-benefits"},{"title":"Cucumbers + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/cucumbers"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11206-1"},{"title":"Cucumber + Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/cucumber-1972"},{"title":"Nutrition + Facts for Cucumber","url":"https://tools.myfooddata.com/nutrition-facts/168409/wt9"},{"title":"Health + Benefits of Cucumber","url":"https://www.healthline.com/nutrition/health-benefits-of-cucumber"},{"title":"Cucumbers + are trendy, but how healthy are they? | American Heart ...","url":"https://www.heart.org/en/news/2025/01/17/cucumbers-are-trendy-but-how-healthy-are-they"},{"title":"Cucumber + Nutrition Facts and Health Benefits","url":"https://www.verywellfit.com/cucumber-nutrition-facts-calories-and-health-benefits-4118563"},{"title":"Cucumber + Nutritional Information","url":"https://ingenaes.illinois.edu/wp-content/uploads/ING-Info-Sheet-2018_05-Cucumber-nutritional-value-Kowalewska.pdf"},{"title":"Nutrition + Facts - URMC.Rochester.edu","url":"https://www.urmc.rochester.edu/encyclopedia/content?contenttypeid=76&contentid=11124-3"},{"title":"Carrots + 101: Nutrition Facts and Health Benefits","url":"https://www.healthline.com/nutrition/foods/carrots"},{"title":"Carrots + | SNAP-Ed","url":"https://snaped.fns.usda.gov/resources/nutrition-education-materials/seasonal-produce-guide/carrots"},{"title":"Carrots: + Health Benefits, Nutrition Facts, and Risks","url":"https://www.webmd.com/food-recipes/benefits-carrots"},{"title":"Carrots + - Nutritional information | Wilcox","url":"https://www.wilcoxgoodness.co.nz/helpful-info/nutritional-information/carrots"},{"title":"Carrots, + raw, 1 large (7-1/4\" to 8-1/2\" long) | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/carrots-raw-1-large-7-14-to-8-12-long"},{"title":"Baby + Carrots Nutrition Facts and Health Benefits","url":"https://www.verywellfit.com/baby-carrot-nutrition-facts-and-health-benefits-5071650"},{"title":"Carrot + Nutrition Facts 0g Fat 25 calories 0.5g Protein 1.5g Fiber ...","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf"},{"title":"Baby + Carrots Nutrition Facts - Eat This Much","url":"https://www.eatthismuch.com/calories/baby-carrots-2569"},{"title":"Nutrition + Facts for Raw Carrots","url":"https://tools.myfooddata.com/nutrition-facts/170393/wt4"}],"type":"search"},"id":"ws_a77170dd568c8dec","status":"completed","type":"web_search_call"},{"content":[{"text":"Both + searches completed successfully. Let me summarize each of the four results in + one sentence each:\n\n1. Potato nutrition facts: A medium-sized potato with + skin contains approximately 110 calories, is fat-free, cholesterol-free, and + provides significant amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin + B6 (10%), fiber (7%), and carbohydrates (26g), making it a nutrient-dense food + that can be part of a healthy diet.\n\n2. Tomato nutrition facts: Tomatoes are + low in calories (about 23 per tomato), rich in vitamin C (19% DV), potassium + (comparable to bananas), and are the major dietary source of lycopene, an antioxidant + linked to reduced risk of heart disease and certain cancers.\n\n3. Cucumber + nutrition facts: Cucumbers are 95-96% water and very low in calories (about + 8 calories per half cup sliced), providing vitamin K, vitamin C, potassium, + and trace amounts of other nutrients, making them excellent for hydration.\n\n4. + Carrot nutrition facts: Carrots are low in calories (about 25 calories per medium + carrot), low in fat, and are an excellent source of vitamin A (from beta-carotene), + vitamin K, and potassium, making them highly nutritious for eye and heart health.\n\nLet + me write these as one sentence each.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"897dbddc054dbb0b","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\nBased + on the parallel search results, here''s a one-sentence summary for each:\n\n1. + **Potato nutrition facts**: A medium-sized potato with skin contains approximately + 110 calories, is naturally fat-free and cholesterol-free, while providing significant + amounts of vitamin C (30% DV), potassium (15-20% DV), vitamin B6, and fiber.\n\n2. + **Tomato nutrition facts**: Tomatoes are low in calories (about 23 per tomato), + rich in vitamin C and potassium, and are the major dietary source of lycopene, + an antioxidant linked to reduced risk of heart disease and certain cancers.\n\n3. + **Cucumber nutrition facts**: Cucumbers are 95-96% water and extremely low in + calories (about 8 calories per half cup sliced), while providing vitamin K, + vitamin C, and potassium, making them excellent for hydration.\n\n4. **Carrot + nutrition facts**: Carrots are low in calories (about 25 per medium carrot) + and are an excellent source of vitamin A (from beta-carotene), vitamin K, and + potassium, supporting eye and heart health.","type":"output_text"}],"id":"891f9ccda096f430","role":"assistant","status":"completed","type":"message"}],"previous_response_id":null,"status":"completed","usage":{"input_tokens":14568,"input_tokens_details":{"cached_tokens":0},"output_tokens":724,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":15292}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: 'Call gitmcp_tiktoken__search_tiktoken_documentation in parallel for + two separate exact queries -- do not wait for one to finish before starting + the other: (1) {"query":"encoding"} and (2) {"query":"tokenizer"}. Issue both + calls now in this single turn, then summarize each result in one sentence.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a04337-da11-7f50-a4de-b95f2e147f88 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787834139,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a04337-fb76-7292-beb4-05bf972b30f1","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a04337-da11-7f50-a4de-b95f2e147f88","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","name":"mcp__gitmcp_tiktoken__search_tiktoken_documentation","output_schema":null,"parameters":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"strict":false,"type":"function"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787834139,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a04337-fb76-7292-beb4-05bf972b30f1","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a04337-da11-7f50-a4de-b95f2e147f88","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","name":"mcp__gitmcp_tiktoken__search_tiktoken_documentation","output_schema":null,"parameters":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"strict":false,"type":"function"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"bb288274d8dea360","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"bb288274d8dea360","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + make","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + two","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + calls","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + to","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + the","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + git","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":"m","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":"cp","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":"_t","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":"ik","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":"token","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":"__","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":"search","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":"_t","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":"ik","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":"token","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":"_document","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":"ation","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + function","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + with","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + different","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":" + queries","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":".","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + I","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + need","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + to","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + issue","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + both","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + calls","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + now","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + without","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + waiting","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":" + for","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + one","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + to","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":" + finish","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":" + before","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":" + starting","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":" + the","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + other","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":".","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + Then","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + I","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":" + need","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + to","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":" + summarize","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":" + each","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + result","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":" + in","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + one","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":" + sentence","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":".","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":"Let","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + me","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + make","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + the","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":" + two","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":" + calls","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":".","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":"\n","item_id":"bb288274d8dea360"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":72,"output_index":0,"content_index":0,"item_id":"bb288274d8dea360","text":"The + user wants me to make two parallel calls to the gitmcp_tiktoken__search_tiktoken_documentation + function with different queries. I need to issue both calls now without waiting + for one to finish before starting the other. Then I need to summarize each result + in one sentence.\n\nLet me make the two parallel calls.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":73,"output_index":0,"content_index":0,"item_id":"bb288274d8dea360","part":{"text":"The + user wants me to make two parallel calls to the gitmcp_tiktoken__search_tiktoken_documentation + function with different queries. I need to issue both calls now without waiting + for one to finish before starting the other. Then I need to summarize each result + in one sentence.\n\nLet me make the two parallel calls.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":74,"output_index":0,"item":{"content":[{"text":"The + user wants me to make two parallel calls to the gitmcp_tiktoken__search_tiktoken_documentation + function with different queries. I need to issue both calls now without waiting + for one to finish before starting the other. Then I need to summarize each result + in one sentence.\n\nLet me make the two parallel calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"bb288274d8dea360","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":75,"item":{"approval_request_id":null,"arguments":"","error":null,"id":"mcp_9f533ad40b7a11f8","name":"search_tiktoken_documentation","output":null,"server_label":"gitmcp_tiktoken","status":"in_progress","type":"mcp_call"},"output_index":1} + + ' + - ' + + ' + - 'event: response.mcp_call.in_progress + + ' + - 'data: {"type":"response.mcp_call.in_progress","sequence_number":76,"item_id":"mcp_9f533ad40b7a11f8","output_index":1} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.delta + + ' + - 'data: {"type":"response.mcp_call_arguments.delta","sequence_number":77,"delta":"{\"query\": + \"encoding\"}","item_id":"mcp_9f533ad40b7a11f8","output_index":1} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.done + + ' + - 'data: {"type":"response.mcp_call_arguments.done","sequence_number":78,"arguments":"{\"query\": + \"encoding\"}","item_id":"mcp_9f533ad40b7a11f8","output_index":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":79,"item":{"approval_request_id":null,"arguments":"","error":null,"id":"mcp_a735ac038148c375","name":"search_tiktoken_documentation","output":null,"server_label":"gitmcp_tiktoken","status":"in_progress","type":"mcp_call"},"output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call.in_progress + + ' + - 'data: {"type":"response.mcp_call.in_progress","sequence_number":80,"item_id":"mcp_a735ac038148c375","output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.delta + + ' + - 'data: {"type":"response.mcp_call_arguments.delta","sequence_number":81,"delta":"{\"query\": + \"tokenizer\"}","item_id":"mcp_a735ac038148c375","output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.done + + ' + - 'data: {"type":"response.mcp_call_arguments.done","sequence_number":82,"arguments":"{\"query\": + \"tokenizer\"}","item_id":"mcp_a735ac038148c375","output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call.completed + + ' + - 'data: {"type":"response.mcp_call.completed","sequence_number":83,"item_id":"mcp_9f533ad40b7a11f8","output_index":1} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":84,"item":{"approval_request_id":null,"arguments":"{\"query\": + \"encoding\"}","error":null,"id":"mcp_9f533ad40b7a11f8","name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken","status":"completed","type":"mcp_call"},"output_index":1} + + ' + - ' + + ' + - 'event: response.mcp_call.completed + + ' + - 'data: {"type":"response.mcp_call.completed","sequence_number":85,"item_id":"mcp_a735ac038148c375","output_index":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":86,"item":{"approval_request_id":null,"arguments":"{\"query\": + \"tokenizer\"}","error":null,"id":"mcp_a735ac038148c375","name":"search_tiktoken_documentation","output":"### + Search Results for: \"tokenizer\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken","status":"completed","type":"mcp_call"},"output_index":2} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":87,"output_index":3,"item":{"content":null,"encrypted_content":null,"id":"a80df8f366ef9c32","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":88,"output_index":3,"content_index":0,"item_id":"a80df8f366ef9c32","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":89,"output_index":3,"content_index":0,"delta":"Both","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":90,"output_index":3,"content_index":0,"delta":" + searches","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":91,"output_index":3,"content_index":0,"delta":" + returned","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":3,"content_index":0,"delta":" + the","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":93,"output_index":3,"content_index":0,"delta":" + same","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":94,"output_index":3,"content_index":0,"delta":" + fallback","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":95,"output_index":3,"content_index":0,"delta":" + documentation","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":96,"output_index":3,"content_index":0,"delta":" + since","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":97,"output_index":3,"content_index":0,"delta":" + neither","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":98,"output_index":3,"content_index":0,"delta":" + query","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":99,"output_index":3,"content_index":0,"delta":" + matched","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":100,"output_index":3,"content_index":0,"delta":" + the","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":101,"output_index":3,"content_index":0,"delta":" + indexed","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":102,"output_index":3,"content_index":0,"delta":" + documentation","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":103,"output_index":3,"content_index":0,"delta":" + specifically","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":104,"output_index":3,"content_index":0,"delta":".","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":105,"output_index":3,"content_index":0,"delta":" + Both","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":106,"output_index":3,"content_index":0,"delta":" + results","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":107,"output_index":3,"content_index":0,"delta":" + show","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":108,"output_index":3,"content_index":0,"delta":" + the","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":109,"output_index":3,"content_index":0,"delta":" + general","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":110,"output_index":3,"content_index":0,"delta":" + tik","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":111,"output_index":3,"content_index":0,"delta":"token","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":112,"output_index":3,"content_index":0,"delta":" + documentation","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":113,"output_index":3,"content_index":0,"delta":".","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":114,"output_index":3,"content_index":0,"delta":" + Now","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":115,"output_index":3,"content_index":0,"delta":" + I","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":116,"output_index":3,"content_index":0,"delta":" + need","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":117,"output_index":3,"content_index":0,"delta":" + to","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":118,"output_index":3,"content_index":0,"delta":" + summarize","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":119,"output_index":3,"content_index":0,"delta":" + each","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":120,"output_index":3,"content_index":0,"delta":" + result","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":121,"output_index":3,"content_index":0,"delta":" + in","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":122,"output_index":3,"content_index":0,"delta":" + one","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":123,"output_index":3,"content_index":0,"delta":" + sentence","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":124,"output_index":3,"content_index":0,"delta":".","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":125,"output_index":3,"content_index":0,"delta":"\n\n","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":126,"output_index":3,"content_index":0,"delta":"Since","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":127,"output_index":3,"content_index":0,"delta":" + both","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":128,"output_index":3,"content_index":0,"delta":" + searches","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":129,"output_index":3,"content_index":0,"delta":" + returned","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":130,"output_index":3,"content_index":0,"delta":" + the","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":131,"output_index":3,"content_index":0,"delta":" + same","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":132,"output_index":3,"content_index":0,"delta":" + fallback","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":133,"output_index":3,"content_index":0,"delta":" + documentation","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":134,"output_index":3,"content_index":0,"delta":" + about","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":135,"output_index":3,"content_index":0,"delta":" + tik","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":136,"output_index":3,"content_index":0,"delta":"token","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":137,"output_index":3,"content_index":0,"delta":" + (","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":138,"output_index":3,"content_index":0,"delta":"which","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":139,"output_index":3,"content_index":0,"delta":" + is","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":140,"output_index":3,"content_index":0,"delta":" + a","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":141,"output_index":3,"content_index":0,"delta":" + fast","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":142,"output_index":3,"content_index":0,"delta":" + B","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":143,"output_index":3,"content_index":0,"delta":"PE","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":144,"output_index":3,"content_index":0,"delta":" + token","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":145,"output_index":3,"content_index":0,"delta":"iser","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":146,"output_index":3,"content_index":0,"delta":" + for","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":147,"output_index":3,"content_index":0,"delta":" + Open","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":148,"output_index":3,"content_index":0,"delta":"AI","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":149,"output_index":3,"content_index":0,"delta":"''s","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":150,"output_index":3,"content_index":0,"delta":" + models","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":151,"output_index":3,"content_index":0,"delta":"),","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":152,"output_index":3,"content_index":0,"delta":" + I","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":153,"output_index":3,"content_index":0,"delta":"''ll","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":154,"output_index":3,"content_index":0,"delta":" + summarize","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":155,"output_index":3,"content_index":0,"delta":" + them","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":156,"output_index":3,"content_index":0,"delta":" + accordingly","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":157,"output_index":3,"content_index":0,"delta":".","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":158,"output_index":3,"content_index":0,"delta":"\n","item_id":"a80df8f366ef9c32"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":159,"output_index":3,"content_index":0,"item_id":"a80df8f366ef9c32","text":"Both + searches returned the same fallback documentation since neither query matched + the indexed documentation specifically. Both results show the general tiktoken + documentation. Now I need to summarize each result in one sentence.\n\nSince + both searches returned the same fallback documentation about tiktoken (which + is a fast BPE tokeniser for OpenAI''s models), I''ll summarize them accordingly.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":160,"output_index":3,"content_index":0,"item_id":"a80df8f366ef9c32","part":{"text":"Both + searches returned the same fallback documentation since neither query matched + the indexed documentation specifically. Both results show the general tiktoken + documentation. Now I need to summarize each result in one sentence.\n\nSince + both searches returned the same fallback documentation about tiktoken (which + is a fast BPE tokeniser for OpenAI''s models), I''ll summarize them accordingly.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":161,"output_index":3,"item":{"content":[{"text":"Both + searches returned the same fallback documentation since neither query matched + the indexed documentation specifically. Both results show the general tiktoken + documentation. Now I need to summarize each result in one sentence.\n\nSince + both searches returned the same fallback documentation about tiktoken (which + is a fast BPE tokeniser for OpenAI''s models), I''ll summarize them accordingly.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"a80df8f366ef9c32","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":162,"output_index":4,"item":{"content":[],"id":"a48bfae9201147b8","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":163,"output_index":4,"content_index":0,"item_id":"a48bfae9201147b8","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":164,"output_index":4,"content_index":0,"delta":"\n\nBoth","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":165,"output_index":4,"content_index":0,"delta":" + searches","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":166,"output_index":4,"content_index":0,"delta":" + returned","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":167,"output_index":4,"content_index":0,"delta":" + the","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":168,"output_index":4,"content_index":0,"delta":" + same","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":169,"output_index":4,"content_index":0,"delta":" + fallback","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":170,"output_index":4,"content_index":0,"delta":" + documentation","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":171,"output_index":4,"content_index":0,"delta":" + from","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":172,"output_index":4,"content_index":0,"delta":" + the","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":173,"output_index":4,"content_index":0,"delta":" + tik","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":174,"output_index":4,"content_index":0,"delta":"token","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":175,"output_index":4,"content_index":0,"delta":" + repository","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":176,"output_index":4,"content_index":0,"delta":":","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":177,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":178,"output_index":4,"content_index":0,"delta":"1","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":179,"output_index":4,"content_index":0,"delta":".","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":180,"output_index":4,"content_index":0,"delta":" + **","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":181,"output_index":4,"content_index":0,"delta":"Encoding","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":182,"output_index":4,"content_index":0,"delta":" + query","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":183,"output_index":4,"content_index":0,"delta":" + summary","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":184,"output_index":4,"content_index":0,"delta":"**:","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":185,"output_index":4,"content_index":0,"delta":" + The","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":186,"output_index":4,"content_index":0,"delta":" + \"","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":187,"output_index":4,"content_index":0,"delta":"encoding","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":188,"output_index":4,"content_index":0,"delta":"\"","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":189,"output_index":4,"content_index":0,"delta":" + search","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":190,"output_index":4,"content_index":0,"delta":" + returned","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":191,"output_index":4,"content_index":0,"delta":" + no","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":192,"output_index":4,"content_index":0,"delta":" + specific","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":193,"output_index":4,"content_index":0,"delta":" + matches","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":194,"output_index":4,"content_index":0,"delta":" + and","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":195,"output_index":4,"content_index":0,"delta":" + fell","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":196,"output_index":4,"content_index":0,"delta":" + back","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":197,"output_index":4,"content_index":0,"delta":" + to","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":198,"output_index":4,"content_index":0,"delta":" + general","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":199,"output_index":4,"content_index":0,"delta":" + tik","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":200,"output_index":4,"content_index":0,"delta":"token","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":201,"output_index":4,"content_index":0,"delta":" + documentation","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":202,"output_index":4,"content_index":0,"delta":" + explaining","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":203,"output_index":4,"content_index":0,"delta":" + that","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":204,"output_index":4,"content_index":0,"delta":" + it","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":205,"output_index":4,"content_index":0,"delta":" + is","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":206,"output_index":4,"content_index":0,"delta":" + a","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":207,"output_index":4,"content_index":0,"delta":" + fast","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":208,"output_index":4,"content_index":0,"delta":" + Byte","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":209,"output_index":4,"content_index":0,"delta":" + Pair","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":210,"output_index":4,"content_index":0,"delta":" + Encoding","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":211,"output_index":4,"content_index":0,"delta":" + (","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":212,"output_index":4,"content_index":0,"delta":"B","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":213,"output_index":4,"content_index":0,"delta":"PE","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":214,"output_index":4,"content_index":0,"delta":")","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":215,"output_index":4,"content_index":0,"delta":" + token","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":216,"output_index":4,"content_index":0,"delta":"iser","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":217,"output_index":4,"content_index":0,"delta":" + for","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":218,"output_index":4,"content_index":0,"delta":" + Open","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":219,"output_index":4,"content_index":0,"delta":"AI","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":220,"output_index":4,"content_index":0,"delta":" + models","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":221,"output_index":4,"content_index":0,"delta":" + that","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":222,"output_index":4,"content_index":0,"delta":" + converts","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":223,"output_index":4,"content_index":0,"delta":" + text","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":224,"output_index":4,"content_index":0,"delta":" + to","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":225,"output_index":4,"content_index":0,"delta":" + tokens","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":226,"output_index":4,"content_index":0,"delta":" + and","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":227,"output_index":4,"content_index":0,"delta":" + back","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":228,"output_index":4,"content_index":0,"delta":" + loss","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":229,"output_index":4,"content_index":0,"delta":"lessly","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":230,"output_index":4,"content_index":0,"delta":".","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":231,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":232,"output_index":4,"content_index":0,"delta":"2","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":233,"output_index":4,"content_index":0,"delta":".","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":234,"output_index":4,"content_index":0,"delta":" + **","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":235,"output_index":4,"content_index":0,"delta":"Tokenizer","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":236,"output_index":4,"content_index":0,"delta":" + query","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":237,"output_index":4,"content_index":0,"delta":" + summary","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":238,"output_index":4,"content_index":0,"delta":"**:","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":239,"output_index":4,"content_index":0,"delta":" + The","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":240,"output_index":4,"content_index":0,"delta":" + \"","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":241,"output_index":4,"content_index":0,"delta":"tokenizer","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":242,"output_index":4,"content_index":0,"delta":"\"","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":243,"output_index":4,"content_index":0,"delta":" + search","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":244,"output_index":4,"content_index":0,"delta":" + also","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":245,"output_index":4,"content_index":0,"delta":" + returned","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":246,"output_index":4,"content_index":0,"delta":" + no","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":247,"output_index":4,"content_index":0,"delta":" + specific","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":248,"output_index":4,"content_index":0,"delta":" + matches","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":249,"output_index":4,"content_index":0,"delta":" + and","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":250,"output_index":4,"content_index":0,"delta":" + provided","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":251,"output_index":4,"content_index":0,"delta":" + the","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":252,"output_index":4,"content_index":0,"delta":" + same","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":253,"output_index":4,"content_index":0,"delta":" + fallback","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":254,"output_index":4,"content_index":0,"delta":" + documentation","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":255,"output_index":4,"content_index":0,"delta":" + describing","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":256,"output_index":4,"content_index":0,"delta":" + tik","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":257,"output_index":4,"content_index":0,"delta":"token","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":258,"output_index":4,"content_index":0,"delta":" + as","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":259,"output_index":4,"content_index":0,"delta":" + a","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":260,"output_index":4,"content_index":0,"delta":" + B","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":261,"output_index":4,"content_index":0,"delta":"PE","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":262,"output_index":4,"content_index":0,"delta":"-based","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":263,"output_index":4,"content_index":0,"delta":" + token","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":264,"output_index":4,"content_index":0,"delta":"iser","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":265,"output_index":4,"content_index":0,"delta":" + available","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":266,"output_index":4,"content_index":0,"delta":" + via","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":267,"output_index":4,"content_index":0,"delta":" + Py","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":268,"output_index":4,"content_index":0,"delta":"PI","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":269,"output_index":4,"content_index":0,"delta":" + that","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":270,"output_index":4,"content_index":0,"delta":" + is","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":271,"output_index":4,"content_index":0,"delta":" + ","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":272,"output_index":4,"content_index":0,"delta":"3","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":273,"output_index":4,"content_index":0,"delta":"-","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":274,"output_index":4,"content_index":0,"delta":"6","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":275,"output_index":4,"content_index":0,"delta":"x","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":276,"output_index":4,"content_index":0,"delta":" + faster","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":277,"output_index":4,"content_index":0,"delta":" + than","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":278,"output_index":4,"content_index":0,"delta":" + comparable","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":279,"output_index":4,"content_index":0,"delta":" + open","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":280,"output_index":4,"content_index":0,"delta":" + source","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":281,"output_index":4,"content_index":0,"delta":" + alternatives","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":282,"output_index":4,"content_index":0,"delta":".","item_id":"a48bfae9201147b8","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":283,"output_index":4,"content_index":0,"item_id":"a48bfae9201147b8","logprobs":[],"text":"\n\nBoth + searches returned the same fallback documentation from the tiktoken repository:\n\n1. + **Encoding query summary**: The \"encoding\" search returned no specific matches + and fell back to general tiktoken documentation explaining that it is a fast + Byte Pair Encoding (BPE) tokeniser for OpenAI models that converts text to tokens + and back losslessly.\n\n2. **Tokenizer query summary**: The \"tokenizer\" search + also returned no specific matches and provided the same fallback documentation + describing tiktoken as a BPE-based tokeniser available via PyPI that is 3-6x + faster than comparable open source alternatives."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":284,"output_index":4,"content_index":0,"item_id":"a48bfae9201147b8","part":{"annotations":[],"logprobs":null,"text":"\n\nBoth + searches returned the same fallback documentation from the tiktoken repository:\n\n1. + **Encoding query summary**: The \"encoding\" search returned no specific matches + and fell back to general tiktoken documentation explaining that it is a fast + Byte Pair Encoding (BPE) tokeniser for OpenAI models that converts text to tokens + and back losslessly.\n\n2. **Tokenizer query summary**: The \"tokenizer\" search + also returned no specific matches and provided the same fallback documentation + describing tiktoken as a BPE-based tokeniser available via PyPI that is 3-6x + faster than comparable open source alternatives.","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":285,"output_index":4,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\nBoth + searches returned the same fallback documentation from the tiktoken repository:\n\n1. + **Encoding query summary**: The \"encoding\" search returned no specific matches + and fell back to general tiktoken documentation explaining that it is a fast + Byte Pair Encoding (BPE) tokeniser for OpenAI models that converts text to tokens + and back losslessly.\n\n2. **Tokenizer query summary**: The \"tokenizer\" search + also returned no specific matches and provided the same fallback documentation + describing tiktoken as a BPE-based tokeniser available via PyPI that is 3-6x + faster than comparable open source alternatives.","type":"output_text"}],"id":"a48bfae9201147b8","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":286,"response":{"conversation_id":null,"created_at":1787834144,"error":null,"id":"resp_01a04337-fb76-7292-beb4-05bf972b30f1","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to make two parallel calls to the gitmcp_tiktoken__search_tiktoken_documentation + function with different queries. I need to issue both calls now without waiting + for one to finish before starting the other. Then I need to summarize each result + in one sentence.\n\nLet me make the two parallel calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"bb288274d8dea360","status":null,"summary":[],"type":"reasoning"},{"approval_request_id":null,"arguments":"{\"query\": + \"encoding\"}","error":null,"id":"mcp_9f533ad40b7a11f8","name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken","status":"completed","type":"mcp_call"},{"approval_request_id":null,"arguments":"{\"query\": + \"tokenizer\"}","error":null,"id":"mcp_a735ac038148c375","name":"search_tiktoken_documentation","output":"### + Search Results for: \"tokenizer\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken","status":"completed","type":"mcp_call"},{"content":[{"text":"Both + searches returned the same fallback documentation since neither query matched + the indexed documentation specifically. Both results show the general tiktoken + documentation. Now I need to summarize each result in one sentence.\n\nSince + both searches returned the same fallback documentation about tiktoken (which + is a fast BPE tokeniser for OpenAI''s models), I''ll summarize them accordingly.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"a80df8f366ef9c32","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\nBoth + searches returned the same fallback documentation from the tiktoken repository:\n\n1. + **Encoding query summary**: The \"encoding\" search returned no specific matches + and fell back to general tiktoken documentation explaining that it is a fast + Byte Pair Encoding (BPE) tokeniser for OpenAI models that converts text to tokens + and back losslessly.\n\n2. **Tokenizer query summary**: The \"tokenizer\" search + also returned no specific matches and provided the same fallback documentation + describing tiktoken as a BPE-based tokeniser available via PyPI that is 3-6x + faster than comparable open source alternatives.","type":"output_text"}],"id":"a48bfae9201147b8","role":"assistant","status":"completed","type":"message"}],"previous_response_id":"resp_01a04337-da11-7f50-a4de-b95f2e147f88","status":"completed","usage":{"input_tokens":30820,"input_tokens_details":{"cached_tokens":0},"output_tokens":340,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":31160}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one to finish before starting the other: (1) search the web for the + exact query "latest vLLM release notes", and (2) call gitmcp_tiktoken__search_tiktoken_documentation + with {"query":"encoding"}. Do not call any other tool.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a04337-fb76-7292-beb4-05bf972b30f1 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787834147,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a04338-17f5-7973-822b-fd7147b4ad48","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a04337-fb76-7292-beb4-05bf972b30f1","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","name":"mcp__gitmcp_tiktoken__search_tiktoken_documentation","output_schema":null,"parameters":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"strict":false,"type":"function"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787834147,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a04338-17f5-7973-822b-fd7147b4ad48","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a04337-fb76-7292-beb4-05bf972b30f1","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","name":"mcp__gitmcp_tiktoken__search_tiktoken_documentation","output_schema":null,"parameters":{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"query":{"description":"The + search query to find relevant documentation","type":"string"}},"required":["query"],"type":"object"},"strict":false,"type":"function"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"8d32913f3a010b95","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"8d32913f3a010b95","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + make","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + two","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + calls","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + in","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":":","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":"1","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":".","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + web","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":"_search","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + with","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + the","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + exact","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + query","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + \"","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":"latest","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + v","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":"LL","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":"M","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + release","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + notes","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":"\"","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":"2","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":".","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + m","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":"cp","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":"__","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":"git","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":"m","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":"cp","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":"_t","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":"ik","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":"token","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":"__","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":"search","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"_t","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":"ik","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":"token","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":"_document","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":"ation","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + with","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + query","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":" + \"","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":"encoding","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":"\"","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":"I","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":" + need","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":" + issue","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":" + both","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":" + calls","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":" + simultaneously","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + in","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + this","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + turn","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":" + without","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":" + waiting","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":" + for","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + either","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":" + complete","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":" + first","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":".","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d32913f3a010b95"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":76,"output_index":0,"content_index":0,"item_id":"8d32913f3a010b95","text":"The + user wants me to make two calls in parallel:\n1. web_search with the exact query + \"latest vLLM release notes\"\n2. mcp__gitmcp_tiktoken__search_tiktoken_documentation + with query \"encoding\"\n\nI need to issue both calls simultaneously in this + turn without waiting for either to complete first.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":77,"output_index":0,"content_index":0,"item_id":"8d32913f3a010b95","part":{"text":"The + user wants me to make two calls in parallel:\n1. web_search with the exact query + \"latest vLLM release notes\"\n2. mcp__gitmcp_tiktoken__search_tiktoken_documentation + with query \"encoding\"\n\nI need to issue both calls simultaneously in this + turn without waiting for either to complete first.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":78,"output_index":0,"item":{"content":[{"text":"The + user wants me to make two calls in parallel:\n1. web_search with the exact query + \"latest vLLM release notes\"\n2. mcp__gitmcp_tiktoken__search_tiktoken_documentation + with query \"encoding\"\n\nI need to issue both calls simultaneously in this + turn without waiting for either to complete first.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8d32913f3a010b95","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":79,"item":{"action":{"queries":["latest + vLLM release notes"],"query":"latest vLLM release notes","type":"search"},"id":"ws_b71f076a9953d409","status":"in_progress","type":"web_search_call"},"output_index":1} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","sequence_number":80,"item_id":"ws_b71f076a9953d409","output_index":1} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","sequence_number":81,"item_id":"ws_b71f076a9953d409","output_index":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":82,"item":{"approval_request_id":null,"arguments":"","error":null,"id":"mcp_88ed92bbdcfd0c9d","name":"search_tiktoken_documentation","output":null,"server_label":"gitmcp_tiktoken","status":"in_progress","type":"mcp_call"},"output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call.in_progress + + ' + - 'data: {"type":"response.mcp_call.in_progress","sequence_number":83,"item_id":"mcp_88ed92bbdcfd0c9d","output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.delta + + ' + - 'data: {"type":"response.mcp_call_arguments.delta","sequence_number":84,"delta":"{\"query\": + \"encoding\"}","item_id":"mcp_88ed92bbdcfd0c9d","output_index":2} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.done + + ' + - 'data: {"type":"response.mcp_call_arguments.done","sequence_number":85,"arguments":"{\"query\": + \"encoding\"}","item_id":"mcp_88ed92bbdcfd0c9d","output_index":2} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","sequence_number":86,"item":{"action":{"queries":["latest + vLLM release notes"],"query":"latest vLLM release notes","sources":[{"title":"Releases + · vllm-project/vllm","url":"https://github.com/vllm-project/vllm/releases"},{"title":"vLLM + Release Notes - NVIDIA Docs","url":"https://docs.nvidia.com/deeplearning/frameworks/vllm-release-notes/index.html"},{"title":"Release + Notes - vLLM Ascend","url":"https://docs.vllm.ai/projects/ascend/en/latest/user_guide/release_notes.html"},{"title":"Release + Notes — vllm-ascend","url":"https://docs.vllm.ai/projects/ascend/en/main/user_guide/release_notes.html"},{"title":"Previous + vLLM Releases | vLLM","url":"https://vllm.ai/releases"},{"title":"Releases · + vllm-project/vllm-ascend","url":"https://github.com/vllm-project/vllm-ascend/releases"},{"title":"Releases + · vllm-project/vllm-omni","url":"https://github.com/vllm-project/vllm-omni/releases"},{"title":"Release + Notes - vLLM Hardware Plugin for Intel® Gaudi®","url":"https://docs.vllm.ai/projects/gaudi/en/latest/release_notes.html"},{"title":"RN-11517-001_v26.07 + | August 2026 vLLM Release Notes","url":"https://docs.nvidia.com/deeplearning/frameworks/pdf/vLLM-Release-Notes.pdf"},{"title":"vllm-project/vllm + v0.27.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.27.0"}],"type":"search"},"id":"ws_b71f076a9953d409","status":"completed","type":"web_search_call"},"item_id":"ws_b71f076a9953d409","output_index":1} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":87,"item":{"action":{"queries":["latest + vLLM release notes"],"query":"latest vLLM release notes","sources":[{"title":"Releases + · vllm-project/vllm","url":"https://github.com/vllm-project/vllm/releases"},{"title":"vLLM + Release Notes - NVIDIA Docs","url":"https://docs.nvidia.com/deeplearning/frameworks/vllm-release-notes/index.html"},{"title":"Release + Notes - vLLM Ascend","url":"https://docs.vllm.ai/projects/ascend/en/latest/user_guide/release_notes.html"},{"title":"Release + Notes — vllm-ascend","url":"https://docs.vllm.ai/projects/ascend/en/main/user_guide/release_notes.html"},{"title":"Previous + vLLM Releases | vLLM","url":"https://vllm.ai/releases"},{"title":"Releases · + vllm-project/vllm-ascend","url":"https://github.com/vllm-project/vllm-ascend/releases"},{"title":"Releases + · vllm-project/vllm-omni","url":"https://github.com/vllm-project/vllm-omni/releases"},{"title":"Release + Notes - vLLM Hardware Plugin for Intel® Gaudi®","url":"https://docs.vllm.ai/projects/gaudi/en/latest/release_notes.html"},{"title":"RN-11517-001_v26.07 + | August 2026 vLLM Release Notes","url":"https://docs.nvidia.com/deeplearning/frameworks/pdf/vLLM-Release-Notes.pdf"},{"title":"vllm-project/vllm + v0.27.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.27.0"}],"type":"search"},"id":"ws_b71f076a9953d409","status":"completed","type":"web_search_call"},"output_index":1} + + ' + - ' + + ' + - 'event: response.mcp_call.completed + + ' + - 'data: {"type":"response.mcp_call.completed","sequence_number":88,"item_id":"mcp_88ed92bbdcfd0c9d","output_index":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":89,"item":{"approval_request_id":null,"arguments":"{\"query\": + \"encoding\"}","error":null,"id":"mcp_88ed92bbdcfd0c9d","name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken","status":"completed","type":"mcp_call"},"output_index":2} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":90,"output_index":3,"item":{"content":null,"encrypted_content":null,"id":"ba1c68288496a080","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":91,"output_index":3,"content_index":0,"item_id":"ba1c68288496a080","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":3,"content_index":0,"delta":"Both","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":93,"output_index":3,"content_index":0,"delta":" + calls","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":94,"output_index":3,"content_index":0,"delta":" + completed","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":95,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":96,"output_index":3,"content_index":0,"delta":" + Now","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":97,"output_index":3,"content_index":0,"delta":" + I","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":98,"output_index":3,"content_index":0,"delta":" + need","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":99,"output_index":3,"content_index":0,"delta":" + to","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":100,"output_index":3,"content_index":0,"delta":" + summarize","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":101,"output_index":3,"content_index":0,"delta":" + each","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":102,"output_index":3,"content_index":0,"delta":" + result","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":103,"output_index":3,"content_index":0,"delta":" + in","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":104,"output_index":3,"content_index":0,"delta":" + one","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":105,"output_index":3,"content_index":0,"delta":" + sentence","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":106,"output_index":3,"content_index":0,"delta":" + as","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":107,"output_index":3,"content_index":0,"delta":" + requested","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":108,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":109,"output_index":3,"content_index":0,"delta":"\n\n","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":110,"output_index":3,"content_index":0,"delta":"1","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":111,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":112,"output_index":3,"content_index":0,"delta":" + For","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":113,"output_index":3,"content_index":0,"delta":" + the","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":114,"output_index":3,"content_index":0,"delta":" + v","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":115,"output_index":3,"content_index":0,"delta":"LL","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":116,"output_index":3,"content_index":0,"delta":"M","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":117,"output_index":3,"content_index":0,"delta":" + release","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":118,"output_index":3,"content_index":0,"delta":" + notes","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":119,"output_index":3,"content_index":0,"delta":" + search","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":120,"output_index":3,"content_index":0,"delta":":","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":121,"output_index":3,"content_index":0,"delta":" + The","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":122,"output_index":3,"content_index":0,"delta":" + search","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":123,"output_index":3,"content_index":0,"delta":" + found","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":124,"output_index":3,"content_index":0,"delta":" + that","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":125,"output_index":3,"content_index":0,"delta":" + the","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":126,"output_index":3,"content_index":0,"delta":" + latest","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":127,"output_index":3,"content_index":0,"delta":" + v","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":128,"output_index":3,"content_index":0,"delta":"LL","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":129,"output_index":3,"content_index":0,"delta":"M","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":130,"output_index":3,"content_index":0,"delta":" + version","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":131,"output_index":3,"content_index":0,"delta":" + is","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":132,"output_index":3,"content_index":0,"delta":" + v","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":133,"output_index":3,"content_index":0,"delta":"0","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":134,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":135,"output_index":3,"content_index":0,"delta":"2","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":136,"output_index":3,"content_index":0,"delta":"7","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":137,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":138,"output_index":3,"content_index":0,"delta":"0","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":139,"output_index":3,"content_index":0,"delta":" + with","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":140,"output_index":3,"content_index":0,"delta":" + ","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":141,"output_index":3,"content_index":0,"delta":"4","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":142,"output_index":3,"content_index":0,"delta":"1","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":143,"output_index":3,"content_index":0,"delta":"1","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":144,"output_index":3,"content_index":0,"delta":" + commits","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":145,"output_index":3,"content_index":0,"delta":" + from","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":146,"output_index":3,"content_index":0,"delta":" + ","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":147,"output_index":3,"content_index":0,"delta":"2","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":148,"output_index":3,"content_index":0,"delta":"1","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":149,"output_index":3,"content_index":0,"delta":"2","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":150,"output_index":3,"content_index":0,"delta":" + contributors","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":151,"output_index":3,"content_index":0,"delta":",","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":152,"output_index":3,"content_index":0,"delta":" + including","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":153,"output_index":3,"content_index":0,"delta":" + features","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":154,"output_index":3,"content_index":0,"delta":" + like","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":155,"output_index":3,"content_index":0,"delta":" + X","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":156,"output_index":3,"content_index":0,"delta":"PU","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":157,"output_index":3,"content_index":0,"delta":" + optimizations","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":158,"output_index":3,"content_index":0,"delta":",","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":159,"output_index":3,"content_index":0,"delta":" + FP","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":160,"output_index":3,"content_index":0,"delta":"8","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":161,"output_index":3,"content_index":0,"delta":" + support","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":162,"output_index":3,"content_index":0,"delta":",","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":163,"output_index":3,"content_index":0,"delta":" + Deep","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":164,"output_index":3,"content_index":0,"delta":"Seek","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":165,"output_index":3,"content_index":0,"delta":"-V","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":166,"output_index":3,"content_index":0,"delta":"4","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":167,"output_index":3,"content_index":0,"delta":" + integration","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":168,"output_index":3,"content_index":0,"delta":",","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":169,"output_index":3,"content_index":0,"delta":" + and","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":170,"output_index":3,"content_index":0,"delta":" + various","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":171,"output_index":3,"content_index":0,"delta":" + CPU","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":172,"output_index":3,"content_index":0,"delta":" + optimizations","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":173,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":174,"output_index":3,"content_index":0,"delta":"\n\n","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":175,"output_index":3,"content_index":0,"delta":"2","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":176,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":177,"output_index":3,"content_index":0,"delta":" + For","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":178,"output_index":3,"content_index":0,"delta":" + the","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":179,"output_index":3,"content_index":0,"delta":" + tik","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":180,"output_index":3,"content_index":0,"delta":"token","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":181,"output_index":3,"content_index":0,"delta":" + encoding","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":182,"output_index":3,"content_index":0,"delta":" + search","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":183,"output_index":3,"content_index":0,"delta":":","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":184,"output_index":3,"content_index":0,"delta":" + The","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":185,"output_index":3,"content_index":0,"delta":" + search","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":186,"output_index":3,"content_index":0,"delta":" + returned","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":187,"output_index":3,"content_index":0,"delta":" + no","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":188,"output_index":3,"content_index":0,"delta":" + specific","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":189,"output_index":3,"content_index":0,"delta":" + matches","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":190,"output_index":3,"content_index":0,"delta":" + and","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":191,"output_index":3,"content_index":0,"delta":" + fell","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":192,"output_index":3,"content_index":0,"delta":" + back","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":193,"output_index":3,"content_index":0,"delta":" + to","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":194,"output_index":3,"content_index":0,"delta":" + general","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":195,"output_index":3,"content_index":0,"delta":" + documentation","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":196,"output_index":3,"content_index":0,"delta":" + about","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":197,"output_index":3,"content_index":0,"delta":" + tik","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":198,"output_index":3,"content_index":0,"delta":"token","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":199,"output_index":3,"content_index":0,"delta":" + being","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":200,"output_index":3,"content_index":0,"delta":" + a","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":201,"output_index":3,"content_index":0,"delta":" + fast","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":202,"output_index":3,"content_index":0,"delta":" + B","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":203,"output_index":3,"content_index":0,"delta":"PE","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":204,"output_index":3,"content_index":0,"delta":" + token","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":205,"output_index":3,"content_index":0,"delta":"iser","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":206,"output_index":3,"content_index":0,"delta":" + for","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":207,"output_index":3,"content_index":0,"delta":" + Open","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":208,"output_index":3,"content_index":0,"delta":"AI","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":209,"output_index":3,"content_index":0,"delta":" + models","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":210,"output_index":3,"content_index":0,"delta":" + that","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":211,"output_index":3,"content_index":0,"delta":" + converts","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":212,"output_index":3,"content_index":0,"delta":" + text","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":213,"output_index":3,"content_index":0,"delta":" + to","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":214,"output_index":3,"content_index":0,"delta":" + tokens","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":215,"output_index":3,"content_index":0,"delta":" + loss","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":216,"output_index":3,"content_index":0,"delta":"lessly","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":217,"output_index":3,"content_index":0,"delta":" + and","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":218,"output_index":3,"content_index":0,"delta":" + is","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":219,"output_index":3,"content_index":0,"delta":" + ","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":220,"output_index":3,"content_index":0,"delta":"3","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":221,"output_index":3,"content_index":0,"delta":"-","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":222,"output_index":3,"content_index":0,"delta":"6","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":223,"output_index":3,"content_index":0,"delta":"x","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":224,"output_index":3,"content_index":0,"delta":" + faster","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":225,"output_index":3,"content_index":0,"delta":" + than","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":226,"output_index":3,"content_index":0,"delta":" + comparable","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":227,"output_index":3,"content_index":0,"delta":" + open","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":228,"output_index":3,"content_index":0,"delta":" + source","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":229,"output_index":3,"content_index":0,"delta":" + alternatives","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":230,"output_index":3,"content_index":0,"delta":".","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":231,"output_index":3,"content_index":0,"delta":"\n","item_id":"ba1c68288496a080"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":232,"output_index":3,"content_index":0,"item_id":"ba1c68288496a080","text":"Both + calls completed. Now I need to summarize each result in one sentence as requested.\n\n1. + For the vLLM release notes search: The search found that the latest vLLM version + is v0.27.0 with 411 commits from 212 contributors, including features like XPU + optimizations, FP8 support, DeepSeek-V4 integration, and various CPU optimizations.\n\n2. + For the tiktoken encoding search: The search returned no specific matches and + fell back to general documentation about tiktoken being a fast BPE tokeniser + for OpenAI models that converts text to tokens losslessly and is 3-6x faster + than comparable open source alternatives.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":233,"output_index":3,"content_index":0,"item_id":"ba1c68288496a080","part":{"text":"Both + calls completed. Now I need to summarize each result in one sentence as requested.\n\n1. + For the vLLM release notes search: The search found that the latest vLLM version + is v0.27.0 with 411 commits from 212 contributors, including features like XPU + optimizations, FP8 support, DeepSeek-V4 integration, and various CPU optimizations.\n\n2. + For the tiktoken encoding search: The search returned no specific matches and + fell back to general documentation about tiktoken being a fast BPE tokeniser + for OpenAI models that converts text to tokens losslessly and is 3-6x faster + than comparable open source alternatives.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":234,"output_index":3,"item":{"content":[{"text":"Both + calls completed. Now I need to summarize each result in one sentence as requested.\n\n1. + For the vLLM release notes search: The search found that the latest vLLM version + is v0.27.0 with 411 commits from 212 contributors, including features like XPU + optimizations, FP8 support, DeepSeek-V4 integration, and various CPU optimizations.\n\n2. + For the tiktoken encoding search: The search returned no specific matches and + fell back to general documentation about tiktoken being a fast BPE tokeniser + for OpenAI models that converts text to tokens losslessly and is 3-6x faster + than comparable open source alternatives.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"ba1c68288496a080","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":235,"output_index":4,"item":{"content":[],"id":"917daffcabecda92","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":236,"output_index":4,"content_index":0,"item_id":"917daffcabecda92","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":237,"output_index":4,"content_index":0,"delta":"\n\n1","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":238,"output_index":4,"content_index":0,"delta":".","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":239,"output_index":4,"content_index":0,"delta":" + **","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":240,"output_index":4,"content_index":0,"delta":"v","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":241,"output_index":4,"content_index":0,"delta":"LL","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":242,"output_index":4,"content_index":0,"delta":"M","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":243,"output_index":4,"content_index":0,"delta":" + release","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":244,"output_index":4,"content_index":0,"delta":" + notes","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":245,"output_index":4,"content_index":0,"delta":" + summary","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":246,"output_index":4,"content_index":0,"delta":"**:","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":247,"output_index":4,"content_index":0,"delta":" + The","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":248,"output_index":4,"content_index":0,"delta":" + latest","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":249,"output_index":4,"content_index":0,"delta":" + v","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":250,"output_index":4,"content_index":0,"delta":"LL","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":251,"output_index":4,"content_index":0,"delta":"M","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":252,"output_index":4,"content_index":0,"delta":" + release","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":253,"output_index":4,"content_index":0,"delta":" + is","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":254,"output_index":4,"content_index":0,"delta":" + version","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":255,"output_index":4,"content_index":0,"delta":" + v","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":256,"output_index":4,"content_index":0,"delta":"0","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":257,"output_index":4,"content_index":0,"delta":".","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":258,"output_index":4,"content_index":0,"delta":"2","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":259,"output_index":4,"content_index":0,"delta":"7","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":260,"output_index":4,"content_index":0,"delta":".","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":261,"output_index":4,"content_index":0,"delta":"0","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":262,"output_index":4,"content_index":0,"delta":",","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":263,"output_index":4,"content_index":0,"delta":" + featuring","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":264,"output_index":4,"content_index":0,"delta":" + ","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":265,"output_index":4,"content_index":0,"delta":"4","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":266,"output_index":4,"content_index":0,"delta":"1","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":267,"output_index":4,"content_index":0,"delta":"1","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":268,"output_index":4,"content_index":0,"delta":" + commits","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":269,"output_index":4,"content_index":0,"delta":" + from","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":270,"output_index":4,"content_index":0,"delta":" + ","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":271,"output_index":4,"content_index":0,"delta":"2","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":272,"output_index":4,"content_index":0,"delta":"1","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":273,"output_index":4,"content_index":0,"delta":"2","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":274,"output_index":4,"content_index":0,"delta":" + contributors","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":275,"output_index":4,"content_index":0,"delta":" + with","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":276,"output_index":4,"content_index":0,"delta":" + significant","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":277,"output_index":4,"content_index":0,"delta":" + updates","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":278,"output_index":4,"content_index":0,"delta":" + including","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":279,"output_index":4,"content_index":0,"delta":" + X","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":280,"output_index":4,"content_index":0,"delta":"PU","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":281,"output_index":4,"content_index":0,"delta":" + optimizations","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":282,"output_index":4,"content_index":0,"delta":",","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":283,"output_index":4,"content_index":0,"delta":" + FP","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":284,"output_index":4,"content_index":0,"delta":"8","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":285,"output_index":4,"content_index":0,"delta":" + support","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":286,"output_index":4,"content_index":0,"delta":",","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":287,"output_index":4,"content_index":0,"delta":" + Deep","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":288,"output_index":4,"content_index":0,"delta":"Seek","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":289,"output_index":4,"content_index":0,"delta":"-V","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":290,"output_index":4,"content_index":0,"delta":"4","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":291,"output_index":4,"content_index":0,"delta":" + integration","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":292,"output_index":4,"content_index":0,"delta":",","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":293,"output_index":4,"content_index":0,"delta":" + and","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":294,"output_index":4,"content_index":0,"delta":" + various","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":295,"output_index":4,"content_index":0,"delta":" + CPU","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":296,"output_index":4,"content_index":0,"delta":" + kernel","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":297,"output_index":4,"content_index":0,"delta":" + improvements","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":298,"output_index":4,"content_index":0,"delta":".","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":299,"output_index":4,"content_index":0,"delta":"\n\n","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":300,"output_index":4,"content_index":0,"delta":"2","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":301,"output_index":4,"content_index":0,"delta":".","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":302,"output_index":4,"content_index":0,"delta":" + **","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":303,"output_index":4,"content_index":0,"delta":"T","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":304,"output_index":4,"content_index":0,"delta":"ik","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":305,"output_index":4,"content_index":0,"delta":"token","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":306,"output_index":4,"content_index":0,"delta":" + encoding","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":307,"output_index":4,"content_index":0,"delta":" + documentation","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":308,"output_index":4,"content_index":0,"delta":" + summary","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":309,"output_index":4,"content_index":0,"delta":"**:","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":310,"output_index":4,"content_index":0,"delta":" + The","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":311,"output_index":4,"content_index":0,"delta":" + \"","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":312,"output_index":4,"content_index":0,"delta":"encoding","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":313,"output_index":4,"content_index":0,"delta":"\"","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":314,"output_index":4,"content_index":0,"delta":" + search","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":315,"output_index":4,"content_index":0,"delta":" + returned","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":316,"output_index":4,"content_index":0,"delta":" + no","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":317,"output_index":4,"content_index":0,"delta":" + specific","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":318,"output_index":4,"content_index":0,"delta":" + matches","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":319,"output_index":4,"content_index":0,"delta":" + and","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":320,"output_index":4,"content_index":0,"delta":" + provided","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":321,"output_index":4,"content_index":0,"delta":" + fallback","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":322,"output_index":4,"content_index":0,"delta":" + documentation","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":323,"output_index":4,"content_index":0,"delta":" + explaining","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":324,"output_index":4,"content_index":0,"delta":" + that","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":325,"output_index":4,"content_index":0,"delta":" + tik","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":326,"output_index":4,"content_index":0,"delta":"token","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":327,"output_index":4,"content_index":0,"delta":" + is","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":328,"output_index":4,"content_index":0,"delta":" + a","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":329,"output_index":4,"content_index":0,"delta":" + fast","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":330,"output_index":4,"content_index":0,"delta":" + Byte","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":331,"output_index":4,"content_index":0,"delta":" + Pair","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":332,"output_index":4,"content_index":0,"delta":" + Encoding","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":333,"output_index":4,"content_index":0,"delta":" + (","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":334,"output_index":4,"content_index":0,"delta":"B","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":335,"output_index":4,"content_index":0,"delta":"PE","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":336,"output_index":4,"content_index":0,"delta":")","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":337,"output_index":4,"content_index":0,"delta":" + token","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":338,"output_index":4,"content_index":0,"delta":"iser","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":339,"output_index":4,"content_index":0,"delta":" + for","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":340,"output_index":4,"content_index":0,"delta":" + Open","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":341,"output_index":4,"content_index":0,"delta":"AI","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":342,"output_index":4,"content_index":0,"delta":" + models","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":343,"output_index":4,"content_index":0,"delta":" + that","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":344,"output_index":4,"content_index":0,"delta":" + is","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":345,"output_index":4,"content_index":0,"delta":" + ","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":346,"output_index":4,"content_index":0,"delta":"3","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":347,"output_index":4,"content_index":0,"delta":"-","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":348,"output_index":4,"content_index":0,"delta":"6","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":349,"output_index":4,"content_index":0,"delta":"x","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":350,"output_index":4,"content_index":0,"delta":" + faster","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":351,"output_index":4,"content_index":0,"delta":" + than","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":352,"output_index":4,"content_index":0,"delta":" + comparable","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":353,"output_index":4,"content_index":0,"delta":" + open","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":354,"output_index":4,"content_index":0,"delta":" + source","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":355,"output_index":4,"content_index":0,"delta":" + alternatives","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":356,"output_index":4,"content_index":0,"delta":".","item_id":"917daffcabecda92","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":357,"output_index":4,"content_index":0,"item_id":"917daffcabecda92","logprobs":[],"text":"\n\n1. + **vLLM release notes summary**: The latest vLLM release is version v0.27.0, + featuring 411 commits from 212 contributors with significant updates including + XPU optimizations, FP8 support, DeepSeek-V4 integration, and various CPU kernel + improvements.\n\n2. **Tiktoken encoding documentation summary**: The \"encoding\" + search returned no specific matches and provided fallback documentation explaining + that tiktoken is a fast Byte Pair Encoding (BPE) tokeniser for OpenAI models + that is 3-6x faster than comparable open source alternatives."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":358,"output_index":4,"content_index":0,"item_id":"917daffcabecda92","part":{"annotations":[],"logprobs":null,"text":"\n\n1. + **vLLM release notes summary**: The latest vLLM release is version v0.27.0, + featuring 411 commits from 212 contributors with significant updates including + XPU optimizations, FP8 support, DeepSeek-V4 integration, and various CPU kernel + improvements.\n\n2. **Tiktoken encoding documentation summary**: The \"encoding\" + search returned no specific matches and provided fallback documentation explaining + that tiktoken is a fast Byte Pair Encoding (BPE) tokeniser for OpenAI models + that is 3-6x faster than comparable open source alternatives.","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":359,"output_index":4,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\n1. + **vLLM release notes summary**: The latest vLLM release is version v0.27.0, + featuring 411 commits from 212 contributors with significant updates including + XPU optimizations, FP8 support, DeepSeek-V4 integration, and various CPU kernel + improvements.\n\n2. **Tiktoken encoding documentation summary**: The \"encoding\" + search returned no specific matches and provided fallback documentation explaining + that tiktoken is a fast Byte Pair Encoding (BPE) tokeniser for OpenAI models + that is 3-6x faster than comparable open source alternatives.","type":"output_text"}],"id":"917daffcabecda92","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":360,"response":{"conversation_id":null,"created_at":1787834153,"error":null,"id":"resp_01a04338-17f5-7973-822b-fd7147b4ad48","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to make two calls in parallel:\n1. web_search with the exact query + \"latest vLLM release notes\"\n2. mcp__gitmcp_tiktoken__search_tiktoken_documentation + with query \"encoding\"\n\nI need to issue both calls simultaneously in this + turn without waiting for either to complete first.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8d32913f3a010b95","status":null,"summary":[],"type":"reasoning"},{"action":{"queries":["latest + vLLM release notes"],"query":"latest vLLM release notes","sources":[{"title":"Releases + · vllm-project/vllm","url":"https://github.com/vllm-project/vllm/releases"},{"title":"vLLM + Release Notes - NVIDIA Docs","url":"https://docs.nvidia.com/deeplearning/frameworks/vllm-release-notes/index.html"},{"title":"Release + Notes - vLLM Ascend","url":"https://docs.vllm.ai/projects/ascend/en/latest/user_guide/release_notes.html"},{"title":"Release + Notes — vllm-ascend","url":"https://docs.vllm.ai/projects/ascend/en/main/user_guide/release_notes.html"},{"title":"Previous + vLLM Releases | vLLM","url":"https://vllm.ai/releases"},{"title":"Releases · + vllm-project/vllm-ascend","url":"https://github.com/vllm-project/vllm-ascend/releases"},{"title":"Releases + · vllm-project/vllm-omni","url":"https://github.com/vllm-project/vllm-omni/releases"},{"title":"Release + Notes - vLLM Hardware Plugin for Intel® Gaudi®","url":"https://docs.vllm.ai/projects/gaudi/en/latest/release_notes.html"},{"title":"RN-11517-001_v26.07 + | August 2026 vLLM Release Notes","url":"https://docs.nvidia.com/deeplearning/frameworks/pdf/vLLM-Release-Notes.pdf"},{"title":"vllm-project/vllm + v0.27.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.27.0"}],"type":"search"},"id":"ws_b71f076a9953d409","status":"completed","type":"web_search_call"},{"approval_request_id":null,"arguments":"{\"query\": + \"encoding\"}","error":null,"id":"mcp_88ed92bbdcfd0c9d","name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken","status":"completed","type":"mcp_call"},{"content":[{"text":"Both + calls completed. Now I need to summarize each result in one sentence as requested.\n\n1. + For the vLLM release notes search: The search found that the latest vLLM version + is v0.27.0 with 411 commits from 212 contributors, including features like XPU + optimizations, FP8 support, DeepSeek-V4 integration, and various CPU optimizations.\n\n2. + For the tiktoken encoding search: The search returned no specific matches and + fell back to general documentation about tiktoken being a fast BPE tokeniser + for OpenAI models that converts text to tokens losslessly and is 3-6x faster + than comparable open source alternatives.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"ba1c68288496a080","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\n1. + **vLLM release notes summary**: The latest vLLM release is version v0.27.0, + featuring 411 commits from 212 contributors with significant updates including + XPU optimizations, FP8 support, DeepSeek-V4 integration, and various CPU kernel + improvements.\n\n2. **Tiktoken encoding documentation summary**: The \"encoding\" + search returned no specific matches and provided fallback documentation explaining + that tiktoken is a fast Byte Pair Encoding (BPE) tokeniser for OpenAI models + that is 3-6x faster than comparable open source alternatives.","type":"output_text"}],"id":"917daffcabecda92","role":"assistant","status":"completed","type":"message"}],"previous_response_id":"resp_01a04337-fb76-7292-beb4-05bf972b30f1","status":"completed","usage":{"input_tokens":39817,"input_tokens_details":{"cached_tokens":0},"output_tokens":407,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":40224}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-nonstreaming.yaml new file mode 100644 index 00000000..775201b7 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-nonstreaming.yaml @@ -0,0 +1,731 @@ +turns: +- filename: t1 + request: + body: + input: 'Do two separate web_search calls in parallel, in this single turn -- + do not wait for one to finish before starting the other. The first web_search + call must batch two exact queries together: "potato nutrition facts" and "tomato + nutrition facts". The second web_search call must batch two different exact + queries together: "cucumber nutrition facts" and "carrot nutrition facts". + Issue both calls now, then summarize each of the four results in one sentence.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812391 + created_at: 1787812379 + error: null + frequency_penalty: 0.0 + id: resp_0c8c5523509b5def006a8fda1bcb6087d0a8c7913adb3c8942 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - id: mcpl_0c8c5523509b5def006a8fda1bd78487d0becd637e1aaca6da + server_label: gitmcp_tiktoken + tools: + - annotations: + read_only: false + description: 'Semantically search within the fetched documentation from + GitHub repository: openai/tiktoken. Useful for specific queries.' + input_schema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + properties: + query: + description: The search query to find relevant documentation + type: string + required: + - query + type: object + name: search_tiktoken_documentation + type: mcp_list_tools + - content: [] + encrypted_content: gAAAAABqj9onz6pdRAFJhk_BEjPLhaVLraA9PJdnV4nI95CqygMkOX60CGtpefxFqV9bwV-Kh6ESZ8XiBWnKULsiwmfQcCkxeBRW2k7yfkiRr_BlQCi07Hj6kkolM125-JVdQXUpAVKyJHO29GWqcxscOxphA2Dd7IsLJqiyZ0gmLgQ1CVjmMDvN9SKuhcXH69ibUrV7M4ORXkYqd9rZx3zIyQQnXrai-OdjdIYQfIxuT4ynx-uL7oc91lzjm5X2j7_zEf36-Ob48ss76cf9RG7xF-oCYZBac1f6G5z3Fo6LMcn1RwbSpY6q8DT8hwBn0rvv8m0UkVBJV2qBfJVxQCGJy3GH_Hxd0csdodC4jgPiixcNzDqx7cjFcNUejI9UlzhY1KUsW5tde32Iv0VCg8iKL7iBZtKq0aS7cWFSJt__GSq1npmLiFUfZDAQ-9n-uzkdmUVamP8twgzDkYTBmiLdUDIwGQGSLtGfeWa2jeEa5K4-9QVB-AVp-ZHUgrFc1KEvOq8epelnfZbp66xwKOztMRX73i50p1V2R8p2FWGgjbcNzLxi7wjcFTsScuT2fJ5wt0JxWYe12R74ku1R2KmxWAu402E3XUP0l9xPh7rmyOedMhQSsn_IDxkC36_zG2yj0y7rCPbUbSsAK3FMVvgkWBmF3ItUcCe07hFY9ZVbeoeRd56EsfI99KUOB5YoBKDg2M7jATg4ykd2JuDS8-gmg3Vi6pkQT6chNIBG7kNBtDAepcVfP9TY3FLm3W2XuEe4HtNCfPaY8Uch1WDNzeWfy1FhMNNx1IWc-DPuctKswEeBJvuT0lqXdwKeQwSQnx_do6PWv9-oc-gCP3mQmGgmB10wkiGD93ODh0sm-_MaZKG4aPIwrpTCPDRkhR2bluL_qFf1TLSDjCn6SpGxZNen8h67ZmCSUVdfKVKNjQQweGUaK_08Yxslor8aQZI7jx9Qu90A-NoI4jvgAiv_OsQY6v7GyymPxTYGkjeuPEa6Ruy0iMJsxrUmhJR7lzm6o_nHDiH08M1CRm5tLl8ewB6Ex4lBRd0MHLgxN6KlK7hV3O_j2atZkz9joglDOelJm_qrS0QYZZ9DiEqVPfGhqaz9sxlRvWFJfKQsZtGitstQXIiyXMPF6KMvqk7LEZJ7PVpXF2x5j5Szhnk3dn6oB_76FECxAjvOeyjNb11ft7hbAfXpBdWsSvP0O5ETtLkmD12yK888cSI0lZ3BLMw7VeFcoXxXLRrXCOwa3uIBLeT0O_vHV1hccDKIcijIaWt7h-xAx_X_PRuroHNpcOik-HUlpOsO79CrtOxPBnmgIVzFya3ceyYsMLMGZxEQ3wvw1f_0NR1JC-3d2VMKBusqFQFS9cW88MxJlgGD5RF-CH0TuFf16E-a011rx0WlkUNTZi8B3QdVd3FwFSHNVXy4skenQ5f47V7hT3xZlREGvtiaXOfhmAN-2gT14yfDu6T_OlcofV7GvNtf5j87R9rKk_JdUyhCZw1v33WoPh9SiNPSnwtYwY7xjVvDWo7ldsGpNCpNwUtKvDCZ + id: rs_0c8c5523509b5def006a8fda1d63a487d0b0fee576026f414d + summary: [] + type: reasoning + - action: + queries: + - potato nutrition facts + - tomato nutrition facts + query: potato nutrition facts + type: search + id: ws_0c8c5523509b5def006a8fda1e251487d0a3c72a63c5423f33 + status: completed + type: web_search_call + - action: + queries: + - cucumber nutrition facts + - carrot nutrition facts + query: cucumber nutrition facts + type: search + id: ws_0c8c5523509b5def006a8fda20d93087d098411993d9a0f36b + status: completed + type: web_search_call + - content: [] + encrypted_content: gAAAAABqj9onNt-2N-SIU_Rev3LIbYnL8ulZFkw1ATDAmm7x6mloe8kOat5TuGJUHgNSCi3FZz6-eHFmEjrj9TObLg4cm3u9M4f-bGzQhAYA_qIZTHDl8b0wwWe70AaRVIu6b0tUIQDh9f1tDMmBCFTPnPFnionFpaBJZ2Vg8blVaoLj4qiaUaoOXika4flIFeKmbxhhNty6ivERnhPV5R2JSx_GuYzFnQ34k3IQEfbspQ4LAJ75W20d1Yo7rUS2y8K9KLHy-_GF2Z-LPPHVCu-vCCDfLdTGtQl3VteqZUb0ZMCYIwxa83mXm9mbcLyt-jVclDWzrgyVFZ0aVTo5o9aNxZsiMcJHtpFdGSDdmncYmHjA_nx_yoedSPvQ0HClzIN1QrFHQ-ZdfUqJOgBTvN6rvD57VbwO_UW046Ry6HAirr1arOBF70iQvkU0wVn2PZsBtThHGDKfc-wW56qbrp2GGYaGbWRLIGfV7C5XI60fCLv84TkHXHIPjpISgz19oMINxKgx4uYhmvJdorhJye73PNOgTvCTL7EudO_k7V_nGTpvAUL_v6qKLFIdGM9ipUX5GvOKLCRZ1TFy0NbTU8hj_rMO_5XcunJ5dsmhC5TDwM1tme9-mjd40VikGQOiXp6EKTTcRFe0XMvQUXVHnrFMCWBoDPSR2C5P1AznthqMHHs17S9OBQUJYlLeLSO9OXBTibsNTTJdGYBmi-DI3zVTikuc_xfk5AEtbzn_0JbvV_JKmOOyrhQTny_lyi7mqhauQSRclcpCBb46KiEt17eaXKemPOV5tb10YhoksBwleWjW-Fwwbd3kfdP6C5aV_1TerMpm-0hqhifpF9yy18-KyVLOOE4fHf35XNZq5o8usvxYQes8RpDX3gJXhvDC31XBKyNYitoczujQ-zYP83BW_YZ6N2zWpczbCGMuAIb2zWpjBYWoTUnjLp7LbsM4CBaQ64P4NA4To92Ap0wiGBQWOWIXFG3UYShqMxz4-FuBSSJBHyplDc3zc-ExqlomOsyRmOvau93pFvFSJtGFwbX3jJEU2HBAlLsCtGJBKI7OFUQmRydByFHja_m8gapy_zd3OzNbyu5_gzMSQobU5lYh9PL971gdTYkBFhcYu3omNzm_tx45ImNEVCo-H625sKcrfm2P6pHOAo9fKSb3hLt68uBpKJSkTJlIBiSMNI4egDuib_fSk1pwKhmUEjIqddVAFE9YltfZIlISKtgp2WnAGk4M-UP8GFGX8b7R6sIpEJt9gNsDoN6AAqwdibrGNbM_fwLE0xJGHpAyFa1fQOD_qHyr4xc4MSYOGCYkX1U5PwDelLntziT2oZ9sWdu6IzfTfxjFT0XkHzK1zGaAJHI2fVW0tX9ZCldhWXBi96Bk9kmcG97XTu5AfNCCCjVkOtCk3mcsYfCLfcikKPZ-LlQa5H3vHyGnrGTEIpmIIi_lHv-L9LmfH6uhRmr9dqYNPkPkuPBnDQK0Prf2GADbYU41ZG3vECD19zw0YDOt2W5DHSEuaVfi4m-70jVKf4VF6geaFGi3a8Gcw52XZMKqa6X8Apdhhb20XlwDc6jBFSAb9yXXV_SmIQ_gaIsun8nmwYUsKzlEElm5yfjHqIukF2IXJDMkkHbekangPoW9hkyvnPUlWb_IqtEV79EnTeeqSDkBhltK5Tp8hv-tjPlNx5Ppos0zrJh0DJ8e4TDL15Cm3p_RjJIEsTcbkoFdIIjMSCTS7QbnOB7C + id: rs_0c8c5523509b5def006a8fda25593087d08c2ca022a3350854 + summary: [] + type: reasoning + - content: + - annotations: + - end_index: 238 + start_index: 162 + title: Potato + type: url_citation + url: https://en.wikipedia.org/wiki/Potato?utm_source=openai + - end_index: 465 + start_index: 391 + title: Tomato Nutrition Facts | Food Index + type: url_citation + url: https://foodindexhq.com/food/tomato?utm_source=openai + - end_index: 798 + start_index: 605 + title: Cucumber, peeled, raw, 1 large (8-1/4" long) | University Hospitals + type: url_citation + url: https://www.uhhospitals.org/health-information/health-and-wellness-library/nutrition-facts/article/nutritionfacts-v1/cucumber-peeled-raw-1-large-8-14-long?utm_source=openai + - end_index: 1069 + start_index: 968 + title: Carrots | SNAP-Ed + type: url_citation + url: https://snaped.fns.usda.gov/seasonal-produce-guide/carrots?utm_source=openai + logprobs: [] + text: '- **Potato:** A 100-gram boiled potato with skin provides about 87 + calories, 20 grams of carbohydrates, 2 grams of fiber, 2 grams of protein, + and negligible fat. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Potato?utm_source=openai)) + + - **Tomato:** One medium tomato (about 123 grams) provides roughly 22 + calories, 4.8 grams of carbohydrates, 1.1 grams of protein, and 0.2 grams + of fat. ([foodindexhq.com](https://foodindexhq.com/food/tomato?utm_source=openai)) + + - **Cucumber:** Raw cucumber is approximately 95% water and is a very + low-calorie, low-sodium food that supplies a modest amount of fiber. ([uhhospitals.org](https://www.uhhospitals.org/health-information/health-and-wellness-library/nutrition-facts/article/nutritionfacts-v1/cucumber-peeled-raw-1-large-8-14-long?utm_source=openai)) + + - **Carrot:** One medium carrot contains about 25 calories, 6 grams of + carbohydrates, 1.5–2 grams of fiber, minimal fat, and abundant vitamin + A–producing beta-carotene. ([snaped.fns.usda.gov](https://snaped.fns.usda.gov/seasonal-produce-guide/carrots?utm_source=openai))' + type: output_text + id: msg_0c8c5523509b5def006a8fda26813c87d0b73026393ef8a8b0 + phase: final_answer + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 2 + tools: + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - allowed_tools: + - search_tiktoken_documentation + headers: null + require_approval: never + server_description: null + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 13246 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 4643 + output_tokens: 472 + output_tokens_details: + reasoning_tokens: 221 + total_tokens: 13718 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: 'Call gitmcp_tiktoken__search_tiktoken_documentation in parallel for + two separate exact queries -- do not wait for one to finish before starting + the other: (1) {"query":"encoding"} and (2) {"query":"tokenizer"}. Issue both + calls now in this single turn, then summarize each result in one sentence.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0c8c5523509b5def006a8fda1bcb6087d0a8c7913adb3c8942 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812398 + created_at: 1787812392 + error: null + frequency_penalty: 0.0 + id: resp_0c8c5523509b5def006a8fda28093887d084b33cf16a64e7b9 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9ounsugFaVF-_TauZU6l8WhDIwdV4zGNOQPdYkWZmRtFbjv6JISTvU9VMNFy_viUodvB5_M1PLYbEsRzgXQuuGlZ9OOtLPP4bySL1ASbGtxALoYZpIA1MYtbOAlD7OlLBJDsgR50bIiSPeS-S1yGYglyye2EAx8CRw0iD3a3L8TJLkLt66oJYn-w5ehKQRpbhMwKxHIBRW1EtDEStZSRAZH42TT_u6mj6V3mZYpZZZh7rcyXLYxCDZ_EwsGVTYN1ICGGpPjDBBfZiEgvmDgPakEMYYPGX4kHoXVLoWrtpcGb_cg7H_h-W8u2SyC71XFIZTJrRDPyJSFZXsMj7B6NO9F9D1C3hSm0uGikU3fQQVdC7n6ICLfdvTZ_Bw_N7lBTfarWRjTItsOWToOE9BDY3cZSGcC4btk6LbEgJ_GyTIMRz2Nj06BSGjGWZ-HU7-nvFYfs9klVEZ1YEqu8UMLdUIjieiYvNB3AVxnVLsTrpgecUyA-pPjPFNalczH5FStW5TUeUPtsGdVkCWFcEoizku6Ur4SPHQAAcR16ja1h8Y7nr_0XA8cqiWxuz4hASXviEJ3AxFL2rGEvOhDrll559nFVtXU7LmVet2pRF0Es4C_CDCgm5qC_sR68-72hlMVWJ16cpkxbCUn7uTp4357N3T_T8z--6qbQiTEAYkqo5uJhmA16Fmh0lwPy4H_R49m4o-_0QQHTWemY2n_YNTOFljBL9Y_Or0Gd4L2PVMKTjgLZkHHml5pA9Mfyovocxr5jkmYXQHooe4uPGkXbdSGwIsyVI4LoIKii9rZjZi7_WaGDZrrWXy_Koffef9PLztfgy5PxBISS5idrbRU_9K4KUkUU0jDmtRKUzzoV7tuufkw2Qs2GQMzpFZsXevHd1rsUkeXlS5KoyJfuija9Xn2qwFIhfw2rsyGHmQb8ua0f1HKF5HGtQOR5tF7zMIFl6hPKzr3_TBwhVHyGbKKYLeZbiDRlcx_ch7UJ1Kyf_vrBvOWRh3RvJ0JypqOQO5nbFLJg7dn7TMqh_dKPCrMRuPJObIxtIx14qG-aJQhdwAvEhNR6qK7BgH90vEwO1eiC85XqBDJK9ZpBGeAaI_dUcqsxtyj3omZ__mGo-dHpx68sPpjQUNvtpgGsxNbWIPILZy8k2wrwvMW_dIAzSzpTh3T8wpnVbxC_NfU7nJt_Db9w_MnxYi4mY1F3eufqP4fQ2zJHtZij6sj5X-ZflrmwqxUM2Jhmn2UREfoiYJu_LlseTTbkvd3iRxGhsO-X4vWydhVbDIy9oDqyIH5SM4xGWRw8MjKGIrbwaliV6amOYbsNr_aJvQ= + id: rs_0c8c5523509b5def006a8fda28c63c87d0869e325ca9aa4d0e + summary: [] + type: reasoning + - approval_request_id: null + arguments: '{"query":"encoding"}' + error: null + id: mcp_0c8c5523509b5def006a8fda29315c87d0bac0e49f2d96279d + name: search_tiktoken_documentation + output: "### Search Results for: \"encoding\"\n\nNo relevant documentation\ + \ found for your query. It's either being indexed or the search query did\ + \ not match any documentation.\n\nAs a fallback, this is the documentation\ + \ for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding)\ + \ tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\n\ + enc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"\ + hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding\ + \ to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"\ + gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed\ + \ from [PyPI](https://pypi.org/project/tiktoken):\n```\npip install tiktoken\n\ + ```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample\ + \ code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\ + \n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable\ + \ open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\ + \nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast`\ + \ from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\ + \n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\ + \nIf you work at OpenAI, make sure to check the internal documentation or\ + \ feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage\ + \ models don't see text like you and I, instead they see a sequence of numbers\ + \ (known as tokens).\nByte pair encoding (BPE) is a way of converting text\ + \ into tokens. It has a couple desirable\nproperties:\n1) It's reversible\ + \ and lossless, so you can convert tokens back into the original text\n\ + 2) It works on arbitrary text, even text that is not in the tokeniser's\ + \ training data\n3) It compresses the text: the token sequence is shorter\ + \ than the bytes corresponding to the\n original text. On average, in\ + \ practice, each token corresponds to about 4 bytes.\n4) It attempts to\ + \ let the model see common subwords. For instance, \"ing\" is a common subword\ + \ in\n English, so BPE encodings will often split \"encoding\" into tokens\ + \ like \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"\ + ). Because the model will then see the \"ing\" token again and\n again\ + \ in different contexts, it helps models generalise and better understand\ + \ grammar.\n\n`tiktoken` contains an educational submodule that is friendlier\ + \ if you want to learn more about\nthe details of BPE, including code that\ + \ helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational\ + \ import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\ + \n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"\ + cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending\ + \ tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings.\ + \ There are two ways to do this.\n\n\n**Create your `Encoding` object exactly\ + \ the way you want and simply pass it around.**\n\n```python\ncl100k_base\ + \ = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the\ + \ arguments directly instead of accessing private attributes\n# See openai_public.py\ + \ for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n\ + \ # If you're changing the set of special tokens, make sure to use a\ + \ different name\n # It should be clear from the name what behaviour\ + \ to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n\ + \ mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n\ + \ **cl100k_base._special_tokens,\n \"<|im_start|>\": 100264,\n\ + \ \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext`\ + \ plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\ + \nThis is only useful if you need `tiktoken.get_encoding` to find your encoding,\ + \ otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace\ + \ package under `tiktoken_ext`.\n\nLayout your project like this, making\ + \ sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\ + ├── tiktoken_ext\n│   └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py`\ + \ should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\n\ + This is a dictionary from an encoding name to a function that takes no arguments\ + \ and returns\narguments that can be passed to `tiktoken.Encoding` to construct\ + \ that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For\ + \ precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should\ + \ look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\ + \nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=['tiktoken_ext*']),\n\ + \ install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen simply `pip\ + \ install ./my_tiktoken_extension` and you should be able to use your\n\ + custom encodings! Make sure **not** to use an editable install.\n\n\n\n\ + If you'd like to retry the search, try changing the query to increase the\ + \ likelihood of a match." + server_label: gitmcp_tiktoken + status: completed + type: mcp_call + - approval_request_id: null + arguments: '{"query":"tokenizer"}' + error: null + id: mcp_0c8c5523509b5def006a8fda2c1b2487d09a00eb99191f9295 + name: search_tiktoken_documentation + output: "### Search Results for: \"tokenizer\"\n\nNo relevant documentation\ + \ found for your query. It's either being indexed or the search query did\ + \ not match any documentation.\n\nAs a fallback, this is the documentation\ + \ for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding)\ + \ tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\n\ + enc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"\ + hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding\ + \ to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"\ + gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed\ + \ from [PyPI](https://pypi.org/project/tiktoken):\n```\npip install tiktoken\n\ + ```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample\ + \ code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\ + \n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable\ + \ open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\ + \nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast`\ + \ from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\ + \n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\ + \nIf you work at OpenAI, make sure to check the internal documentation or\ + \ feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage\ + \ models don't see text like you and I, instead they see a sequence of numbers\ + \ (known as tokens).\nByte pair encoding (BPE) is a way of converting text\ + \ into tokens. It has a couple desirable\nproperties:\n1) It's reversible\ + \ and lossless, so you can convert tokens back into the original text\n\ + 2) It works on arbitrary text, even text that is not in the tokeniser's\ + \ training data\n3) It compresses the text: the token sequence is shorter\ + \ than the bytes corresponding to the\n original text. On average, in\ + \ practice, each token corresponds to about 4 bytes.\n4) It attempts to\ + \ let the model see common subwords. For instance, \"ing\" is a common subword\ + \ in\n English, so BPE encodings will often split \"encoding\" into tokens\ + \ like \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"\ + ). Because the model will then see the \"ing\" token again and\n again\ + \ in different contexts, it helps models generalise and better understand\ + \ grammar.\n\n`tiktoken` contains an educational submodule that is friendlier\ + \ if you want to learn more about\nthe details of BPE, including code that\ + \ helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational\ + \ import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\ + \n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"\ + cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending\ + \ tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings.\ + \ There are two ways to do this.\n\n\n**Create your `Encoding` object exactly\ + \ the way you want and simply pass it around.**\n\n```python\ncl100k_base\ + \ = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the\ + \ arguments directly instead of accessing private attributes\n# See openai_public.py\ + \ for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n\ + \ # If you're changing the set of special tokens, make sure to use a\ + \ different name\n # It should be clear from the name what behaviour\ + \ to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n\ + \ mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n\ + \ **cl100k_base._special_tokens,\n \"<|im_start|>\": 100264,\n\ + \ \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext`\ + \ plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\ + \nThis is only useful if you need `tiktoken.get_encoding` to find your encoding,\ + \ otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace\ + \ package under `tiktoken_ext`.\n\nLayout your project like this, making\ + \ sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\ + ├── tiktoken_ext\n│   └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py`\ + \ should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\n\ + This is a dictionary from an encoding name to a function that takes no arguments\ + \ and returns\narguments that can be passed to `tiktoken.Encoding` to construct\ + \ that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For\ + \ precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should\ + \ look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\ + \nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=['tiktoken_ext*']),\n\ + \ install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen simply `pip\ + \ install ./my_tiktoken_extension` and you should be able to use your\n\ + custom encodings! Make sure **not** to use an editable install.\n\n\n\n\ + If you'd like to retry the search, try changing the query to increase the\ + \ likelihood of a match." + server_label: gitmcp_tiktoken + status: completed + type: mcp_call + - content: + - annotations: [] + logprobs: [] + text: '- **“encoding”:** No direct match was found, but the fallback documentation + explains how to load model encodings, encode/decode text, visualize BPE, + and create or register custom `Encoding` objects. + + - **“tokenizer”:** No direct match was found, but the fallback describes + `tiktoken` as a fast, reversible BPE tokenizer for OpenAI models and points + to its core API and educational tools.' + type: output_text + id: msg_0c8c5523509b5def006a8fda2ce3cc87d08e193c1ab309c631 + phase: final_answer + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_0c8c5523509b5def006a8fda1bcb6087d0a8c7913adb3c8942 + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - allowed_tools: + - search_tiktoken_documentation + headers: null + require_approval: never + server_description: null + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 16168 + input_tokens_details: + cache_write_tokens: 8797 + cached_tokens: 4643 + output_tokens: 173 + output_tokens_details: + reasoning_tokens: 23 + total_tokens: 16341 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one to finish before starting the other: (1) search the web for the + exact query "latest vLLM release notes", and (2) call gitmcp_tiktoken__search_tiktoken_documentation + with {"query":"encoding"}. Do not call any other tool.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0c8c5523509b5def006a8fda28093887d084b33cf16a64e7b9 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812411 + created_at: 1787812399 + error: null + frequency_penalty: 0.0 + id: resp_0c8c5523509b5def006a8fda2eec6087d089091d42bae62c77 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9o7lK_MwC93x3ZRvQlHzkJyyzBs-wvcPq56Q4dSHPIHnX20JcWzFluuwoPpMG6hrZ6yorQMSjIIScxWUgvZosMs7snW7ixhHWdgBbZS6K3m4iiNyj8jLzZGJPEAyaf4ddBXzS9coUGop8pgi51Ziqop4VLxDa6WdeCCwFQ1mm3r-JOUcIPeuUba8zRAIYSYIHILqv-kdvXNRxF2qtz58rzGdLOhSbwklnewPw_lja_ysbP6tR-9x_s_7Dxcsb7xIf4kqu-LrFaCrQ9L6ROdxTg0PqbVOqOOXcrZXSJ5707YYteUAYXhPF1q81LDhlJYUhoPR0y4FhIrIAdGLGxp-k4XTD0RVT5orLlF0-tuwrX9pZ4a2y0sMCAU3NHaHOq9u4DZPm8nudOsdbR3jjqgnjNHehefSEDZjp5XJbnQCf-NXXgZ4Qknqh-lZbBjFvxJGE-PVibEDR_RdEV7fv1fCqeiiYz5Kr6SfsCa0Srb51kZxLWQJ6whompfju_U38J14T-WWlsARyNjslYZC9ZIURJww5U1KjEyZeKxY0RmlOrXUWFfEvgOf2GkeVrcPhgiR4SxTfYj1Wr8rIDMcactvghJiXHoLn_UFucdffysunB1d4fGh9jLOh5skB_RqlHe4jBsLPeqxQH2cS_2qwcymWv5NhGq0ar2zq7PVUu9zuuvZbuLxAzWAnF6gDbHt1axVLroZJIIgcZ4lOT4gq2tpVKPjwt-AfgZgoh9A00Zi0FTa4MUg1v40YkHWB8irUgs_aOkgEIIzoyJlhGTQnzCK6KbrlUbvIK3tCY3FSura19s0n7iICJ5138xsPqZJAHPUpTmPLsMswCIWzbJLfHqMEj_gUpOFXvygRoB6xHR-MRFv6NA4CQF9I7UBRkHO6PEEMJStcJRc6mQ24KJ2wp84s0n4FjqgFa-LQ5nVMWCHOqN484DBsqB6UqiP5Fp7n4kS8HZ39Z_l7VGsHKF0DS0d3WxI3k8cfbkLKXk76AuFluSQA8Tt8FWt2Ks4yGhLkWmuMr1cNhgSBixy7NyODbj9Fo6jSoGgq5Qc58xtbmj_GuDF3ErkVhHuhwGoyVz-caPW69M8kvuZw5_VgXUhrdiv-zRKB_vSNNNitwWkd70R3kBS1aKK8O-boRu0pjQUHzs1Sp3o5peb2K-_w4i-VxeOXPobRF8lhgwqJwG9F1Ff4xnKFMOTUjhn5o-_cxcLFDDwohYA6xw3ErpI4o0KJoF1h8c-Ra643Xv9507MAuOgWb3Eg86UqwGlLFjDccKaS6BcJVbvfaBp3QmThc_2DAuEpVhKPq7oJNJKFjaiM0F8Xe1470= + id: rs_0c8c5523509b5def006a8fda308ea887d09286d6f951e9e986 + summary: [] + type: reasoning + - action: + queries: + - latest vLLM release notes + query: latest vLLM release notes + type: search + id: ws_0c8c5523509b5def006a8fda30fe9887d0821f4ea6d86a7acc + status: completed + type: web_search_call + - approval_request_id: null + arguments: '{"query":"encoding"}' + error: null + id: mcp_0c8c5523509b5def006a8fda35470487d0a9f467e7eae26a7f + name: search_tiktoken_documentation + output: "### Search Results for: \"encoding\"\n\nNo relevant documentation\ + \ found for your query. It's either being indexed or the search query did\ + \ not match any documentation.\n\nAs a fallback, this is the documentation\ + \ for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding)\ + \ tokeniser for use with\nOpenAI's models.\n\n```python\nimport tiktoken\n\ + enc = tiktoken.get_encoding(\"o200k_base\")\nassert enc.decode(enc.encode(\"\ + hello world\")) == \"hello world\"\n\n# To get the tokeniser corresponding\ + \ to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"\ + gpt-4o\")\n```\n\nThe open source version of `tiktoken` can be installed\ + \ from [PyPI](https://pypi.org/project/tiktoken):\n```\npip install tiktoken\n\ + ```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample\ + \ code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\ + \n\n## Performance\n\n`tiktoken` is between 3-6x faster than a comparable\ + \ open source tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\ + \nPerformance measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast`\ + \ from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\ + \n\n## Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\ + \nIf you work at OpenAI, make sure to check the internal documentation or\ + \ feel free to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage\ + \ models don't see text like you and I, instead they see a sequence of numbers\ + \ (known as tokens).\nByte pair encoding (BPE) is a way of converting text\ + \ into tokens. It has a couple desirable\nproperties:\n1) It's reversible\ + \ and lossless, so you can convert tokens back into the original text\n\ + 2) It works on arbitrary text, even text that is not in the tokeniser's\ + \ training data\n3) It compresses the text: the token sequence is shorter\ + \ than the bytes corresponding to the\n original text. On average, in\ + \ practice, each token corresponds to about 4 bytes.\n4) It attempts to\ + \ let the model see common subwords. For instance, \"ing\" is a common subword\ + \ in\n English, so BPE encodings will often split \"encoding\" into tokens\ + \ like \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"\ + ). Because the model will then see the \"ing\" token again and\n again\ + \ in different contexts, it helps models generalise and better understand\ + \ grammar.\n\n`tiktoken` contains an educational submodule that is friendlier\ + \ if you want to learn more about\nthe details of BPE, including code that\ + \ helps visualise the BPE procedure:\n```python\nfrom tiktoken._educational\ + \ import *\n\n# Train a BPE tokeniser on a small amount of text\nenc = train_simple_encoding()\n\ + \n# Visualise how the GPT-4 encoder encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"\ + cl100k_base\")\nenc.encode(\"hello world aaaaaaaaaaaa\")\n```\n\n\n## Extending\ + \ tiktoken\n\nYou may wish to extend `tiktoken` to support new encodings.\ + \ There are two ways to do this.\n\n\n**Create your `Encoding` object exactly\ + \ the way you want and simply pass it around.**\n\n```python\ncl100k_base\ + \ = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the\ + \ arguments directly instead of accessing private attributes\n# See openai_public.py\ + \ for examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n\ + \ # If you're changing the set of special tokens, make sure to use a\ + \ different name\n # It should be clear from the name what behaviour\ + \ to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n\ + \ mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n\ + \ **cl100k_base._special_tokens,\n \"<|im_start|>\": 100264,\n\ + \ \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext`\ + \ plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\ + \nThis is only useful if you need `tiktoken.get_encoding` to find your encoding,\ + \ otherwise prefer\noption 1.\n\nTo do this, you'll need to create a namespace\ + \ package under `tiktoken_ext`.\n\nLayout your project like this, making\ + \ sure to omit the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n\ + ├── tiktoken_ext\n│   └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py`\ + \ should be a module that contains a variable named `ENCODING_CONSTRUCTORS`.\n\ + This is a dictionary from an encoding name to a function that takes no arguments\ + \ and returns\narguments that can be passed to `tiktoken.Encoding` to construct\ + \ that encoding. For an example, see\n`tiktoken_ext/openai_public.py`. For\ + \ precise details, see `tiktoken/registry.py`.\n\nYour `setup.py` should\ + \ look something like this:\n```python\nfrom setuptools import setup, find_namespace_packages\n\ + \nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=['tiktoken_ext*']),\n\ + \ install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen simply `pip\ + \ install ./my_tiktoken_extension` and you should be able to use your\n\ + custom encodings! Make sure **not** to use an editable install.\n\n\n\n\ + If you'd like to retry the search, try changing the query to increase the\ + \ likelihood of a match." + server_label: gitmcp_tiktoken + status: completed + type: mcp_call + - content: [] + encrypted_content: gAAAAABqj9o7s4Fda2S8xdQtY7T0zzBrvCzBocaxrI16sY0o2BogOMynSQ6_gGiipcFuop__GdqjXOwxQGaeN_oQxKdDiWZzfadh6f24ea0sjQfy9y7HiLXYZyczpjvk9OLbq89TtFy65wYw3568z0EcJm0tp77Obr0gLKjRb6DXLDHDXGxzzR__SoEtilfcW5s831zYuyCQyZhJ_IR9TpgVULlo_QOKVQ2bxMLW3E5BIYBIuSe4VLO_K24SPzSWAfckO6LSTW8BeECKET_Xk4FEVkwxQBqidQly3IPZ3-gLXrsxe46o3XqLghg-3_wFXv8NMrMZu_dkqqwH7gDMSEP17AYZkHYMO41LYja_ACCJiwJmFtGOiUZY1PUYXWTkwDgxgz5FvM6QrJtiKabvByYLVI9TJSPUFPPoTVGwMuqoVeZ_N4l8WNVGlQDTyfEPQhzSaQGgY2jYudH3vwiJmCTAAdtT3ad2Q1wHXBW9F7IcSca9UzzPgyjbo136oj7i5OhjbwLPxIGdJmiJdapQTmAkqcfAZlyIhuVDZAvDGlqIMo5RV80VaIp_dVdEKHQB2oVC2fiAYiANslwWuQq8fqYQ0gGLWPel2586cZE_1gkTks8TXuMcFKy6UYF8z6r6RARK9M446-xYhpAP3qzt7NDwvwUmftIef3r0dHs84Qfmn7ehaiOCPEKABNShpZ1Qk1IbmRKMFuHzXzXuhanHhyGXhf4xBnK4Cyg3Y7krSw941C1rrzVZ5jfetN5uXF1GcG-9jB4M1o2vCCdP3GR5mPxXVaJKJ-pCqRufYfy34L2ViMuSBuEYgP1f2gWlD6fP7S2taHkWLOLaoDbU1JTeNMUO5jY2u5bmZf1XTIk-xsB_HFHAAP_S1Y61yeDkFKAIG3vCfQ5Z9ybF-6yO1vqWA0XkCzukycJSXjuETEqAa06i5OI8AmFjc5fikIUjeLwWN63cfS253rUKponkNtiQuQY2nF76R_wrZTgImQuzJlAC8V4dYdyq-1cJDyuuWtWKPf9dJCHV4kh5T6wTlKXxvlJsOoVd5bvQD5P5BJHfjT9Dmb7_x5z8ami7fZ3DO_1FgZ1rHweeYZo3O_pJA72ilqGUHessrBL__jNTGNrTbKb6qe_Lmiq06Ez_E0Pjt_IHpeMjiCON3axc3X9H6fw-V6g3Zacpj55JM1AYajJBpuzWdGmoNNVyfiO4XgJflZtZPMtsxkZ6YXOOgRmKJM2qfg2okQpouctZuNst0W5zyASHmUPi6wVn-a3Uv-gV0Gj3BPHMgmyJz61p-c4EZsUmba7uKTI29pVjM6pnxspDXvbRKvLB2w4q2cmtr_zsQrnwYJb50WeWw1l5TsffqiPkJD0KDr4Jr35YY-dr0Bnm4wGvtq9APtLBe21H75Gx2QfMqXLv3DUUAk22VPDrEsYBGoZ73POsPQTSFWR9UuAiXAz9NUhim8QGGXc9l0CCJbTCYp_qLoNaLRSU5KY8jTsJ-O2eDICAhATZg-ubb9y9vQ8Rx7FbPIHnA91yuGPNVUAQT5TkdvLqrnK2PLEGIZ61gGM_6-op6QnptkVhwTIaWPHjBnWG3rCv_GlDb9IzBN56IQhAaic0jkvnvxmeBhP9sKYY5plebObt0V-9OzzNYO45L9qih0dIZyrQlZeJMCwd3DgRRgVgn_NgWefGdRXc9nAq5npmD-vBcb1FLC4M1hIP3ntq7A50WSGuS73_IMafRta4owL5OEFjU-8sMwX9kc-Q5TsdhEftVOnmOo7k8x1_HTLt-vKpftI= + id: rs_0c8c5523509b5def006a8fda389b8c87d0a3f5a107033ec2bd + summary: [] + type: reasoning + - content: + - annotations: + - end_index: 250 + start_index: 148 + title: Releases · vllm-project/vllm · GitHub + type: url_citation + url: https://github.com/vllm-project/vllm/releases?specificity=1775725493&utm_source=openai + logprobs: [] + text: '- **Web search:** Results point to vLLM **v0.28.0** as the latest + listed release, though some indexed GitHub snippets still display older + versions. ([github.com](https://github.com/vllm-project/vllm/releases?specificity=1775725493&utm_source=openai)) + + - **tiktoken documentation:** No direct match for “encoding” was found, + but the fallback documentation covers loading, using, extending, and registering + `tiktoken.Encoding` objects.' + type: output_text + id: msg_0c8c5523509b5def006a8fda39bba487d0b68c699a2ed81177 + phase: final_answer + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_0c8c5523509b5def006a8fda28093887d084b33cf16a64e7b9 + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 1 + tools: + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - allowed_tools: + - search_tiktoken_documentation + headers: null + require_approval: never + server_description: null + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 21860 + input_tokens_details: + cache_write_tokens: 2833 + cached_tokens: 13440 + output_tokens: 294 + output_tokens_details: + reasoning_tokens: 164 + total_tokens: 22154 + user: null + headers: + content-type: application/json + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-streaming.yaml new file mode 100644 index 00000000..c76e2d73 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-builtin-only-openai-reference-gpt-5.6-streaming.yaml @@ -0,0 +1,1495 @@ +turns: +- filename: t1 + request: + body: + input: 'Do two separate web_search calls in parallel, in this single turn -- + do not wait for one to finish before starting the other. The first web_search + call must batch two exact queries together: "potato nutrition facts" and "tomato + nutrition facts". The second web_search call must batch two different exact + queries together: "cucumber nutrition facts" and "carrot nutrition facts". + Issue both calls now, then summarize each of the four results in one sentence.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e","object":"response","created_at":1787812312,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e","object":"response","created_at":1787812312,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"mcpl_0a27985aff3f65e0006a8fd9d8928487d084b3df172cf4e78a","type":"mcp_list_tools","server_label":"gitmcp_tiktoken","tools":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.mcp_list_tools.in_progress + + ' + - 'data: {"type":"response.mcp_list_tools.in_progress","item_id":"mcpl_0a27985aff3f65e0006a8fd9d8928487d084b3df172cf4e78a","output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.mcp_list_tools.completed + + ' + - 'data: {"type":"response.mcp_list_tools.completed","item_id":"mcpl_0a27985aff3f65e0006a8fd9d8928487d084b3df172cf4e78a","output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"mcpl_0a27985aff3f65e0006a8fd9d8928487d084b3df172cf4e78a","type":"mcp_list_tools","server_label":"gitmcp_tiktoken","tools":[{"annotations":{"read_only":false},"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","input_schema":{"type":"object","properties":{"query":{"type":"string","description":"The + search query to find relevant documentation"}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"name":"search_tiktoken_documentation"}]},"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0a27985aff3f65e0006a8fd9da79b487d0a088eb694655614a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9natUg3fdr2cz7hcCFEVpQ3fXHVg_S4-s9ja7QFp4n5QNAKfg1_aqWZQ1xMHQ_gnnrcAx6NfMlvR8KRLnxV44Rht2JPiSLSwEnngye5NGt5PgVZ1l_GdK9Y7rx-oSGZVXulGg-eVl3M4y28Jd6JR0BW4OCbD31ntn0hslPqXDeuK55qjFQ_A-BAeA9yEgnC6HKPg7f9hz_pUV6WI8X6A9xHBWeL1MU4jhxjg5Iu-iNCkEBUPRVJVstbGNGZRRFSX8e8a_FrhUpMGubmnRwBWnCF8WV4Rte7A7SSBg8aodknEdFTRaAXJ60sLxBGnAD4YPiqxdc9kKMZ2M_vAiTmy3n__PMbz24bLDM-McgFgx49T3zJ6Q6ZVGnmsVT5hibEmPWnlS9Rfe7ti3a0VBJ_C6X9fsHpEcnrkyl1fizMWa8oipRaQSO-vtzXGzITTZWVXzrwSzKXpAt_G8XreT0KgSbd0eGhML_z6YFi5QiD3OelXU-qKtlgpmKCTPrKAmWAA29Kp_ruVmBltq0N3sZvQGuDsMA05uqGbIz0auJoY9M1l6R8ITOtcc5yCTAa9WC-jzCmAHDqVOdDQOU2gvhTmpBE-hiSXk_egUIDL9Xh4m5xJrS8BgpV-Pf_Sli1S5NKHMsumXo8FJzxzbVfcDxw05TrBxNNhkK1_wdqwzyL3zM7URSjtLIRozfoZuO-SHsdxDPQKP7xCzSS0GSzAPM0R9ctA7Tx0-U-PngGxuZ8WuY-On9qAXTxQpgfNUyzaCYiPosEDT46-737l-aHYDmnnBDZ5SFDdddYm4_SPagXHa2S3YKmH-e6WfuL21q8icDJI0oG8Bz4Zl_zMOb88rigjYOLXtHrPeu5F-9KPJQClOQapj4G-B-veYb7S8Nqzit1w75xk4wpg5uxF-6uSEyhoj29YBtvKEGhb8C0eZtUXLfqAZM87_3l2K88GpWnD1oiE_8I8wN3bnF7SKq56a7lAZV2qLZe28B6AYWOqOsOfLlJ2tSvG5GdG6luCPmQ4q-gewTz4wT5zm4GAoR4kHSldY5V-Sfain7b6sibEFyDPj5SJRg01quS19mqS_XcVi1LeVZx2TyJbOT74eCVCYbyx1PLokX5Z5XWwnYGayWD686iztUYJxwadR4bqatYNzkkHy0Tx9aqQppUIEEK61A-WkMisQ==","summary":[]},"output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0a27985aff3f65e0006a8fd9da79b487d0a088eb694655614a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9naqbhuM_jcMAd8KrOCpeIj_i6MEssjbsPEkCj8l1ZSjfBDBZkL8akQiTM1LbPIwNCkzqCfzkRy5y6rvKi0JloPWe8enJABBBKFInpiS3vH7WH5eZvCBgAaOfhedzszgE45ppgwRoy9BOOwr-nR6-CA-QsD_zEeN1gJl6-uiidmJtQ0jIetLTJKPVetpbNqTxUtm-WYUq9txUZ24lg_VdCUK-qJQfMJLnJv9sxj00oX0sw-RCDIvy__REMfRbAdOo4gfiZ0flZ7yieE9_skp2KjXynQYFVWQhlJy-SU5yjAmABhURC5IhJVVU5wzXWiCOrzv3ELcc2r0dEpW_8bpSXjJTAaqLkzsf47iiJywFIcnEqOhKnStuOxGBBjqNScjwPtsKz13M2UTYkSWuzHY-WvBoZQKUTSEfNjH0jqC1a9XOI140XRGYmlKl-QEmPiOZndk9GcDRIwgb7BXYTAquYaN2tpHwXWADrBCPsYC3Kmivr3l0VS_mwxKPBLzxBSnEwwsGr1WPpjyqwnFERRlLhtw9KyaSTyLSf25mpifpWjFbJNC2fmFWAezrzTKbZUP4Z0ZU9UFvy1p-Lnr1pi0tjNm1ge6NsDvvv6U0duflNH-ctUOVFUReFqBtl1G38vohI-D00vNkczu76ZWZ4sXoaciaUR-wn1WSMMee_0iX8HL07QN8cG8skj4ZGTsPPk2bNauUkOy1NRSX1Fbdc_6EEWP1FcNEfFgHzi0GM9527WYfwE3AMy52u1Mxg4W13qtWIEewRYeLmrbbB6u2Zaxu_bGtG1ASy-a1IHgFLoa6wMhx-cxgIziE27A_MQF3VOO1jtTbU9YfoNJPIpYzDd2TPnv8wojZQPShcwxKC8CMWAcKjHIbTXc8WcX5ZqhmBkeLJKNuK0qDyMYhnpksZkkYaa1e6WF_VslVLcFlTzIwN3KYEgxSYGmoK3jOBZFXxU-Qz5BYWo_We0dNYQd-vCpXf8-qXjetEHSepOmLpjDaxWJQ2Jq70_bkW1-yEzfU5ccMuRLn_5duAOPMOsxgqnduobdoyPTy6cUe8qdHGzsd3tykqyNsTZhkLJFWsuDpatXyGXglXQ8i0W9AdF_WhCHIwdveVx_lxmbQQ_k7KOGe511QTmOjFyAz6ybUb886fTgW1KJbLGkl_auib9eFaha0hZERWeq7khXGVpESsC6CkBSF3bjMUVoVzvf3TyZzIoeiHgBzZN7xcnnFRny6mBKGIQIoePFmOj3E0-lpDgjLu0wyv88JF175YFsx6r2jbgVotELFdopO3NsykroFMLZoDgniDqvD705vw50MUneLfPvzVEQI0cphpEY41cc9W6MUcYBfpF5JKPvY22Cnu7BaIdHUvmFzCZT4EcmAhBCss8IBOvI6CnfczfDOTMlHmGPqC2LQDFq0MVG8KUzCoeuFKzQg==","summary":[]},"output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"ws_0a27985aff3f65e0006a8fd9dadc5487d0b0c77d5081a62a36","type":"web_search_call","status":"in_progress"},"output_index":2,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_0a27985aff3f65e0006a8fd9dadc5487d0b0c77d5081a62a36","output_index":2,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","item_id":"ws_0a27985aff3f65e0006a8fd9dadc5487d0b0c77d5081a62a36","output_index":2,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","item_id":"ws_0a27985aff3f65e0006a8fd9dadc5487d0b0c77d5081a62a36","output_index":2,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"ws_0a27985aff3f65e0006a8fd9dadc5487d0b0c77d5081a62a36","type":"web_search_call","status":"completed","action":{"type":"search","queries":["potato + nutrition facts","tomato nutrition facts"],"query":"potato nutrition facts"}},"output_index":2,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"ws_0a27985aff3f65e0006a8fd9de6ba087d0ac24eb6a801f8dd3","type":"web_search_call","status":"in_progress"},"output_index":3,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_0a27985aff3f65e0006a8fd9de6ba087d0ac24eb6a801f8dd3","output_index":3,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","item_id":"ws_0a27985aff3f65e0006a8fd9de6ba087d0ac24eb6a801f8dd3","output_index":3,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","item_id":"ws_0a27985aff3f65e0006a8fd9de6ba087d0ac24eb6a801f8dd3","output_index":3,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"ws_0a27985aff3f65e0006a8fd9de6ba087d0ac24eb6a801f8dd3","type":"web_search_call","status":"completed","action":{"type":"search","queries":["cucumber + nutrition facts","carrot nutrition facts"],"query":"cucumber nutrition facts"}},"output_index":3,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0a27985aff3f65e0006a8fd9e5062c87d0a95e6cd6fc367181","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nllMG2EnzOUSi7w-iCOEekcc9IodD7xX_fKCLIg3BEgkPMEc-XkjLgTo7NHv8Ye71PeThcvB-HSKDaw_tkGRh5whuX9RRYDV33K2Bn4uGU7XwHrLRALdUf-oWcPZv7xSTh7Jd0Il0UaUZOiE8v7iUykuev26vNFkMuXJKaAVfa_ICFJZkZ4e_OxtMQAsknTGriobL6oBx41TRWNCz_fhthg6s1YIpbXIe_z8G_-PqYfOQYW1-tAesrH-vsgTZdD6eq40x2GaW7dI0Mtq_yJD8G35KJFdyZl9uSpyepIeFhXjDqSGA015HwM9Hqq3nwpr7PwZWA_NQN13xj6Pyd29HO_dkLAfu8xLL15eDoALLoCtLa8T4QKpI3i0yxROdXQazvioPvesr-m8mOk2XJKFQu89Z1aeRcfzHHBArP98BooWpo1oSsRqbiCRsLbLximQMqxhfzzIi2LjePHnfDv_6aG2LAIj-kq82F251J_GV7Dz1S_ht0JoqyZTolnTJwVTjZApo_XXo0kJ0zM6MrDvpqy4Pi8Dx_0J8lYcNXPZS_3dngvwwBjwk72bBBj_RiEQJCDTRc8p9IvNrA00XGOJGaCo4dd1PpRZm-wiAXKJqtNt4iaZUV9FBvEW94sBczEB_2PpRTCZ2xG2adBCMLWXy0XhnqAbqjKSCydVjc3kN4fCi-s-k43AQTWTr147IqK1w6hsxLiz-oEZ25lT6rTlCo9gznwJ67njFQar_i4jPf72Auihi3s7_wqid9kBtLG1wUfLSEi5haZ0FyGfGwe71q6a-K2VNtCEPd9oZd4vU2idX0zs4-htn7-LLoy_ZwnRPbyJXzIL4S1_rGue18n-cjCilj7IERnuiqbTCcpNknTn0_9GfJNsaubfPUSbWVYu_Fk77yb9X7KnwNsG1yjoP-yuX3hZ0Sc9LKRd2yy0JducxunrrzXFGPVw8J90munImtlQVGHzQMZhMEdcBGp8CM_c5Gs3HvgO1Wf8u7wXXtPwWYHapmQ5hW_DjUbUx3l4ZNbMgWeQLCKMRfwuGFWuRDVUFOOzMnLIzKiTdcgHlOmDiVAPwglEkRCQBQeF7eEkBD2DbFJmsfpeYESJ7o27k3JYwCSjdY8aIw6gavdkROgbchzQmpIOR29TeH6_uyyf40ACR93FP7aM9xra-84Fr24w==","summary":[]},"output_index":4,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0a27985aff3f65e0006a8fd9e5062c87d0a95e6cd6fc367181","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nnbRo1lA5An69khsLoHBUpXO2HPbgDfQa6sG912GhBPRj4VFCbMXJM3Dl1WnGqz6lIHHRO9-u74ZxHJDgqLJ3g2QOczD8VSY0s7QSGdWTuMjTnnMydFMOUTdgn_1c5JbV6ls5wN69HI7NMLO6flMqCwOqR5ryBrzHE4uOyVdMLEz9K6DtjPhE60XUCC-HxffRHLyTXah5nS62yOCxq7Ah6NY-RZ8VA1BmkjMoJ8MLf90wU3n1exL-aiyIL9_gcDWOPR6M4GH3fGL1dP4iudGDETpAO9192mLs1fT5f7qrocyJP6-MqY5tD2QFzO0Xf9prkF7yJbJmJhrf9LzT-MAX5uHTejA1DaPbw4OexEDwap3rXmscFdL7OAwrU-b0DOEja92mbIZcDmymhwlXwOZhkypGDW50TaTIxJQb_NGQwRR_f1yRWw1ECCBNNgn2q9D5G3zac4YrgSpLE_qUECrHJjCa3YhBQisjFbAmWET2bSHaxP9wfpNNhGbPB4zZYT5NVZfBFlSG3oM55nq3OXKm7dV92NW1xFRXGHXzlkaKm52EqWISqJy2oHIEv-KGkO6bgauDi004NxX7V0ZlWW_b6qFdndDMGyKOq2peSXisd0PZVSKRM8mGtzK9dG1YLf1BjCc_9lEkL7y-XSGNG0544JQo2fNy1DtC_rdAfPnpJzGViu5I8ivM3Jjla0T5uIrwGI4btL_Sd51gLiZDIi3dmFuobsbJnGUmQlllmuIRnUZvFwn4zfrWdMw0hmqxadYbuvQ92CW6_yKjLdz_Sq9roK39QCEMxuAUpgWYvnHV12UVrsZ-TzCaksDVABxkGsEa_2RR86LwX5_AI-BdAwhVpoKITSYI1uYbRBXMP8jFyswnZAE3M8oTg8-VOcIV_2MLny4I8RyqoruV4ZS4MQkCAlxA8ppxdeLmSk7mnFkqWpeCKop-4wlypaEOS8BW_sC6jHW7OEzuZAkAgZf-1queRgyujmj4dq8-ukUDun3CZnjEdxJjftUEpibOEy3rmYo60PBeyTyUr1_fnFezz-lqmJeTp8WEg8bREnQAgetJiuYz8XFz5KthxiGJQG4mxV9tT6FWINIYQHlHFS7akIL4_j8THwrr1b810GHRCTIxIvE4PKC-mS-q35O0I0ts9vIKPvA94CI5nZEwZuMVYQmSEPzL1fLqQVBfd6ADjvCLDjdx_mgTa6TAAXx2-CbYDLqOMyLtOa1MlZmuLMclMulQeu6Usj6kpH4rbOauvz2ls6hXtyUH4lrz8OXjOMQIbudTip62PcAp2VOGvD-8InWqlJ_OFTcZ8-aPqmd5oLWkBBkMDiSYTdIUG48vluuo0MZ686Hzuddlb3UMUaBL6ctMT16FcLvjxRyjbjhcoZ7IujyyXMeVW-VNrW6rH9qDHXbAdnGO0zgQjVm-zhYtLIoIa-k990x_n5GDyQQOSyjnIQc4EHitQegloso8UDZqowARWIeTz6PqG3E18TMOPA7pssTUnRKy6qEk4hNP0V17o21qof3h1Ug5ndjO0_xiQnKQhl0j_pUWOW4IdTskHusZTr4I8yAbf7H1mt3MkVaWH1ozY04yZxwpuDqTMV1Ixfhk1YG84EwNhgxVKuJZtInDMDYEbiP_qTZocGkTPYLv-7LhxFdZ1BMEQcWKG1QNkAIwb1BU-trhYOBYh2VrehNcz6Q==","summary":[]},"output_index":4,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":5,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","output_index":5,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"- **Potato:** + A 100-gram boiled potato with skin provides about 87 calories, 20 grams of carbohydrates, + 2 grams each of fiber and protein, and negligible fat. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Potato?utm_source=openai))\n- + **Tomato:** One medium tomato contains roughly 22 calories, 4.8 grams of carbohydrates, + 1.1 grams of protein, and 0.2 grams of fat. ([foodindexhq.com](https://foodindexhq.com/food/tomato?utm_source=openai))\n- + **Cucumber:** One large raw cucumber with peel is about 95% water and provides + approximately 1.5 grams of fiber and 6 milligrams of sodium. ([uhhospitals.org](https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai))\n- + **Carrot:** One medium raw carrot contains about 25 calories, 6 grams of carbohydrates, + 1.5 grams of fiber, 0.5 grams of protein, and no fat. ([cdn.agclassroom.org](https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai))","item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","logprobs":[],"obfuscation":"GVnLiiEwfPrGY","output_index":5,"sequence_number":22} + + ' + - ' + + ' + - 'event: response.output_text.annotation.added + + ' + - 'data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":235,"start_index":159,"title":"Potato","url":"https://en.wikipedia.org/wiki/Potato?utm_source=openai"},"annotation_index":0,"content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","output_index":5,"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_text.annotation.added + + ' + - 'data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":444,"start_index":370,"title":"Tomato + Nutrition Facts | Food Index","url":"https://foodindexhq.com/food/tomato?utm_source=openai"},"annotation_index":1,"content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","output_index":5,"sequence_number":24} + + ' + - ' + + ' + - 'event: response.output_text.annotation.added + + ' + - 'data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":765,"start_index":587,"title":"Cucumber, + with peel, raw, 1 cucumber (8-1/4\") | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai"},"annotation_index":2,"content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","output_index":5,"sequence_number":25} + + ' + - ' + + ' + - 'event: response.output_text.annotation.added + + ' + - 'data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":1027,"start_index":910,"title":"Carrot + Nutrition Facts","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai"},"annotation_index":3,"content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","output_index":5,"sequence_number":26} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","logprobs":[],"output_index":5,"sequence_number":27,"text":"- + **Potato:** A 100-gram boiled potato with skin provides about 87 calories, 20 + grams of carbohydrates, 2 grams each of fiber and protein, and negligible fat. + ([en.wikipedia.org](https://en.wikipedia.org/wiki/Potato?utm_source=openai))\n- + **Tomato:** One medium tomato contains roughly 22 calories, 4.8 grams of carbohydrates, + 1.1 grams of protein, and 0.2 grams of fat. ([foodindexhq.com](https://foodindexhq.com/food/tomato?utm_source=openai))\n- + **Cucumber:** One large raw cucumber with peel is about 95% water and provides + approximately 1.5 grams of fiber and 6 milligrams of sodium. ([uhhospitals.org](https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai))\n- + **Carrot:** One medium raw carrot contains about 25 calories, 6 grams of carbohydrates, + 1.5 grams of fiber, 0.5 grams of protein, and no fat. ([cdn.agclassroom.org](https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai))"} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","output_index":5,"part":{"type":"output_text","annotations":[{"type":"url_citation","end_index":235,"start_index":159,"title":"Potato","url":"https://en.wikipedia.org/wiki/Potato?utm_source=openai"},{"type":"url_citation","end_index":444,"start_index":370,"title":"Tomato + Nutrition Facts | Food Index","url":"https://foodindexhq.com/food/tomato?utm_source=openai"},{"type":"url_citation","end_index":765,"start_index":587,"title":"Cucumber, + with peel, raw, 1 cucumber (8-1/4\") | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai"},{"type":"url_citation","end_index":1027,"start_index":910,"title":"Carrot + Nutrition Facts","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai"}],"logprobs":[],"text":"- + **Potato:** A 100-gram boiled potato with skin provides about 87 calories, 20 + grams of carbohydrates, 2 grams each of fiber and protein, and negligible fat. + ([en.wikipedia.org](https://en.wikipedia.org/wiki/Potato?utm_source=openai))\n- + **Tomato:** One medium tomato contains roughly 22 calories, 4.8 grams of carbohydrates, + 1.1 grams of protein, and 0.2 grams of fat. ([foodindexhq.com](https://foodindexhq.com/food/tomato?utm_source=openai))\n- + **Cucumber:** One large raw cucumber with peel is about 95% water and provides + approximately 1.5 grams of fiber and 6 milligrams of sodium. ([uhhospitals.org](https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai))\n- + **Carrot:** One medium raw carrot contains about 25 calories, 6 grams of carbohydrates, + 1.5 grams of fiber, 0.5 grams of protein, and no fat. ([cdn.agclassroom.org](https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai))"},"sequence_number":28} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":235,"start_index":159,"title":"Potato","url":"https://en.wikipedia.org/wiki/Potato?utm_source=openai"},{"type":"url_citation","end_index":444,"start_index":370,"title":"Tomato + Nutrition Facts | Food Index","url":"https://foodindexhq.com/food/tomato?utm_source=openai"},{"type":"url_citation","end_index":765,"start_index":587,"title":"Cucumber, + with peel, raw, 1 cucumber (8-1/4\") | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai"},{"type":"url_citation","end_index":1027,"start_index":910,"title":"Carrot + Nutrition Facts","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai"}],"logprobs":[],"text":"- + **Potato:** A 100-gram boiled potato with skin provides about 87 calories, 20 + grams of carbohydrates, 2 grams each of fiber and protein, and negligible fat. + ([en.wikipedia.org](https://en.wikipedia.org/wiki/Potato?utm_source=openai))\n- + **Tomato:** One medium tomato contains roughly 22 calories, 4.8 grams of carbohydrates, + 1.1 grams of protein, and 0.2 grams of fat. ([foodindexhq.com](https://foodindexhq.com/food/tomato?utm_source=openai))\n- + **Cucumber:** One large raw cucumber with peel is about 95% water and provides + approximately 1.5 grams of fiber and 6 milligrams of sodium. ([uhhospitals.org](https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai))\n- + **Carrot:** One medium raw carrot contains about 25 calories, 6 grams of carbohydrates, + 1.5 grams of fiber, 0.5 grams of protein, and no fat. ([cdn.agclassroom.org](https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai))"}],"phase":"final_answer","role":"assistant"},"output_index":5,"sequence_number":29} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e","object":"response","created_at":1787812312,"status":"completed","background":false,"completed_at":1787812327,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"mcpl_0a27985aff3f65e0006a8fd9d8928487d084b3df172cf4e78a","type":"mcp_list_tools","server_label":"gitmcp_tiktoken","tools":[{"annotations":{"read_only":false},"description":"Semantically + search within the fetched documentation from GitHub repository: openai/tiktoken. + Useful for specific queries.","input_schema":{"type":"object","properties":{"query":{"type":"string","description":"The + search query to find relevant documentation"}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"name":"search_tiktoken_documentation"}]},{"id":"rs_0a27985aff3f65e0006a8fd9da79b487d0a088eb694655614a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nnHEfnZGpDYvOlVeRSVkuL7wx4xzFF5QHSDyf2K6UIgmtOk-rb_vH9BSt6N8AjpiSnVoeMsfRAJKnAzlAQGuG1k06cNSUGRZ62jydS_JMRGPlBOghI4-YY6nZ5_F-QghtKIad9F3bnJaFAehNUqJni1FgJGATanr_wB7oaV1WBk7Bk0kYtV81eHF2Qw_vqzvGzfi93mydiq40cwVGJpT13eVv23azq-g7vhxE1GBIYQIsHYnUNC9VRee23u2mp5CirRZ6TmT6JZpBBgAC_LpG7EJO85ffo2aPWnVt9G0HgR3M9mWy4YnXuCbuNXFG7G3GrmIWB1QBj6kCTNo3muCoYJ3oxb_Oc8s8V3P_zTAEefUV64VV-DYxe2K5_F64rqw28JeWBd-kfhnlyaTCDMJ78IIhp36q-m-C1KcfNPkEvh0WIiCCfvbZHF2Tm3iHAMMiK4EaWVV6jTbn9vpwkKJeU5-Z_BfBf0HFjaMgOd5VibGIeOWPNtMBpYDPyynVq7N4KDKCY6yhNiIptlXS-6EQOKDWBqiz4fSMa7Ga7syTsPeiNv_IXu44bbsH9eUfxOqUEuS_J6Om8070Kgksp76tlPQEVS9SPIxfC029-PPE7Hb6aQ2bSKzuyp0-J60yTjEwdeqNklGQQ0KNQM10LRvY3STxq6_QnQzE-TW74m0RaTffvWFAPNDrXPIYPu1emdv9dopqTPS1-4Ex8KQaDXO9y5ZZKwTxXG4g-cCeSG7JkfJJShmQSg4gRVZaROVOm3LelXwBD1atMWteAE83PGc5SiofKw-vgOnrpqNfrxifu2QUGRREGqlPMNzqaszO3hZ8LC9r7fQ2YBEg44MdACBWuJVW1I8Q1K_bxAxlVCpNQJVhYZ6Z39aFldyBBl0wBglKd7wVUmwwl8FRICtZHumvgpDmm3IJAhS46r996TJR173eDRdwE-xCAoY8rLdBEhIR6MPwQJOgvbPUNtpmJDzAS3ha9FUBfoeTcDr-LdBV_asxhI6EbR37Q2JgafHSCvqwLTDbPisb_GS5Mnm0G0MAK3K3LsruwMZQKA11S02ckzTgwuoDZavxPvNbir2HoKYajRYFUDRvZhHYgiq_wj1Bb4B9-nmA5tcG7i3g_h5aM5qG8VfNxhyItCBspqHHyYTocbH9psGPNmk9MrhpIlyKbewRvUGeLFpGcMgW9SqUoH5xmUmziyiUjowom5pb67t2fJLmkf8qvlEAb2UYLni4OhPkk21GdTrOR1SG2OqPZtdXyHJIpHv4PsjuV5_zJFhdHljhUaW-dz5Ue5omgiNf2Qn8mVg69g-pgiD_MsN8Urz4_sco0a6qNFQTj36P-sTdl5PqzzVvjMNTz2C5H-6bB9tZ8DfUs58hZTepkgpz-Zsqxv6wuf5NyKtbDxiK28rVewmOITfk7hvq5UqNBuisdQQ==","summary":[]},{"id":"ws_0a27985aff3f65e0006a8fd9dadc5487d0b0c77d5081a62a36","type":"web_search_call","status":"completed","action":{"type":"search","queries":["potato + nutrition facts","tomato nutrition facts"],"query":"potato nutrition facts"}},{"id":"ws_0a27985aff3f65e0006a8fd9de6ba087d0ac24eb6a801f8dd3","type":"web_search_call","status":"completed","action":{"type":"search","queries":["cucumber + nutrition facts","carrot nutrition facts"],"query":"cucumber nutrition facts"}},{"id":"rs_0a27985aff3f65e0006a8fd9e5062c87d0a95e6cd6fc367181","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nnYGtOEECe2YqzE0hh_8Al0bsislW5-XbmSybdnPpLheFAXxxYJ0ebuuDeZNpVqPMzilI8ibw4r_5LSXpqjMVeVk6ryMXjDDYJfWCPrm4YEGXTstuF6o7IEqdzCOdDxGJWYkwl1s-9UKyu368DcT091RrfC7_8setr3iOxZlqkLUz7ZvRIc66-k6VRqNVg79CyCjYHmxODXbI-HNfOv-r4Q0bg6EtDT5F2a8pPd_9nPuroMwPUAYupbByY8hA4dDWRD8IGMAxrmTnE9EPLjqdkrvljh2ELnDhj2Gkv0fsudQWc7wDR9nWWDOyWYqmTPjl6puf7EkBNnVjQrdaNhXQP63atVOflbHl30_X7BvjOyyFC6nuCygYXEJQMdaqRZvVudlBb5G3gg4cPEQqXK_yAyMqM2d77OpTn4QYWhsIUd0Cs3qf3XMHmP4_iw-ds9_sGZh1zbtF5KD0bFVTpADAza-PcQ4fKp-48ccUKh89qp6rDmo4oUd7yh4ZRFOPKdsSWv7VYr3Sd91uTn_zCBrx7pg6ZHELnK1v8qK_8YdVShzCdM0sBl47OqZ-3bxPUXUqOV2HS3aRFFI_R6zh0Pjui7XZgqEngC2s-mBUe2eDrSSGtWoClccUTGlG7AvaOrAq3rImwBvm5QvSYgurQdFk9ZW3kODzy7MmpfBcB0ufUmPweD2VzO-Zn5gZgyJfKYk69rPbQ7vFLK-ogM-EXbuTPKEIA1EnZcUDsWW2ge2kMVv7QBcarx6ytnwfG2ri4rYjf0brxyF0Zm9WYXIGpFzM-ocguPYfQl6nX8jO6JTHSEafuJkhxoUnMuLBZIZuVYD4hiZQ6WTfszQjT8L_CJ6I1gDE3BAJdwuwBMMh8wIMloxeTDbcttfRmfES7qDK-7lACBeKaFXYIqsq_oPMziCN_N_ofPhtGUR-0ZNFdxgaPwlFZPJXBYp4Vxib5Y9rIcdMHaA36tk-x-Dwf_VQv_NiQSG-JjzXVucABnvs05TKa8lVdFWxFJsyc63fMNjijs3NGlQU-7rDzdP4pbsFw7S7A3vOYJiji_nPFUEiWARlt1cSduMWGZioJvdoAFVJsAHB-j1K8Qrlz1yyEIGd-4WjgU45iFi-snFmqXCOCnS6KaC12ivIJen7f6emn3817Ut2P74Q9LJGWz7zVddqSEuHs0uIHneNZBXQBHbue6GpQmRWRbv0fm_shqyayDrOKgItdiVxkvNfSdSZOSqn8F2E-lJQCOt2FEE6B52HdU9Piu064w-ej6IHq9L4MMf-9VGmF2Gu6S9CN5yhMDh947lYm51ZPi3o1ogL3OgIPA90zMJ9Svr8y4tqlf8NtUqB8lXMmfQ46sZaSKcM7ON_95bJUp2XJG5WjCJi-Hr8z-q12sNhSofHlT4EgaxEFe5tNhMa5brrMzBwuiZIqJiFsd36r-QGmkI3j4Wrf8U5L7qVWdLyc2tqH5PwphipLAAZYM-Pym7e2nIlqP7XgX5GU_E0YU3Ubinyj9ND34yCvoxnIopeo-D2a-vqrnQq-P_qX-EtSoKTsrVIGTD4uDCsoHN49hDT0skz2hKfL2A-WxzyBMvmf-jqwo_Iwt-VHXs_nbqVsPxF9lgyNYt4v7kgsApCYjtCv3Ans64G6VU3ltO5B7AsWgbEzn4D11dR7C3jNqcTrHk4FGC14eDQ09aGpTZ9b8A==","summary":[]},{"id":"msg_0a27985aff3f65e0006a8fd9e73e1c87d0ace2bd4acfffd489","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":235,"start_index":159,"title":"Potato","url":"https://en.wikipedia.org/wiki/Potato?utm_source=openai"},{"type":"url_citation","end_index":444,"start_index":370,"title":"Tomato + Nutrition Facts | Food Index","url":"https://foodindexhq.com/food/tomato?utm_source=openai"},{"type":"url_citation","end_index":765,"start_index":587,"title":"Cucumber, + with peel, raw, 1 cucumber (8-1/4\") | University Hospitals","url":"https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai"},{"type":"url_citation","end_index":1027,"start_index":910,"title":"Carrot + Nutrition Facts","url":"https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai"}],"logprobs":[],"text":"- + **Potato:** A 100-gram boiled potato with skin provides about 87 calories, 20 + grams of carbohydrates, 2 grams each of fiber and protein, and negligible fat. + ([en.wikipedia.org](https://en.wikipedia.org/wiki/Potato?utm_source=openai))\n- + **Tomato:** One medium tomato contains roughly 22 calories, 4.8 grams of carbohydrates, + 1.1 grams of protein, and 0.2 grams of fat. ([foodindexhq.com](https://foodindexhq.com/food/tomato?utm_source=openai))\n- + **Cucumber:** One large raw cucumber with peel is about 95% water and provides + approximately 1.5 grams of fiber and 6 milligrams of sodium. ([uhhospitals.org](https://www.uhhospitals.org/health-information/health-and-wellness-library/article/nutritionfacts-v1/cucumber-with-peel-raw-1-cucumber-8-14?utm_source=openai))\n- + **Carrot:** One medium raw carrot contains about 25 calories, 6 grams of carbohydrates, + 1.5 grams of fiber, 0.5 grams of protein, and no fat. ([cdn.agclassroom.org](https://cdn.agclassroom.org/media/uploads/LP875/Carrot_nutrition_facts.pdf?utm_source=openai))"}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":2}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":13213,"input_tokens_details":{"cache_write_tokens":4643,"cached_tokens":0},"output_tokens":434,"output_tokens_details":{"reasoning_tokens":208},"total_tokens":13647},"user":null,"metadata":{}},"sequence_number":30} + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: 'Call gitmcp_tiktoken__search_tiktoken_documentation in parallel for + two separate exact queries -- do not wait for one to finish before starting + the other: (1) {"query":"encoding"} and (2) {"query":"tokenizer"}. Issue both + calls now in this single turn, then summarize each result in one sentence.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463","object":"response","created_at":1787812328,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463","object":"response","created_at":1787812328,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0a27985aff3f65e0006a8fd9e979ec87d0891742f56f7e8163","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9np1KfA0VhsWBzRMdUd3fnPLcfxLTDBtrIHi4m2vsXeBcrd8dN0phFR0Q4JM3CWL6YIAYk6z94EHWRC2ZrWIFqrCZXHSsmNvIdxfNRQ9eLnMMJ5iD8xXuwllEDqLLrX402PGOG_paWHMw1ggpB1D_TRpPY-VTA5baP3Ag1VzMeWR0mJ1matHW1og5X7MlI_Jp9NsaGzQ-JTx1n6bBU43TrCqi34JwONpDF8z0dR4Jq-O-bZmVMrbePSRb5N9nEl28o58VVH5W25YSnsE7y1LnHKoVnkCRAzc2WhIpryxMt1n5Qz5Sv9ctBHxqtOH7m59vPrn9xeSdxmOIZp5LfHX99CtbSwQpWF4qzI8iKpwZJ4IJRZnE9C9m8QQX9i77eldp3PoB09RqlQw_yLhyCc-liwhlY91aZg42Aj4ja1yxLwd4dpNk92nUdart3GAtNAOGHtb9L8davPNT5REBY3uVYFwx7O8E1n3osKx08hsfowLQb7fjQBGZ2M75xWGFHLJtErgpk5tvAr4jopsvZkPRRyXYdQqrqZTp8gYdpf9yge4dyDfBWVa2V_MmEmu2qqSGLhZ3pnud39HDvHRf2-2Ao0-pcWnQplY4c8gBa5aqWcJYz75_cR9MeE6ZYiGRaoBTRYBBmGBDlad-qt5S-fElzAOUoQtLiOZ0c93bciLcLlFAUUudZSu4aFlUCcynub021mGUMTthvf5ecoNVA4CVJRGOLx4RehujDdOYyEmR-XFbJZnRj9fF86DpaiZkXZmIXULKkHBEb5KBv4ab6AqtlzZblxPXG4di0v37eE0WTWLv8FNlSflth1IFz7yjGP_OLgXVBETbTKd5UAkprJULiv9J2mNv6vT_WqcGtpsFlVi6xRR656JD2kd6WqOYLM4wWzqAB3DHJMhh5Smez7fy3Oyt3YCStmyTCiNTCPd0G9uvm7Gd_3kFQ2kvNeJs2iQ7ma0XjsOwHJOr_OixP-BzbgNbB0rsnElzPikYMIY2Ijndo-mQiPrNi-kv-1s_fZKyVQcELDXPMkIzDy19g53lYRnga_8QHIGMBUWrcroRqWJ_Trph2YN9nnUrLcx_tbUIe7KansfRpp0leFkTKZyfxYVFrqfMBv-d69Kwy5s9vCL8Pv6EB_CxK1RLgxrnUAp_caHH6XeCkUvzO-xiqF8v-KNA==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0a27985aff3f65e0006a8fd9e979ec87d0891742f56f7e8163","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nprJFkVOlIHrYBW7Cyl7SIKQzGqwf6xgXSjVtpZ35jxH_OquUgolfkEibOimeXAPIay92oKW-QGfoQbQON-Ajv9bv2nPUpnsD5t4BG_S1oHy_ZFwPB7v_C4NciPZQhsZ3W7qjS2nyZhpd58LrjVRVBMCNA8VZNhxD8Vh-hF1s4gGanLwyi7bt9TfeHEZw7cTYXspz6LVX4rTUEPujtxLE2m1fGEHJbwVnru3RcO1-Q72H9m5S0teAanT-QENTIRBnt6-Gz7Qu_w8m3wtw_H5X1-FpVAFVXdvmttbOo6rJ86ROLZfqRcou9HgZgZGRh9gBHc5wIvUcJwkqaBWbEgLwxoZR5WvL716ICnJRc6EKMcA6gE74PFrv4-K_CSAHd6km3EXho_qf0bGaMv7UAPQgl-Kfpg0FVX-P--9cBLPyYvB4W6BRmggRV95CeL0iCdRxR6tFyVAYrCUTULIR7vtqKBRztxn5JYi6B2E2rIa3AohVlLqb0renRLxbzx3n5sx0V3OnELGIk8vviYiXScTF4Dep0TImbXdUqyEN5PstLxWYZKvyxTuCGWeoSJaY_gf81R-_m6meTSnc4ujWKsnFSwfty7HsWmh7nqafVsbisluYHUZMWg3rhm2O86lGJCudz7HtgT3GtFd1zlV9QT66j8sanMQWy5BiPFvjzTgMFNJ8NRCPUSyVFQUpsgtFL3IZadijRKxO3JxmQJOLYWAhA5-wxbPb2nCR3iWSs9Lim_EiqhLNQ09mh3kqyaI5fl-r7omcyEyvQTTWtm7Q1La9w1TK26h2KHwmIZ-ca06oG1O-hEQIewU06NRrhpCPLG6HFzoRMkH0QXfCwoGeEV113C9cHL5WDRwGzg-HhwYeRpQUJMz33k1377DzlTpbCstNLndU621RGJPh03yVx1Rg4EBpoK2u3SSYf-2ZYWR6gLlqs9_aQeV-UKWKivi9vZfs5-LESxSqvdwq-2p3GqCRtahCtMSNn6YvAJHKFEmoELFmtDrg_87RB2p52eiYiW4puqnnwY2W1VRrKuVa7IhNZ1IfXHyeb9Rsn82T5C4ZR_RJnXilg4aOZYtCCGdfgVwifiLkNvEL42U2JRUmmjbVyJ1QFgzbrg-v72Y1Ajbhg0TEZlxUVMUxvSVPoBGqpFL-jV0yWx3memKThDS_yKGvz3j06hqkpAaiI1F7K42L3-N4bjHksi24p-l7LXtsvSoNL9txVmdg2gikwdz8XWaSE0g==","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","type":"mcp_call","status":"in_progress","approval_request_id":null,"arguments":"","error":null,"name":"search_tiktoken_documentation","output":null,"server_label":"gitmcp_tiktoken"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.mcp_call.in_progress + + ' + - 'data: {"type":"response.mcp_call.in_progress","item_id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.delta + + ' + - 'data: {"type":"response.mcp_call_arguments.delta","delta":"{\"query\":\"encoding\"}","item_id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","obfuscation":"BUPwMTGCND4j","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.done + + ' + - 'data: {"type":"response.mcp_call_arguments.done","arguments":"{\"query\":\"encoding\"}","item_id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.mcp_call.completed + + ' + - 'data: {"type":"response.mcp_call.completed","item_id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","type":"mcp_call","status":"completed","approval_request_id":null,"arguments":"{\"query\":\"encoding\"}","error":null,"name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken"},"output_index":1,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","type":"mcp_call","status":"in_progress","approval_request_id":null,"arguments":"","error":null,"name":"search_tiktoken_documentation","output":null,"server_label":"gitmcp_tiktoken"},"output_index":2,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.mcp_call.in_progress + + ' + - 'data: {"type":"response.mcp_call.in_progress","item_id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","output_index":2,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.delta + + ' + - 'data: {"type":"response.mcp_call_arguments.delta","delta":"{\"query\":\"tokenizer\"}","item_id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","obfuscation":"WOPeI9YtBPn","output_index":2,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.done + + ' + - 'data: {"type":"response.mcp_call_arguments.done","arguments":"{\"query\":\"tokenizer\"}","item_id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","output_index":2,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.mcp_call.completed + + ' + - 'data: {"type":"response.mcp_call.completed","item_id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","output_index":2,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","type":"mcp_call","status":"completed","approval_request_id":null,"arguments":"{\"query\":\"tokenizer\"}","error":null,"name":"search_tiktoken_documentation","output":"### + Search Results for: \"tokenizer\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken"},"output_index":2,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":3,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"- **“encoding”:** + No exact documentation match was found, but","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"1z4","output_index":3,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the + fallback explains how to","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"UqW","output_index":3,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" retrieve,","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"BwQpEb","output_index":3,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" use, + customize, and register","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"2Ck","output_index":3,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" tiktoken + BPE encodings.\n- **“","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"Bk","output_index":3,"sequence_number":22} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"tokenizer”:** + No exact documentation match was","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"2z","output_index":3,"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" found, + but the fallback describes tiktoken as a fast BPE tokenizer","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"j2oZTb4N9xnvG","output_index":3,"sequence_number":24} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and + shows how","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"DI","output_index":3,"sequence_number":25} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" to select","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"QKiN3N","output_index":3,"sequence_number":26} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" one + by encoding name or OpenAI model.","item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"obfuscation":"S8xqZKY1oV","output_index":3,"sequence_number":27} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","logprobs":[],"output_index":3,"sequence_number":28,"text":"- + **“encoding”:** No exact documentation match was found, but the fallback explains + how to retrieve, use, customize, and register tiktoken BPE encodings.\n- **“tokenizer”:** + No exact documentation match was found, but the fallback describes tiktoken + as a fast BPE tokenizer and shows how to select one by encoding name or OpenAI + model."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **“encoding”:** No exact documentation match was found, but the fallback explains + how to retrieve, use, customize, and register tiktoken BPE encodings.\n- **“tokenizer”:** + No exact documentation match was found, but the fallback describes tiktoken + as a fast BPE tokenizer and shows how to select one by encoding name or OpenAI + model."},"sequence_number":29} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **“encoding”:** No exact documentation match was found, but the fallback explains + how to retrieve, use, customize, and register tiktoken BPE encodings.\n- **“tokenizer”:** + No exact documentation match was found, but the fallback describes tiktoken + as a fast BPE tokenizer and shows how to select one by encoding name or OpenAI + model."}],"phase":"final_answer","role":"assistant"},"output_index":3,"sequence_number":30} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463","object":"response","created_at":1787812328,"status":"completed","background":false,"completed_at":1787812334,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0a27985aff3f65e0006a8fd9e979ec87d0891742f56f7e8163","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nu1IzThfWiz_IQpP_M9KV8THmsHow4kBSuW3mnVdf5gJMncXO7LTuSEEVbLAcDmHRZoZ7GxcMpk4kHEmXisjDRF9xr1zI_KYpG5_hvsP1fm_UhB0Fb_7_cHutsqGiWPgFyrdcPOpg1t5Zx51B5AXlceVNd2eW7YeLDFtf0aC4sd-SNsIr_iQq9W8ZJeR1l3A-MYUq81eZsrY8WfwL5gY7KeNBa5tK0SlgUmyLdJWDydV4hgUrxMDOPV7MYmcnEgVwYlrSLUfttPORwF1yCMKIjfhEUTVo3QvNazfOr1mm5Z4TZlpdH9NCShxnJNWPkAA5iVVjLTn9drV-5qFZ6GWlJXoDN59xkBF-gqbS4q5R630xhQbe0fm88k1KNpbm8XWOMTO7dFsPBAOH9WuzCZj0X5nmidqbj_xkJuNYWgbboqlznYbVWWh8MB_MF-Zc_7z6y8kJzEZ3cPZdZnl-Hr3BMBqTwgTCa4TQ8itmO5s7IrfqGW0rgvesIFAvO4rnefvck6tKEL3wLpKYFvi7qylzf06xWmzGH_TJYldg8r7snuPzsmO6uh5GRdCIJ0P-RubUK35BZhuIrum9EkzPofv_y2NJAq4tFB7xZH_EyhavbgU3brxdbg5wEHRhASA0sC8AajibI-56QwgAd9Pbic-a721hm9NoRGoFUDytbpHxY3Ezm8HP_3pFgvZhVwjXYQHVQPvqu-9_H6PsM6s8elUWGhGPNAXjRFc-UZGKpazif3ATLsrYqChQxOISj5NOLaRYkix4GxL1Gl9mc3sdI-7Yq1dTVbBeSaWCe0MbXdy4QRoDHh0a49WoY32C46xKx-oIaCkW_pNL-0yL4dJqGCWj7tebmNkaDLOtDVoYTTOvcFNPF1RKsVAYJ7p49RwjpbJXlBiioyYh7s4YE0Hatop4DvB-do2jC3oRhhEp2hFywkHeK05UxJSnG40nOqLkgSJbLKKhwgCQ0nA7f9p5iFNcLnFbza3Ks7v08TxYWhTGlyI_CfdgBxSwE_9WT9D3-ueWu_5Oe4kVM_4fHoV9dVMI1uHfEBK8ENm5KeGe2XiKQkrKj4QpKIpnl2MwNiqNHgJIoLQZdbuspCkyDeRDJEZ3d4zYRL2oY6FY3pHOwyfrIorv7vzWzCyMEFTTVXHbhJuLexTCxNqxXaTulUQo6C6kAyUPy5s3X8tKLzbdOlVRhNU1TXEa6O16xPXbpKq-QdZ6o70IZ_Llv0BLZDQUnvH_Q9g==","summary":[]},{"id":"mcp_0a27985aff3f65e0006a8fd9e9d32487d088979015fa7f014d","type":"mcp_call","status":"completed","approval_request_id":null,"arguments":"{\"query\":\"encoding\"}","error":null,"name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken"},{"id":"mcp_0a27985aff3f65e0006a8fd9ec816087d0992d0488406a98c8","type":"mcp_call","status":"completed","approval_request_id":null,"arguments":"{\"query\":\"tokenizer\"}","error":null,"name":"search_tiktoken_documentation","output":"### + Search Results for: \"tokenizer\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken"},{"id":"msg_0a27985aff3f65e0006a8fd9ed3a2087d08632f6974b1fe039","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **“encoding”:** No exact documentation match was found, but the fallback explains + how to retrieve, use, customize, and register tiktoken BPE encodings.\n- **“tokenizer”:** + No exact documentation match was found, but the fallback describes tiktoken + as a fast BPE tokenizer and shows how to select one by encoding name or OpenAI + model."}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0a27985aff3f65e0006a8fd9d8622087d0b16130abf3bf249e","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":16105,"input_tokens_details":{"cache_write_tokens":8746,"cached_tokens":4643},"output_tokens":150,"output_tokens_details":{"reasoning_tokens":11},"total_tokens":16255},"user":null,"metadata":{}},"sequence_number":31} + + ' + - ' + + ' + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one to finish before starting the other: (1) search the web for the + exact query "latest vLLM release notes", and (2) call gitmcp_tiktoken__search_tiktoken_documentation + with {"query":"encoding"}. Do not call any other tool.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - allowed_tools: + - search_tiktoken_documentation + require_approval: never + server_label: gitmcp_tiktoken + server_url: https://gitmcp.io/openai/tiktoken + type: mcp + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0a27985aff3f65e0006a8fd9eebfec87d094c79c9ee6f467ad","object":"response","created_at":1787812334,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0a27985aff3f65e0006a8fd9eebfec87d094c79c9ee6f467ad","object":"response","created_at":1787812334,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0a27985aff3f65e0006a8fd9f0457487d087574d04f8d4fa37","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nwuHtIi5j6gby8agybKNb-mPXwi-tWE1RV8JtRWdBh0A0yvCtzQLG2LkJaiwcGIrX-0XP7MBKDknHP9vIEgorWE0JnSen_RPV7HaDl53ejd5CsbrWHJ4n2Dz6UJNfCWqhJJmUcqonIx9E7fJauzDhJGXvsOeAbfsHjGwRGJ4xejI-e0k18_43u54HiKrpQA7NqTCr77mQ9U1r4jjDzcq_Zd5mGjd92QSzBhD7eMcTwUU4bzDgqQxpuWcW9H4bABXGnonil82bEdqj9B1-J8wIx20oeqf7adCE_dKdQIYpo_ug7EhLyvJu_3jAeqe5N-sk44YVeoN_nwR1P1LVMvJRV-HTl1btwED7x85N6otpnu8zn4mjelSgYsZy7NCv90TLoX_eg53cuXtuvLb-3o65rHkC9g5mnZJbXk_mkpdOJh2ubR4J6Q0ocj_o3oKrAw2jNlsAwQZl4iWuc2BMfRHKK01f0W9A387jVq4rpMIeF5-GgOCm5qdmGSnKB68pTgbZr8_o_-mnFKqBqRQz_Mhp7ObbgH-ASe-_K2d7bN5ABz9ooxtmmAY03RNThRHhtGDey9sXlpn5AWCwpJfXQ-6FRjVSFrbsnzAnusqdohOCyESqNoK9HrcT8wtf7oG0h60lpJBFx84tYu5Y7YtMIilaLe-BGYoypy-dwPVv9h0mM8ASD6kWq1SAUHBnqTdA0eEcmS07ydyko7EZ_69QdQGHsdK5vdEy1ut_5oMZmyL27Eo_rlso1xcULnRShcRkQC_1lij6PHCELNl0jWWGbmVjr2Qz5vKokqMeii-Qdh-sWdGhoLsTWXIpmg04-iRKIAebBN9vYb2CGqr35tupCDw-bajoCFb-ek_hQ1rSL9D9Iokcpd-_3GJj3-12jptvclYLEb456rStI5a0Dj05Fis_WmZrLNmW-SGLFanjpNCA0GJyY7mKHOHW42iHPPSwqncf-yrffFfSCS2BIvGlFudxhNbLuKIB1kxvsKrIm4CPXAfGliWrTvZlUXzk0Ju758ZWWGd-lBruw8ePzgdiTw6nfwlnAdCiGedvw0GOBT9mp6YOm9u5W_e025hoyq35TIkEEIcLkVvMC1lyrf1ub4dJm3pfP97pIY1XXWw0QUl7UubYHemFpkdFOWNMbAhiiK6prK5VLO2xvgcuRLFzDqAGUJQ==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0a27985aff3f65e0006a8fd9f0457487d087574d04f8d4fa37","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9nwTYdLfVuXt5XyjoVgMpFLpuUfHZJnfhz_n2yvK2yqz1Lk2Qg9jInERWD_bCkK9jWHPuMLiZufdy_xjHAL81la2PHE4cHgXRqGA2bB1cbn4ubzIRQtT1bAdUJnxaOJ2qfL9d3yiyUGyCWyYx7OUN_jJIJLwG223w-tWmkaxUc9_K9C3XX5moIJhajG6S9Xk4Eorvd7hhvHsH5DtI7Df5eCGtzbX2PXxYHCVrGG-ZQLSYwQO0E7ruug6x6pQUTkl9JKj-c_ZyaLg_1YWw-Hx6tyKIPmttyZ0CHBW_d-8UzzNhqTDgxOdgSBK7-tIDLne3rkP5XulzSzWN3ImUxLu-biffSMEVsBEcd0JjtCfy06G4qT7MvJK3VIfQnCdQJ6IEim9dWWQTUwqzL7T0UDRvH-hxely0CXd8AQGc2KzI6Qiz34Q5lQknpiugo7n3_qcVxRCmGFNI7Hq78gMhLrDpEnlPvM1yg4076PAO_xLMfOIbHxsm9-xTqjPV10PZMsQu9aPUFNiU9lhZWK9EGhRQT-tZHonMrxDxi6pGNtxf1YslnGzGPSacPKf8NMS0JVBtZz4YKwdKQppxbI_GczOKwZYaaLIsaSPsz1CT9lZFozim43KMcxFEAO9H4HhsVlYp_KrHVlSpJYUtLbiHf7qZq2_PAIuoX-R_1QImiSg2f8rAPp7sQWs9ExcPumO3eGZFfSNGSSgbxgfcfke7OdNOkXKuEimpsnHg9Mykh-fZHtoeVmKM-DRGvJh6a2QYeQxTECiC-MZbm__7M54CeU42uVCMoMQvDLUEDulk30oYlQ_iuOtj8ufnEHOD_x5ClidUEWoRa81-9CATCqKHN8KEgKDcjo6BL-QZV9GqTg6sdK98oczJFk9mRmjrK2BG0OI0GvgspnMy2nHu3VMH4Q81pk_fqqbSK6uUzT2VS6_u_Ka77_k6Cj1z8DpUk_7zhLFcp56vtvHT0o7uvEWTana8JsTI0YwvLNL6gfoguK7miD4wA67XbMhXxwyS3zqG8-Mp6jk55AheY0o9EtOoHbuVRKZ9Y279fc2luN7jggPIPysnZ9bLKdP4uaNnLOMubhWXetMSPnKD3tekYOlZo5Cl7ALalHsV50Su06_CsIomLgwbXJI1JTYJ1aWYUdVJM5WEX3jJwJMfGSNKYOxBE6wMmgpxukp6TyclF6v4wFARfW2J167uV8p80f1cllllckqbMnz4g5dWxtFY4VbVcGKh4rHIzUf4XKXBeuusLgx0icnnl1L4lEQiAWMc-BcN28q2PO","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"ws_0a27985aff3f65e0006a8fd9f08dc087d0ab05492ea2d50dfc","type":"web_search_call","status":"in_progress"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_0a27985aff3f65e0006a8fd9f08dc087d0ab05492ea2d50dfc","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","item_id":"ws_0a27985aff3f65e0006a8fd9f08dc087d0ab05492ea2d50dfc","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","item_id":"ws_0a27985aff3f65e0006a8fd9f08dc087d0ab05492ea2d50dfc","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"ws_0a27985aff3f65e0006a8fd9f08dc087d0ab05492ea2d50dfc","type":"web_search_call","status":"completed","action":{"type":"search","queries":["latest + vLLM release notes"],"query":"latest vLLM release notes"}},"output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","type":"mcp_call","status":"in_progress","approval_request_id":null,"arguments":"","error":null,"name":"search_tiktoken_documentation","output":null,"server_label":"gitmcp_tiktoken"},"output_index":2,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.mcp_call.in_progress + + ' + - 'data: {"type":"response.mcp_call.in_progress","item_id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","output_index":2,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.delta + + ' + - 'data: {"type":"response.mcp_call_arguments.delta","delta":"{\"query\":\"encoding\"}","item_id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","obfuscation":"tgZuRwQOE1AE","output_index":2,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.mcp_call_arguments.done + + ' + - 'data: {"type":"response.mcp_call_arguments.done","arguments":"{\"query\":\"encoding\"}","item_id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","output_index":2,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.mcp_call.completed + + ' + - 'data: {"type":"response.mcp_call.completed","item_id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","output_index":2,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","type":"mcp_call","status":"completed","approval_request_id":null,"arguments":"{\"query\":\"encoding\"}","error":null,"name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken"},"output_index":2,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0a27985aff3f65e0006a8fd9f6d18c87d0b03ad29beeb9fdeb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n2xeKHkSMv9e0fXCR8M40kWY1ujkAyo7b87PhGi-NxyRBhxdtY7D3UiQ91e4s9vIwuYGji8v7qV3-6dJ8X56MTXIhcWO6EZ-9MWep9OMxawav6t6-Z9ot_q4oNLOpFfJb9A6pl5JHXBmhLzsTQZfa0Vlb2b1FJlrq6sCIWnMXKGIWE93gl-s8UZrjA7FDFGcFd7QUU06u8Ki4ysLcUwdNaWfZOVb9ahQwLftjVCGkGaImcJxEN-hPlY9-wtTp6XO86MaK0VYnQV4s8pmGf5wJsdgxY8fTMjaV07fgSF0wNKqEh1P0TNgE9rFwRk5cUCViyzAEqt2-rJqIMQ2Fy0eUkBOOcs5S7ZRfBcylKdrSxvdXxOaZhAHUQBvjgEsk1VwKEUIpL0_Tp6gkreI7f0FO_18w2egvSYDQeD6L3hzJTxglOluL41GQ-fNzAjietiX30mUZz1qzvHwJROXnV-Sxqnay6mytumOiJhNVBD4R1vJ1ewuqPLseShkEwEar6CrXaZvM8TfdRFY8aZHqUTYag50sprJD62VnvJZMh3yRmLvD3VpJ3Jeq_nZfjezjpFKG2USs_QRg1n50JYAHTaFz3DDW5yYSeeZwUrFRpKs_PGPs1ua4-NKFPS6LWvqwtEgAaNJlK0C4BlVEvflDMRjWYlfWrxirnBfKiwKOeTe4BEVQrnjQuquPsFYTKBa_ghdAP8wxfyIPSVBQEZQLXnNNOAlpgbs2xq-D204mZ0f1UVAlAfBxdqgSInoX3M02QwhwaSuP7KVsZV6Xc4dQdG_7d_Ca0U2KW9PyHxcpdXStTae97EbEPN6fJwB6NQVqPpDnydUlpm3l7FD0c5iNdC4z_HwS93PIO3-Un7RVFMLPyiRgpZREt87YYVKP-XwLVAfmrj1J5UbAE95VMXgSzeC5ARoBYUIqSFli_9brYqnVbolcI7HBUePiG7CjwL9w_f77Qy6KHbK1syEEiLS53ge4CO_3bY6hn6Og73XzjCUnIQQPabQXLudM9CwTN_fy8M9EJnWr57FuM1-tb5KVcBSpW8KFfFePNl9VtzqX0DJApb_Z4ag18kx3-HD8_xLpeFlC5RGtRcg76YuxLmdb7jcRXzirtXwCwx0TLQ7PGPGqSg6rL7PqGI2FTY_2gDrXP20GRS80Ythp5HSsxnddJR5MI6Q==","summary":[]},"output_index":3,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0a27985aff3f65e0006a8fd9f6d18c87d0b03ad29beeb9fdeb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n3kShxs5MtNwpyzfyKzhwCXEeg4_K7V7mcLBTeZOUtml8g_Xh7cSldZw0RwlSqWK2tbSehzgExAwhDKOwv7-7eiknLuOrOPR1WhwLRd_Tc-jq3XvyNGv_GYnQXm8x-40nzps8MHDKB-0WKY0oMH84AZAL-z7Q8ZY_VEVfiwW0esWv9jVGWCKMGA2AMK21WPuyIM9XQCX45DaPuKHSwAxLLfrg4t-VeZ7sAPEaFZ1mNhA0QbafRjatX5b_Nns_SCoIKZsqsRUD2r629CFIt-wrz3DrWGD_rAjVnBtC9lKiSmo5Ia-EvtRgR87xAg1DHP5ALEk4lFTYz32QvXcBndo4N0RSlNnx98qnR1W27Yy9V28ZpcvLOgTlkDmW8nRmBb7Yx26sr_lzaE9Ey5LU6L5EYEquzQRaEduatka8UhoNgwM4TymAOhjezLM2OmUgwyFQ_W4K9jlvkneiLWX2sNhtsDU9HePVeh2G07Tj55Jf69QeLeLAiZ-2D5JkdlH3jasRP2QG2VvAC4KRnscBc8o6HbnyH6QKff9u82xiE-XFRKyEnxJ2Empa01kBb7KlVSY6LnJEYiEp1yh8ixGMDnGuNDflGv9QKNKBgK8nsOje_E5gvSyvbpMWCjG2j90Zq21c1L9xFvs9wnTL_8yNKz-a3CgIoj-gSp0B4YsVzL4A0N0lVY2AZyT7-dVy257DG5eHNgNpUNetC6vry_OF4HPEzvNae9jmp8uiXlKTMd2K6RdWnur8zPQR1cYKSAYRJxkTX7M3WwrvKWgeoHynE1nrF0xvbrX93kDNBWttDs6nt18bQeuwEixdHDcc_dsqgM_pHNCf9wLKctPFXPsmh1AextOxZstOHoESMwzXbVv9qzgGyy96A5-X0rHb_u1hp5p_TSW7l3nbEjN0aCc6SkhL71bPGyzNHtAalH1gEdTFDZ3EUX3aYkBaeVzAk1oZd3I7_lM_0y_mT8FsUrAmTL9aEWxaIDikdqsN2fe3gpyl708GqMoVKLpfmJlQNvzwQawNvMhGe_soDYMF10MbHGhpUK2kFJxeV9ujrXqs8SUgWJX00dfXbvUzxXS_bPJOt7wDvDRNOpQ08MPMZx5bbdoyD04mhlGNbZpA2X90zuYs7xQvtwmCD1chUl5-d8cSKQNGMfwev7CSuSGalGbbQ_H_x2K1khyZqoJ7hUWQTW2P144zDmh0zuaAl7TTNm0eAlV0LaZPhP6gDt87Ibck8PWjgldjdnt3D7P13jGlY2wlgwyg6STRG-hZI7_h9985oV0Oi2E7w_utjd16mWgMast5OcRMiiA_AqupNQlE3WU4tQXkvn2uOcGccTmvdwf8LHS113ykjFJQ0skBIcXticTSN7xIZ0tytqMiT-Y_bdoNH2-t025XapL6a7LaA2nPF23hau1R0KwCcgjqznfS-gr67DI1CTE7HeiJYCLKqgKlfXPpjm5dXIMUSRe8RMN9ty4zA4h3AbWUPD1D6sRHOWmAEXA==","summary":[]},"output_index":3,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":4,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","output_index":4,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"- **Web + search:** Results identify **vLLM v0.28.0** as the latest listed release, while + search indexing","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"MRhCqMISl","output_index":4,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" also + surfaced release notes for v0.27.","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"rpNkoGKA4","output_index":4,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"0 and + earlier versions.","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"LlUB2i67c","output_index":4,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"L3SrtvSiV9WeUv7","output_index":4,"sequence_number":22} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"([newreleases.io](https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai))","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"lBn","output_index":4,"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_text.annotation.added + + ' + - 'data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":275,"start_index":166,"title":"vllm-project/vllm + v0.25.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai"},"annotation_index":0,"content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","output_index":4,"sequence_number":24} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\n- **tiktoken + documentation:** No","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"7C3IiusrembTb5L","output_index":4,"sequence_number":25} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" direct + match was found for","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"QRESI","output_index":4,"sequence_number":26} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **“encoding”**;","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"","output_index":4,"sequence_number":27} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" fallback + documentation covered","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"A","output_index":4,"sequence_number":28} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" selecting + encodings","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"PDUPfJBcncga","output_index":4,"sequence_number":29} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", encoding","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"f3lKkh","output_index":4,"sequence_number":30} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"/decoding + text, creating custom `Encoding` objects,","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"k38YBhLP7PuA0","output_index":4,"sequence_number":31} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and + registering them through `tiktoken_ext`.","item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"obfuscation":"ReJ","output_index":4,"sequence_number":32} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","logprobs":[],"output_index":4,"sequence_number":33,"text":"- + **Web search:** Results identify **vLLM v0.28.0** as the latest listed release, + while search indexing also surfaced release notes for v0.27.0 and earlier versions. + ([newreleases.io](https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai))\n- + **tiktoken documentation:** No direct match was found for **“encoding”**; fallback + documentation covered selecting encodings, encoding/decoding text, creating + custom `Encoding` objects, and registering them through `tiktoken_ext`."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","output_index":4,"part":{"type":"output_text","annotations":[{"type":"url_citation","end_index":275,"start_index":166,"title":"vllm-project/vllm + v0.25.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai"}],"logprobs":[],"text":"- + **Web search:** Results identify **vLLM v0.28.0** as the latest listed release, + while search indexing also surfaced release notes for v0.27.0 and earlier versions. + ([newreleases.io](https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai))\n- + **tiktoken documentation:** No direct match was found for **“encoding”**; fallback + documentation covered selecting encodings, encoding/decoding text, creating + custom `Encoding` objects, and registering them through `tiktoken_ext`."},"sequence_number":34} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":275,"start_index":166,"title":"vllm-project/vllm + v0.25.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai"}],"logprobs":[],"text":"- + **Web search:** Results identify **vLLM v0.28.0** as the latest listed release, + while search indexing also surfaced release notes for v0.27.0 and earlier versions. + ([newreleases.io](https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai))\n- + **tiktoken documentation:** No direct match was found for **“encoding”**; fallback + documentation covered selecting encodings, encoding/decoding text, creating + custom `Encoding` objects, and registering them through `tiktoken_ext`."}],"phase":"final_answer","role":"assistant"},"output_index":4,"sequence_number":35} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0a27985aff3f65e0006a8fd9eebfec87d094c79c9ee6f467ad","object":"response","created_at":1787812334,"status":"completed","background":false,"completed_at":1787812344,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0a27985aff3f65e0006a8fd9f0457487d087574d04f8d4fa37","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n46z9enuVbDpwXRIK1Dy2EomcrfZexxg0F1b1p7EeSFHuKOWuW3TzCIJhPKzDvb1jNTO0ePAxzOyu0by6B0DG87DejFhcO3q2aZ-LtWm-DMYjrBa6yI6L2i-EsdIE48rlCeDmbUjEVhLJKWt1DQ75QMKAB2dAW8j9FFi5ZA3TXwHvQNygXY0OovLSMzpvm5wlAptCrKLgWn0SgEy5Qw6gftzIc3xRdZrGi8i_cVcxvy038vMrsQbd3Z9M5Dud88g7j4xmy9KTMJYKka3SNPVtJNS8e1pplV4r4-ftTM-E6dFff-EI0SpLKH6IltT0d1l4ycjs0gX99pdWE9Fjdg3E3E-SFRlZ8fPerzltdy8z0ZoRLCHwZUYHI92AytjIzrOpaNMXhrL9__7XwC8ZfFMOAdW0rJUF3A0tTAyM5KT3Vg-xwLgRtlZRS97o8WjLer4-q1ENwEKTZDiWHrEWoOJWWLbMMQvPdZQ5O3jIV31nZ14yvzUrEZyUc_HhIizqueDH3mAUYmhvOYvinZIKCJ_it13Usw2CvC9k8LVB4SyUYCZeHZHG1u7QKGKgtMkiSu6nNK_nzwA3cIxmhpwLCXOqZQBqWUvQfaM4Tkj5tJ5RiMsuxXftYozj0twYwzuMqPLHcN6h5_ntjjQw3lmetsmTTelVTO8Q6fLhk2QOdh2kFr6sI21h89T_d_E-55fdZd4gT0u0UfFWTs2CB75KYBCb-DYLsGlC4lcJ8GhyBmvIj5MBR-6k88LDatVn-GeTp0gl8HQoSeVIWjodW7O2NHJm7kblxIkt6yxx6i7X2Cdbl_ocJdaukd5Z0LEuXdYLHjUWgwG23Ii7EKWTPh3iq2OKBrYqZw-oduJ2EPp1YJMcdvXfULKYcOWe3A6OTW5DsiqZktzEZyPKB_cY6sbDI1k8AZ78HYWb5NNBfsi5Y9sw8WV7gsr-6Ax_fuKqDYArs6s9tAZphZPOfi0p5rX7DMxbYb8fQrFNLkyctJUV6z7jTiwIa4R2zaWRFc3aaA-_4qNd_c2FKwG2MHPMSJd3Yrp-EXpdmotLKfZIm5fuxqCiwoxnAmRZEhI4AmwmEqWmaOAyZvAgZNAfeL0LNsOlqqg3FYxwuo5PV71ZIJwk5uzZguYc7CMXsBNCzpUoWGj--vR3gKA1FJcwSK7Cvl2MrZEuw2IUVK5OcvQYIROX-unXbw1UwHOpziRuL3tHlPQw4OOXjHR3Dp8hIld2oh-2f_6FgxuwjGFwWvTpgnAcZhZrFt9nJ5I0KxVAfXOrmP9KHLYz1","summary":[]},{"id":"ws_0a27985aff3f65e0006a8fd9f08dc087d0ab05492ea2d50dfc","type":"web_search_call","status":"completed","action":{"type":"search","queries":["latest + vLLM release notes"],"query":"latest vLLM release notes"}},{"id":"mcp_0a27985aff3f65e0006a8fd9f4f53487d0bf3542164265360e","type":"mcp_call","status":"completed","approval_request_id":null,"arguments":"{\"query\":\"encoding\"}","error":null,"name":"search_tiktoken_documentation","output":"### + Search Results for: \"encoding\"\n\nNo relevant documentation found for your + query. It''s either being indexed or the search query did not match any documentation.\n\nAs + a fallback, this is the documentation for openai/tiktoken:\n\n# ⏳ tiktoken\n\ntiktoken + is a fast [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser + for use with\nOpenAI''s models.\n\n```python\nimport tiktoken\nenc = tiktoken.get_encoding(\"o200k_base\")\nassert + enc.decode(enc.encode(\"hello world\")) == \"hello world\"\n\n# To get the tokeniser + corresponding to a specific model in the OpenAI API:\nenc = tiktoken.encoding_for_model(\"gpt-4o\")\n```\n\nThe + open source version of `tiktoken` can be installed from [PyPI](https://pypi.org/project/tiktoken):\n```\npip + install tiktoken\n```\n\nThe tokeniser API is documented in `tiktoken/core.py`.\n\nExample + code using `tiktoken` can be found in the\n[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb).\n\n\n## + Performance\n\n`tiktoken` is between 3-6x faster than a comparable open source + tokeniser:\n\n![image](https://raw.githubusercontent.com/openai/tiktoken/main/perf.svg)\n\nPerformance + measured on 1GB of text using the GPT-2 tokeniser, using `GPT2TokenizerFast` + from\n`tokenizers==0.13.2`, `transformers==4.24.0` and `tiktoken==0.2.0`.\n\n\n## + Getting help\n\nPlease post questions in the [issue tracker](https://github.com/openai/tiktoken/issues).\n\nIf + you work at OpenAI, make sure to check the internal documentation or feel free + to contact\n@shantanu.\n\n## What is BPE anyway?\n\nLanguage models don''t see + text like you and I, instead they see a sequence of numbers (known as tokens).\nByte + pair encoding (BPE) is a way of converting text into tokens. It has a couple + desirable\nproperties:\n1) It''s reversible and lossless, so you can convert + tokens back into the original text\n2) It works on arbitrary text, even text + that is not in the tokeniser''s training data\n3) It compresses the text: the + token sequence is shorter than the bytes corresponding to the\n original text. + On average, in practice, each token corresponds to about 4 bytes.\n4) It attempts + to let the model see common subwords. For instance, \"ing\" is a common subword + in\n English, so BPE encodings will often split \"encoding\" into tokens like + \"encod\" and \"ing\"\n (instead of e.g. \"enc\" and \"oding\"). Because the + model will then see the \"ing\" token again and\n again in different contexts, + it helps models generalise and better understand grammar.\n\n`tiktoken` contains + an educational submodule that is friendlier if you want to learn more about\nthe + details of BPE, including code that helps visualise the BPE procedure:\n```python\nfrom + tiktoken._educational import *\n\n# Train a BPE tokeniser on a small amount + of text\nenc = train_simple_encoding()\n\n# Visualise how the GPT-4 encoder + encodes text\nenc = SimpleBytePairEncoding.from_tiktoken(\"cl100k_base\")\nenc.encode(\"hello + world aaaaaaaaaaaa\")\n```\n\n\n## Extending tiktoken\n\nYou may wish to extend + `tiktoken` to support new encodings. There are two ways to do this.\n\n\n**Create + your `Encoding` object exactly the way you want and simply pass it around.**\n\n```python\ncl100k_base + = tiktoken.get_encoding(\"cl100k_base\")\n\n# In production, load the arguments + directly instead of accessing private attributes\n# See openai_public.py for + examples of arguments for specific encodings\nenc = tiktoken.Encoding(\n # + If you''re changing the set of special tokens, make sure to use a different + name\n # It should be clear from the name what behaviour to expect.\n name=\"cl100k_im\",\n pat_str=cl100k_base._pat_str,\n mergeable_ranks=cl100k_base._mergeable_ranks,\n special_tokens={\n **cl100k_base._special_tokens,\n \"<|im_start|>\": + 100264,\n \"<|im_end|>\": 100265,\n }\n)\n```\n\n**Use the `tiktoken_ext` + plugin mechanism to register your `Encoding` objects with `tiktoken`.**\n\nThis + is only useful if you need `tiktoken.get_encoding` to find your encoding, otherwise + prefer\noption 1.\n\nTo do this, you''ll need to create a namespace package + under `tiktoken_ext`.\n\nLayout your project like this, making sure to omit + the `tiktoken_ext/__init__.py` file:\n```\nmy_tiktoken_extension\n├── tiktoken_ext\n│   + └── my_encodings.py\n└── setup.py\n```\n\n`my_encodings.py` should be a module + that contains a variable named `ENCODING_CONSTRUCTORS`.\nThis is a dictionary + from an encoding name to a function that takes no arguments and returns\narguments + that can be passed to `tiktoken.Encoding` to construct that encoding. For an + example, see\n`tiktoken_ext/openai_public.py`. For precise details, see `tiktoken/registry.py`.\n\nYour + `setup.py` should look something like this:\n```python\nfrom setuptools import + setup, find_namespace_packages\n\nsetup(\n name=\"my_tiktoken_extension\",\n packages=find_namespace_packages(include=[''tiktoken_ext*'']),\n install_requires=[\"tiktoken\"],\n ...\n)\n```\n\nThen + simply `pip install ./my_tiktoken_extension` and you should be able to use your\ncustom + encodings! Make sure **not** to use an editable install.\n\n\n\nIf you''d like + to retry the search, try changing the query to increase the likelihood of a + match.","server_label":"gitmcp_tiktoken"},{"id":"rs_0a27985aff3f65e0006a8fd9f6d18c87d0b03ad29beeb9fdeb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n4K0Zgjs25LkYUSKfjRbBH0BWQHRyJ8nQ6kl2fyLD3-v8FOS7XevvcTz_71ro3WgjcBMFLy6Y1yv8UtDYV-7HtRFHGfA3ahFgYxfjVICV5ZNCNnQ8Fk3VeFPLBGRnBhRblLAIGhNsPkRWJvxbx0G7GWsy5cXwVLvyXAoPO5ttVVDgoVS0-VCInorhLyYqofso6GpKJrngm_lVryBwVunMKU2x2bwjoDYipIi1vss6cYunJjxJxnsaPQdPM5uWSvgk92lHBj0Sd-TJq6lfQlgM1TAF8wL6pxb-NUtuciwf2hCbjkz7q6lYHHebcwUhuY29sN3IQeesaqjzZzNxK_T6PGy8mXRAd70ozABJDd50yaxOBXnijo_AabYGvG9rGLYDA8arZueLjdfRXsSqMN3pvwP_0qTJ3ahz3SPTK6KQpJhCBB5NS7rX__rMqcRol9IAdTV1mrC-dXHq2uRUwubKW0ADl5Am1ZWxAVZez8atwUGF37tUmXFKXzd0P88S2ep_ZPQR-Jg05niTvFinmaiBK1TeZC2a8YWM4W9mvH2G2KcpAKPEThXS3fdQhr3MDh95B05HHINR6d1t8fAagOY9eaiwf9Hhh20aQUT9eeIDJnBMlfUNn0L_5yOlWxicIwnYjZbZKqnNZ6VQQClFlIV67bs5NkZZESrFKCYAz2r_D03QZ9cvTsEqCAVt83z1leHp3ilR8Ep1K4azBK8aFfeJqavZBEDs8JI55wOdsubd29zgsT0kZQ-YWr2VLpNMB5Pql7caA4zj060U6k2md_nQYpILYns9udnMYPcwhlzSbgQR8Ywd8neTUkPAMYAawiWkN_kln2VyhQ_DBXtNs9aC0elQ6gPEpxbQFO0UMGDhhRMi_Kmw18qKrVl1hKCsNEFryKAptt3fmqf1ngt17LM0aOwZst8XqBJKCj1c92UR0zYsd5Eb0I0bmmODHi7vNf-alFv2rWTP9gb9jPxSHVP1MmV-1XXzKPNHWgdaZZR7hhncFvH4v-suhZqDIICnGF_dk168r82m-DgZUfDhM7TelW-BMy-kyymtmRRls9z7JUL6YARyJiiY2-e8yJeLpNRK7lypGDjdJTHWjBpOhzcXfbketPTiWjcnQUZGp9ot3Ffn8AMDNxkAG1H3BOkIblsdbl2yRn86VgiSJROo1wMaMfu1LLFnB8BJBTGZbL4RmR0T1s5qiDgA_WYUUMPSsRAimJ2-nnxQi9QKuEwLxJ0qSU4kVvHbBGw70K0PkTPO9NU__cVNYWoN0e-PjAX2VzybMI83A-TZN3SpYsKW3diU4_DQ791wETGLGmSaKoaZaRDuKasNF5yWY0LbCwggfACK31JWIOxIl9NoG2llVd1aJLy4_3jNwwLMcjW__ZRBtdASO9VOG_uwKKuFEmQDq6xmIvY9aJYEWaBlglkbe4nC4ttivsjFlHhFdf_2PKt0AI8GwcZaajIEP_WZ9ZhK2sQOgWxzOepnNLJ1ubJUU77_4fg==","summary":[]},{"id":"msg_0a27985aff3f65e0006a8fd9f798fc87d0aedb04bac7bc7dc5","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":275,"start_index":166,"title":"vllm-project/vllm + v0.25.0 on GitHub","url":"https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai"}],"logprobs":[],"text":"- + **Web search:** Results identify **vLLM v0.28.0** as the latest listed release, + while search indexing also surfaced release notes for v0.27.0 and earlier versions. + ([newreleases.io](https://newreleases.io/project/github/vllm-project/vllm/release/v0.25.0?utm_source=openai))\n- + **tiktoken documentation:** No direct match was found for **“encoding”**; fallback + documentation covered selecting encodings, encoding/decoding text, creating + custom `Encoding` objects, and registering them through `tiktoken_ext`."}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0a27985aff3f65e0006a8fd9e8369c87d0a982440f31ab9463","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":1}},"tools":[{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"mcp","allowed_tools":["search_tiktoken_documentation"],"headers":null,"require_approval":"never","server_description":null,"server_label":"gitmcp_tiktoken","server_url":"https://gitmcp.io/openai/tiktoken"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":21774,"input_tokens_details":{"cache_write_tokens":2810,"cached_tokens":13389},"output_tokens":245,"output_tokens_details":{"reasoning_tokens":98},"total_tokens":22019},"user":null,"metadata":{}},"sequence_number":36} + + ' + - ' + + ' + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml new file mode 100644 index 00000000..72bf7644 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml @@ -0,0 +1,503 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call get_stock_price for "AAPL", and (3) call set_temperature_unit to + set my preferred unit to "fahrenheit" for the rest of this conversation.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817593 + error: null + id: resp_01a0423b-86e9-7643-a7e0-32cd2fd188f9 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user wants me to call three functions in parallel: + + 1. get_weather for "Tokyo" + + 2. get_stock_price for "AAPL" + + 3. set_temperature_unit with input "fahrenheit" + + + I need to make all three calls in this single turn without waiting for + any of them to complete first. Let me structure the function calls properly. + + ' + type: reasoning_text + encrypted_content: null + id: rs_b12937703d00c5d4 + status: null + summary: [] + type: reasoning + - arguments: '{"city": "Tokyo"}' + call_id: chatcmpl-tool-a5a12d10f7afd044 + id: fc_9366fa5b876e018d + name: get_weather + status: completed + type: function_call + - arguments: '{"ticker": "AAPL"}' + call_id: chatcmpl-tool-ae16e3bec0454862 + id: fc_89fc16578302995e + name: get_stock_price + status: completed + type: function_call + - call_id: chatcmpl-tool-9dee2250e07bdd84 + id: ctc_95a0af2c3149b085 + input: fahrenheit + name: set_temperature_unit + status: completed + type: custom_tool_call + previous_response_id: null + status: completed + usage: + input_tokens: 661 + input_tokens_details: + cached_tokens: 0 + output_tokens: 159 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 820 + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: chatcmpl-tool-a5a12d10f7afd044 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: chatcmpl-tool-ae16e3bec0454862 + output: '{"ticker": "AAPL", "price": 231.45, "currency": "USD"}' + type: function_call_output + - call_id: chatcmpl-tool-9dee2250e07bdd84 + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: What did you find for the weather and the stock price, and what temperature + unit did you just set? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-86e9-7643-a7e0-32cd2fd188f9 + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817595 + error: null + id: resp_01a0423b-8b61-7081-ae74-f55b733d34f0 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user is asking me to report back on the three function calls + I made. Let me extract the relevant information from the results: + + + 1. Weather for Tokyo: 22°C, Clear condition + + 2. Stock price for AAPL: $231.45 USD + + 3. Temperature unit: fahrenheit + + + I should present this information clearly to the user. Note that since + they set the temperature unit to fahrenheit, I should consider converting + the temperature to fahrenheit when reporting, or at least mention both + units. + + ' + type: reasoning_text + encrypted_content: null + id: rs_811c5b0fb80b8010 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + Here''s what I found: + + + **Weather in Tokyo:** + + - Temperature: 22°C (which is 71.6°F in Fahrenheit) + + - Condition: Clear + + + **Stock Price (AAPL):** + + - Price: $231.45 USD + + + **Temperature Unit:** + + - I''ve successfully set your preferred temperature unit to Fahrenheit + for the rest of this conversation. + + + So if you ask about weather in future conversations, temperatures will + be displayed in Fahrenheit instead of Celsius.' + type: output_text + id: msg_93a7981498a1ab41 + role: assistant + status: completed + type: message + previous_response_id: resp_01a0423b-86e9-7643-a7e0-32cd2fd188f9 + status: completed + usage: + input_tokens: 850 + input_tokens_details: + cached_tokens: 0 + output_tokens: 213 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1063 + headers: + content-type: application/json + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "Tokyo", and + (2) call get_weather for "Paris".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-8b61-7081-ae74-f55b733d34f0 + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817595 + error: null + id: resp_01a0423b-913d-7661-81a7-59e06589fe70 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user wants me to call get_weather for both Tokyo and Paris in + parallel, in a single turn. I need to make both function calls at the + same time without waiting for one to complete before starting the other. + + ' + type: reasoning_text + encrypted_content: null + id: rs_882cd35867e5f5a6 + status: null + summary: [] + type: reasoning + - arguments: '{"city": "Tokyo"}' + call_id: chatcmpl-tool-a947d9fbf3fe3834 + id: fc_b9a5b81d0e28593b + name: get_weather + status: completed + type: function_call + - arguments: '{"city": "Paris"}' + call_id: chatcmpl-tool-8129bed2838d87b2 + id: fc_90be57b9e06adf34 + name: get_weather + status: completed + type: function_call + previous_response_id: resp_01a0423b-8b61-7081-ae74-f55b733d34f0 + status: completed + usage: + input_tokens: 1008 + input_tokens_details: + cached_tokens: 0 + output_tokens: 99 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1107 + headers: + content-type: application/json + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: chatcmpl-tool-a947d9fbf3fe3834 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: chatcmpl-tool-8129bed2838d87b2 + output: '{"city": "Paris", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-913d-7661-81a7-59e06589fe70 + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817597 + error: null + id: resp_01a0423b-9471-76c1-a61b-1ab90bb6b863 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user is asking for the weather information I just retrieved for + Tokyo and Paris. I have the data from the previous function calls, so + I can provide that information directly without making any new tool calls. + + + From the results: + + - Tokyo: 22°C, Clear + + - Paris: 22°C, Clear + + + However, I should remember that earlier in the conversation, the user + asked me to set their preferred temperature unit to Fahrenheit. So I should + convert these temperatures to Fahrenheit as well to be consistent with + their preference. + + + 22°C = (22 × 9/5) + 32 = 39.6 + 32 = 71.6°F + + + I''ll provide both Celsius and Fahrenheit temperatures since the tool + returned Celsius but the user prefers Fahrenheit. + + ' + type: reasoning_text + encrypted_content: null + id: rs_b9e2e6346da31107 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + Here''s the weather for both cities: + + + **Tokyo:** + + - Temperature: 22°C (71.6°F) + + - Condition: Clear + + + **Paris:** + + - Temperature: 22°C (71.6°F) + + - Condition: Clear + + + Both cities are currently experiencing clear skies with the same temperature + of 22°C/71.6°F!' + type: output_text + id: msg_b1ecd51b6682cfd5 + role: assistant + status: completed + type: message + previous_response_id: resp_01a0423b-913d-7661-81a7-59e06589fe70 + status: completed + usage: + input_tokens: 1136 + input_tokens_details: + cached_tokens: 0 + output_tokens: 247 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1383 + headers: + content-type: application/json + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml new file mode 100644 index 00000000..b4284df2 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml @@ -0,0 +1,4740 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call get_stock_price for "AAPL", and (3) call set_temperature_unit to + set my preferred unit to "fahrenheit" for the rest of this conversation.' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817545,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817545,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"9e8f837bb181a460","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"9e8f837bb181a460","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + make","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + three","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + function","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + calls","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + in","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + in","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + a","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + single","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + turn","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":":","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":"\n","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":"1","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":".","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + get","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":"_weather","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + for","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + \"","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":"Tok","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":"yo","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":"\"","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":"\n","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":"2","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":".","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + get","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":"_stock","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":"_price","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + for","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + \"","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":"AAP","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":"L","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":"\"","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":"\n","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":"3","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":".","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + set","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":"_temperature","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"_unit","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":" + with","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":" + \"","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":"f","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":"ahrenheit","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":"\"","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + as","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":" + the","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + unit","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":"I","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + need","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":" + to","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + make","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":" + all","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":" + three","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":" + calls","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":" + simultaneously","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + without","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + waiting","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + for","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":" + one","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":" + before","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":" + starting","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + another","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":".","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":" + Let","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":" + me","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":" + prepare","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":" + all","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":0,"content_index":0,"delta":" + three","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":0,"content_index":0,"delta":" + function","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":0,"content_index":0,"delta":" + calls","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":0,"content_index":0,"delta":".","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":0,"content_index":0,"delta":"\n","item_id":"9e8f837bb181a460"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":81,"output_index":0,"content_index":0,"item_id":"9e8f837bb181a460","text":"The + user wants me to make three function calls in parallel in a single turn:\n1. + get_weather for \"Tokyo\"\n2. get_stock_price for \"AAPL\"\n3. set_temperature_unit + with \"fahrenheit\" as the unit\n\nI need to make all three calls simultaneously + without waiting for one before starting another. Let me prepare all three function + calls.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":82,"output_index":0,"content_index":0,"item_id":"9e8f837bb181a460","part":{"text":"The + user wants me to make three function calls in parallel in a single turn:\n1. + get_weather for \"Tokyo\"\n2. get_stock_price for \"AAPL\"\n3. set_temperature_unit + with \"fahrenheit\" as the unit\n\nI need to make all three calls simultaneously + without waiting for one before starting another. Let me prepare all three function + calls.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":83,"output_index":0,"item":{"content":[{"text":"The + user wants me to make three function calls in parallel in a single turn:\n1. + get_weather for \"Tokyo\"\n2. get_stock_price for \"AAPL\"\n3. set_temperature_unit + with \"fahrenheit\" as the unit\n\nI need to make all three calls simultaneously + without waiting for one before starting another. Let me prepare all three function + calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"9e8f837bb181a460","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":84,"output_index":1,"item":{"arguments":"","call_id":"call_a47cd17ffc110d48","caller":null,"id":"a59a52f5afab0e23","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":85,"output_index":1,"delta":"{\"city\": + \"","item_id":"a59a52f5afab0e23"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":86,"output_index":1,"delta":"Tok","item_id":"a59a52f5afab0e23"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":87,"output_index":1,"delta":"yo","item_id":"a59a52f5afab0e23"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":88,"output_index":1,"delta":"\"}","item_id":"a59a52f5afab0e23"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":89,"output_index":1,"arguments":"{\"city\": + \"Tokyo\"}","item_id":"a59a52f5afab0e23","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":90,"output_index":1,"item":{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_a47cd17ffc110d48","caller":null,"id":"a59a52f5afab0e23","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":91,"output_index":2,"item":{"arguments":"","call_id":"call_b6e073b214919952","caller":null,"id":"922c04c835da212f","name":"get_stock_price","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":92,"output_index":2,"delta":"{\"ticker\": + \"","item_id":"922c04c835da212f"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":93,"output_index":2,"delta":"AAP","item_id":"922c04c835da212f"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":94,"output_index":2,"delta":"L","item_id":"922c04c835da212f"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":95,"output_index":2,"delta":"\"}","item_id":"922c04c835da212f"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":96,"output_index":2,"arguments":"{\"ticker\": + \"AAPL\"}","item_id":"922c04c835da212f","name":"get_stock_price"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":97,"output_index":2,"item":{"arguments":"{\"ticker\": + \"AAPL\"}","call_id":"call_b6e073b214919952","caller":null,"id":"922c04c835da212f","name":"get_stock_price","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":98,"output_index":3,"item":{"call_id":"call_bdd93972a9d06e58","id":"ctc_b8ed19d0c429d2ba","input":"","name":"set_temperature_unit","status":"in_progress","type":"custom_tool_call"}} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","sequence_number":99,"output_index":3,"delta":"f","item_id":"ctc_b8ed19d0c429d2ba"} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","sequence_number":100,"output_index":3,"delta":"ahrenheit","item_id":"ctc_b8ed19d0c429d2ba"} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.done + + ' + - 'data: {"type":"response.custom_tool_call_input.done","sequence_number":101,"output_index":3,"input":"fahrenheit","item_id":"ctc_b8ed19d0c429d2ba"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":102,"output_index":3,"item":{"call_id":"call_bdd93972a9d06e58","id":"ctc_b8ed19d0c429d2ba","input":"fahrenheit","name":"set_temperature_unit","status":"completed","type":"custom_tool_call"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":103,"response":{"conversation_id":null,"created_at":1787817547,"error":null,"id":"resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to make three function calls in parallel in a single turn:\n1. + get_weather for \"Tokyo\"\n2. get_stock_price for \"AAPL\"\n3. set_temperature_unit + with \"fahrenheit\" as the unit\n\nI need to make all three calls simultaneously + without waiting for one before starting another. Let me prepare all three function + calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"9e8f837bb181a460","status":null,"summary":[],"type":"reasoning"},{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_a47cd17ffc110d48","id":"a59a52f5afab0e23","name":"get_weather","status":"completed","type":"function_call"},{"arguments":"{\"ticker\": + \"AAPL\"}","call_id":"call_b6e073b214919952","id":"922c04c835da212f","name":"get_stock_price","status":"completed","type":"function_call"},{"call_id":"call_bdd93972a9d06e58","id":"ctc_b8ed19d0c429d2ba","input":"fahrenheit","name":"set_temperature_unit","status":"completed","type":"custom_tool_call"}],"previous_response_id":null,"status":"completed","usage":{"input_tokens":661,"input_tokens_details":{"cached_tokens":0},"output_tokens":161,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":822}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_a47cd17ffc110d48 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_b6e073b214919952 + output: '{"ticker": "AAPL", "price": 231.45, "currency": "USD"}' + type: function_call_output + - call_id: call_bdd93972a9d06e58 + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: What did you find for the weather and the stock price, and what temperature + unit did you just set? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4 + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817547,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-d598-75f1-ae79-dd0e93522eef","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817547,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-d598-75f1-ae79-dd0e93522eef","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"b53fc9d46fbaee18","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"b53fc9d46fbaee18","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + is","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + asking","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + me","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + to","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + summarize","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + the","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + results","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + from","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + the","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + three","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + tool","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + calls","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + I","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + just","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + made","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":".","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + Let","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + me","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + provide","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + the","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + information","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + for","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + each","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":":","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":"1","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":".","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + Weather","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + for","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":":","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + ","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":"2","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":"2","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":"°C","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":",","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + Clear","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + conditions","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":"\n","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"2","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":".","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":" + Stock","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + price","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":" + for","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + AAP","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":"L","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":":","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + $","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":"2","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":"3","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":"1","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":".","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":"4","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":"5","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":" + USD","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":"\n","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":"3","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":".","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + Temperature","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + unit","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":" + set","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":" + to","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":":","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + f","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":"ahrenheit","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":"I","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":" + should","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":" + present","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":0,"content_index":0,"delta":" + this","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":0,"content_index":0,"delta":" + information","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":0,"content_index":0,"delta":" + clearly","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":0,"content_index":0,"delta":" + and","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":0,"content_index":0,"delta":" + conc","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":81,"output_index":0,"content_index":0,"delta":"is","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":82,"output_index":0,"content_index":0,"delta":"ely","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":83,"output_index":0,"content_index":0,"delta":".","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":84,"output_index":0,"content_index":0,"delta":"\n","item_id":"b53fc9d46fbaee18"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":85,"output_index":0,"content_index":0,"item_id":"b53fc9d46fbaee18","text":"The + user is asking me to summarize the results from the three parallel tool calls + I just made. Let me provide the information for each:\n\n1. Weather for Tokyo: + 22°C, Clear conditions\n2. Stock price for AAPL: $231.45 USD\n3. Temperature + unit set to: fahrenheit\n\nI should present this information clearly and concisely.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":86,"output_index":0,"content_index":0,"item_id":"b53fc9d46fbaee18","part":{"text":"The + user is asking me to summarize the results from the three parallel tool calls + I just made. Let me provide the information for each:\n\n1. Weather for Tokyo: + 22°C, Clear conditions\n2. Stock price for AAPL: $231.45 USD\n3. Temperature + unit set to: fahrenheit\n\nI should present this information clearly and concisely.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":87,"output_index":0,"item":{"content":[{"text":"The + user is asking me to summarize the results from the three parallel tool calls + I just made. Let me provide the information for each:\n\n1. Weather for Tokyo: + 22°C, Clear conditions\n2. Stock price for AAPL: $231.45 USD\n3. Temperature + unit set to: fahrenheit\n\nI should present this information clearly and concisely.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"b53fc9d46fbaee18","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":88,"output_index":1,"item":{"content":[],"id":"8d21a7241ebf46df","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":89,"output_index":1,"content_index":0,"item_id":"8d21a7241ebf46df","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":90,"output_index":1,"content_index":0,"delta":"\n\nHere","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":91,"output_index":1,"content_index":0,"delta":" + are","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":92,"output_index":1,"content_index":0,"delta":" + the","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":93,"output_index":1,"content_index":0,"delta":" + results","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":94,"output_index":1,"content_index":0,"delta":" + from","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":95,"output_index":1,"content_index":0,"delta":" + the","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":96,"output_index":1,"content_index":0,"delta":" + three","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":97,"output_index":1,"content_index":0,"delta":" + parallel","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":98,"output_index":1,"content_index":0,"delta":" + calls","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":99,"output_index":1,"content_index":0,"delta":" + I","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":100,"output_index":1,"content_index":0,"delta":" + just","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":101,"output_index":1,"content_index":0,"delta":" + made","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":102,"output_index":1,"content_index":0,"delta":":","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":103,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":104,"output_index":1,"content_index":0,"delta":"**","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":105,"output_index":1,"content_index":0,"delta":"Weather","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":106,"output_index":1,"content_index":0,"delta":" + in","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":107,"output_index":1,"content_index":0,"delta":" + Tokyo","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":108,"output_index":1,"content_index":0,"delta":":**","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":109,"output_index":1,"content_index":0,"delta":"\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":110,"output_index":1,"content_index":0,"delta":"-","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":111,"output_index":1,"content_index":0,"delta":" + Temperature","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":112,"output_index":1,"content_index":0,"delta":":","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":113,"output_index":1,"content_index":0,"delta":" + ","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":114,"output_index":1,"content_index":0,"delta":"2","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":115,"output_index":1,"content_index":0,"delta":"2","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":116,"output_index":1,"content_index":0,"delta":"°C","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":117,"output_index":1,"content_index":0,"delta":"\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":118,"output_index":1,"content_index":0,"delta":"-","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":119,"output_index":1,"content_index":0,"delta":" + Condition","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":120,"output_index":1,"content_index":0,"delta":":","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":121,"output_index":1,"content_index":0,"delta":" + Clear","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":122,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":123,"output_index":1,"content_index":0,"delta":"**","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":124,"output_index":1,"content_index":0,"delta":"Stock","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":125,"output_index":1,"content_index":0,"delta":" + Price","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":126,"output_index":1,"content_index":0,"delta":" + for","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":127,"output_index":1,"content_index":0,"delta":" + AAP","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":128,"output_index":1,"content_index":0,"delta":"L","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":129,"output_index":1,"content_index":0,"delta":":**","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":130,"output_index":1,"content_index":0,"delta":"\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":131,"output_index":1,"content_index":0,"delta":"-","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":132,"output_index":1,"content_index":0,"delta":" + Price","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":133,"output_index":1,"content_index":0,"delta":":","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":134,"output_index":1,"content_index":0,"delta":" + $","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":135,"output_index":1,"content_index":0,"delta":"2","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":136,"output_index":1,"content_index":0,"delta":"3","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":137,"output_index":1,"content_index":0,"delta":"1","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":138,"output_index":1,"content_index":0,"delta":".","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":139,"output_index":1,"content_index":0,"delta":"4","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":140,"output_index":1,"content_index":0,"delta":"5","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":141,"output_index":1,"content_index":0,"delta":" + USD","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":142,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":143,"output_index":1,"content_index":0,"delta":"**","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":144,"output_index":1,"content_index":0,"delta":"Temperature","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":145,"output_index":1,"content_index":0,"delta":" + Unit","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":146,"output_index":1,"content_index":0,"delta":":**","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":147,"output_index":1,"content_index":0,"delta":"\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":148,"output_index":1,"content_index":0,"delta":"-","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":149,"output_index":1,"content_index":0,"delta":" + Successfully","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":150,"output_index":1,"content_index":0,"delta":" + set","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":151,"output_index":1,"content_index":0,"delta":" + to","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":152,"output_index":1,"content_index":0,"delta":" + f","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":153,"output_index":1,"content_index":0,"delta":"ahrenheit","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":154,"output_index":1,"content_index":0,"delta":" + for","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":155,"output_index":1,"content_index":0,"delta":" + the","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":156,"output_index":1,"content_index":0,"delta":" + rest","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":157,"output_index":1,"content_index":0,"delta":" + of","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":158,"output_index":1,"content_index":0,"delta":" + this","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":159,"output_index":1,"content_index":0,"delta":" + conversation","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":160,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":161,"output_index":1,"content_index":0,"delta":"All","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":162,"output_index":1,"content_index":0,"delta":" + three","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":163,"output_index":1,"content_index":0,"delta":" + tasks","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":164,"output_index":1,"content_index":0,"delta":" + completed","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":165,"output_index":1,"content_index":0,"delta":" + successfully","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":166,"output_index":1,"content_index":0,"delta":"!","item_id":"8d21a7241ebf46df","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":167,"output_index":1,"content_index":0,"item_id":"8d21a7241ebf46df","logprobs":[],"text":"\n\nHere + are the results from the three parallel calls I just made:\n\n**Weather in Tokyo:**\n- + Temperature: 22°C\n- Condition: Clear\n\n**Stock Price for AAPL:**\n- Price: + $231.45 USD\n\n**Temperature Unit:**\n- Successfully set to fahrenheit for the + rest of this conversation\n\nAll three tasks completed successfully!"} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":168,"output_index":1,"content_index":0,"item_id":"8d21a7241ebf46df","part":{"annotations":[],"logprobs":null,"text":"\n\nHere + are the results from the three parallel calls I just made:\n\n**Weather in Tokyo:**\n- + Temperature: 22°C\n- Condition: Clear\n\n**Stock Price for AAPL:**\n- Price: + $231.45 USD\n\n**Temperature Unit:**\n- Successfully set to fahrenheit for the + rest of this conversation\n\nAll three tasks completed successfully!","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":169,"output_index":1,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\nHere + are the results from the three parallel calls I just made:\n\n**Weather in Tokyo:**\n- + Temperature: 22°C\n- Condition: Clear\n\n**Stock Price for AAPL:**\n- Price: + $231.45 USD\n\n**Temperature Unit:**\n- Successfully set to fahrenheit for the + rest of this conversation\n\nAll three tasks completed successfully!","type":"output_text"}],"id":"8d21a7241ebf46df","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":170,"response":{"conversation_id":null,"created_at":1787817548,"error":null,"id":"resp_01a0423a-d598-75f1-ae79-dd0e93522eef","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user is asking me to summarize the results from the three parallel tool calls + I just made. Let me provide the information for each:\n\n1. Weather for Tokyo: + 22°C, Clear conditions\n2. Stock price for AAPL: $231.45 USD\n3. Temperature + unit set to: fahrenheit\n\nI should present this information clearly and concisely.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"b53fc9d46fbaee18","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\nHere + are the results from the three parallel calls I just made:\n\n**Weather in Tokyo:**\n- + Temperature: 22°C\n- Condition: Clear\n\n**Stock Price for AAPL:**\n- Price: + $231.45 USD\n\n**Temperature Unit:**\n- Successfully set to fahrenheit for the + rest of this conversation\n\nAll three tasks completed successfully!","type":"output_text"}],"id":"8d21a7241ebf46df","role":"assistant","status":"completed","type":"message"}],"previous_response_id":"resp_01a0423a-d0f0-7751-ab7d-0b439dee5ff4","status":"completed","usage":{"input_tokens":850,"input_tokens_details":{"cached_tokens":0},"output_tokens":161,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":1011}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "Tokyo", and + (2) call get_weather for "Paris".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423a-d598-75f1-ae79-dd0e93522eef + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817548,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-d598-75f1-ae79-dd0e93522eef","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817548,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-d598-75f1-ae79-dd0e93522eef","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"a738c17b0d9c84bc","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"a738c17b0d9c84bc","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + is","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + asking","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + me","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + to","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + call","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + get","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":"_weather","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + for","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + two","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + cities","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + in","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + in","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + a","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + single","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + turn","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":".","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + I","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + need","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + to","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + make","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + both","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + function","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + calls","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + at","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":" + the","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":" + same","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + time","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":",","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + not","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + wait","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + for","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + one","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + before","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + starting","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + the","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":" + other","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":".","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":"\n","item_id":"a738c17b0d9c84bc"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":45,"output_index":0,"content_index":0,"item_id":"a738c17b0d9c84bc","text":"The + user is asking me to call get_weather for two cities in parallel in a single + turn. I need to make both function calls at the same time, not wait for one + before starting the other.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":46,"output_index":0,"content_index":0,"item_id":"a738c17b0d9c84bc","part":{"text":"The + user is asking me to call get_weather for two cities in parallel in a single + turn. I need to make both function calls at the same time, not wait for one + before starting the other.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":47,"output_index":0,"item":{"content":[{"text":"The + user is asking me to call get_weather for two cities in parallel in a single + turn. I need to make both function calls at the same time, not wait for one + before starting the other.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"a738c17b0d9c84bc","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":48,"output_index":1,"item":{"arguments":"","call_id":"call_bfd2598188fbff46","caller":null,"id":"999237f1d6ca71ae","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":49,"output_index":1,"delta":"{\"city\": + \"","item_id":"999237f1d6ca71ae"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":50,"output_index":1,"delta":"Tok","item_id":"999237f1d6ca71ae"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":51,"output_index":1,"delta":"yo","item_id":"999237f1d6ca71ae"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":52,"output_index":1,"delta":"\"}","item_id":"999237f1d6ca71ae"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":53,"output_index":1,"arguments":"{\"city\": + \"Tokyo\"}","item_id":"999237f1d6ca71ae","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":54,"output_index":1,"item":{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_bfd2598188fbff46","caller":null,"id":"999237f1d6ca71ae","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":55,"output_index":2,"item":{"arguments":"","call_id":"call_bce9dbc4606bdf29","caller":null,"id":"b6e6f9c7c5026655","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":56,"output_index":2,"delta":"{\"city\": + \"","item_id":"b6e6f9c7c5026655"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":57,"output_index":2,"delta":"Paris","item_id":"b6e6f9c7c5026655"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":58,"output_index":2,"delta":"\"}","item_id":"b6e6f9c7c5026655"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":59,"output_index":2,"arguments":"{\"city\": + \"Paris\"}","item_id":"b6e6f9c7c5026655","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":60,"output_index":2,"item":{"arguments":"{\"city\": + \"Paris\"}","call_id":"call_bce9dbc4606bdf29","caller":null,"id":"b6e6f9c7c5026655","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":61,"response":{"conversation_id":null,"created_at":1787817549,"error":null,"id":"resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user is asking me to call get_weather for two cities in parallel in a single + turn. I need to make both function calls at the same time, not wait for one + before starting the other.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"a738c17b0d9c84bc","status":null,"summary":[],"type":"reasoning"},{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_bfd2598188fbff46","id":"999237f1d6ca71ae","name":"get_weather","status":"completed","type":"function_call"},{"arguments":"{\"city\": + \"Paris\"}","call_id":"call_bce9dbc4606bdf29","id":"b6e6f9c7c5026655","name":"get_weather","status":"completed","type":"function_call"}],"previous_response_id":"resp_01a0423a-d598-75f1-ae79-dd0e93522eef","status":"completed","usage":{"input_tokens":983,"input_tokens_details":{"cached_tokens":0},"output_tokens":96,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":1079}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: call_bfd2598188fbff46 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_bce9dbc4606bdf29 + output: '{"city": "Paris", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817549,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-de62-72e2-8783-b0729e5009e0","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817549,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-de62-72e2-8783-b0729e5009e0","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Paris","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"ticker":{"description":"Stock + ticker symbol, e.g. AAPL","type":"string"}},"required":["ticker"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"aa5b8d215fd3a454","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"aa5b8d215fd3a454","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + is","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + asking","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + about","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + the","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + weather","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + in","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + the","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + two","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + cities","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + I","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + just","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + looked","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + up","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + -","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + and","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + Paris","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":".","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + I","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + have","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + the","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + results","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + from","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + the","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":" + function","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":" + calls","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + I","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + just","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + made","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":".","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + Let","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + me","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + provide","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + a","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + clear","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":" + summary","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + of","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + both","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":" + cities","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"''","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":" + weather","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":".","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":"\n","item_id":"aa5b8d215fd3a454"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":50,"output_index":0,"content_index":0,"item_id":"aa5b8d215fd3a454","text":"The + user is asking about the weather in the two cities I just looked up - Tokyo + and Paris. I have the results from the parallel function calls I just made. + Let me provide a clear summary of both cities'' weather.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":51,"output_index":0,"content_index":0,"item_id":"aa5b8d215fd3a454","part":{"text":"The + user is asking about the weather in the two cities I just looked up - Tokyo + and Paris. I have the results from the parallel function calls I just made. + Let me provide a clear summary of both cities'' weather.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":52,"output_index":0,"item":{"content":[{"text":"The + user is asking about the weather in the two cities I just looked up - Tokyo + and Paris. I have the results from the parallel function calls I just made. + Let me provide a clear summary of both cities'' weather.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"aa5b8d215fd3a454","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":53,"output_index":1,"item":{"content":[],"id":"bac67a0dbf2b6807","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":54,"output_index":1,"content_index":0,"item_id":"bac67a0dbf2b6807","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":55,"output_index":1,"content_index":0,"delta":"\n\nHere","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":56,"output_index":1,"content_index":0,"delta":"''s","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":57,"output_index":1,"content_index":0,"delta":" + the","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":58,"output_index":1,"content_index":0,"delta":" + weather","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":59,"output_index":1,"content_index":0,"delta":" + for","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":60,"output_index":1,"content_index":0,"delta":" + both","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":61,"output_index":1,"content_index":0,"delta":" + cities","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":62,"output_index":1,"content_index":0,"delta":":","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":63,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":64,"output_index":1,"content_index":0,"delta":"**","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":65,"output_index":1,"content_index":0,"delta":"Tok","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":66,"output_index":1,"content_index":0,"delta":"yo","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":67,"output_index":1,"content_index":0,"delta":":**","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":68,"output_index":1,"content_index":0,"delta":"\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":69,"output_index":1,"content_index":0,"delta":"-","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":70,"output_index":1,"content_index":0,"delta":" + Temperature","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":71,"output_index":1,"content_index":0,"delta":":","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":72,"output_index":1,"content_index":0,"delta":" + ","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":73,"output_index":1,"content_index":0,"delta":"2","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":74,"output_index":1,"content_index":0,"delta":"2","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":75,"output_index":1,"content_index":0,"delta":"°C","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":76,"output_index":1,"content_index":0,"delta":"\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":77,"output_index":1,"content_index":0,"delta":"-","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":78,"output_index":1,"content_index":0,"delta":" + Condition","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":79,"output_index":1,"content_index":0,"delta":":","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":80,"output_index":1,"content_index":0,"delta":" + Clear","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":81,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":82,"output_index":1,"content_index":0,"delta":"**","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":83,"output_index":1,"content_index":0,"delta":"Paris","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":84,"output_index":1,"content_index":0,"delta":":**","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":85,"output_index":1,"content_index":0,"delta":"\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":86,"output_index":1,"content_index":0,"delta":"-","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":87,"output_index":1,"content_index":0,"delta":" + Temperature","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":88,"output_index":1,"content_index":0,"delta":":","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":89,"output_index":1,"content_index":0,"delta":" + ","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":90,"output_index":1,"content_index":0,"delta":"2","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":91,"output_index":1,"content_index":0,"delta":"2","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":92,"output_index":1,"content_index":0,"delta":"°C","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":93,"output_index":1,"content_index":0,"delta":"\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":94,"output_index":1,"content_index":0,"delta":"-","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":95,"output_index":1,"content_index":0,"delta":" + Condition","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":96,"output_index":1,"content_index":0,"delta":":","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":97,"output_index":1,"content_index":0,"delta":" + Clear","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":98,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":99,"output_index":1,"content_index":0,"delta":"Both","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":100,"output_index":1,"content_index":0,"delta":" + cities","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":101,"output_index":1,"content_index":0,"delta":" + are","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":102,"output_index":1,"content_index":0,"delta":" + experiencing","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":103,"output_index":1,"content_index":0,"delta":" + the","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":104,"output_index":1,"content_index":0,"delta":" + same","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":105,"output_index":1,"content_index":0,"delta":" + temperature","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":106,"output_index":1,"content_index":0,"delta":" + and","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":107,"output_index":1,"content_index":0,"delta":" + clear","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":108,"output_index":1,"content_index":0,"delta":" + conditions","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":109,"output_index":1,"content_index":0,"delta":" + right","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":110,"output_index":1,"content_index":0,"delta":" + now","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":111,"output_index":1,"content_index":0,"delta":"!","item_id":"bac67a0dbf2b6807","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":112,"output_index":1,"content_index":0,"item_id":"bac67a0dbf2b6807","logprobs":[],"text":"\n\nHere''s + the weather for both cities:\n\n**Tokyo:**\n- Temperature: 22°C\n- Condition: + Clear\n\n**Paris:**\n- Temperature: 22°C\n- Condition: Clear\n\nBoth cities + are experiencing the same temperature and clear conditions right now!"} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":113,"output_index":1,"content_index":0,"item_id":"bac67a0dbf2b6807","part":{"annotations":[],"logprobs":null,"text":"\n\nHere''s + the weather for both cities:\n\n**Tokyo:**\n- Temperature: 22°C\n- Condition: + Clear\n\n**Paris:**\n- Temperature: 22°C\n- Condition: Clear\n\nBoth cities + are experiencing the same temperature and clear conditions right now!","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":114,"output_index":1,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\nHere''s + the weather for both cities:\n\n**Tokyo:**\n- Temperature: 22°C\n- Condition: + Clear\n\n**Paris:**\n- Temperature: 22°C\n- Condition: Clear\n\nBoth cities + are experiencing the same temperature and clear conditions right now!","type":"output_text"}],"id":"bac67a0dbf2b6807","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":115,"response":{"conversation_id":null,"created_at":1787817550,"error":null,"id":"resp_01a0423a-de62-72e2-8783-b0729e5009e0","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user is asking about the weather in the two cities I just looked up - Tokyo + and Paris. I have the results from the parallel function calls I just made. + Let me provide a clear summary of both cities'' weather.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"aa5b8d215fd3a454","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\nHere''s + the weather for both cities:\n\n**Tokyo:**\n- Temperature: 22°C\n- Condition: + Clear\n\n**Paris:**\n- Temperature: 22°C\n- Condition: Clear\n\nBoth cities + are experiencing the same temperature and clear conditions right now!","type":"output_text"}],"id":"bac67a0dbf2b6807","role":"assistant","status":"completed","type":"message"}],"previous_response_id":"resp_01a0423a-daa3-7ed2-b409-4d66d0f11d0d","status":"completed","usage":{"input_tokens":1111,"input_tokens_details":{"cached_tokens":0},"output_tokens":106,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":1217}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-nonstreaming.yaml new file mode 100644 index 00000000..181c617c --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-nonstreaming.yaml @@ -0,0 +1,712 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call get_stock_price for "AAPL", and (3) call set_temperature_unit to + set my preferred unit to "fahrenheit" for the rest of this conversation.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812422 + created_at: 1787812420 + error: null + frequency_penalty: 0.0 + id: resp_03b3a7d518e62f29006a8fda44ad0887d0bc8a407771b366c7 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pGkpFbHzHSvaNXsCwwvtudXw__-TOcEqzeS5I-af-QN3Opgcrd0fkcn_tGTAmnn9ZbfBQui2-24VR8TG0Kk00CaCiH9l0KwGbh4FTBZ7fOqTUzU-EMMuoUy94NYUTcR-HgeqAEOkADbjbi_VNRZB4QpU2HGK-cURCDZrFXulbzpCk4A0GpoM6q9L-8YXwsFiTTRpJmHSijkZxqLdehXVefTHdnc7tmsNi2DbFpiALYiqAYi-gM9U83yUyJ6ED9orI9jDmLIkGcpWztrqfSepnKBWXo7DdjJiMILulxv4O35EjmTXouyAtPwJLMT2Drr_oWLETMDiNJKJi3nygCEe_g3qzZzE7ke2SNOq_jA5VRHBdb8INbRui9LUYA9hRXuYVh8BZzXDNMxfL4As3o4VR_hqC9zxtB6UsCrm9Ho4FttuuwZzHjccgGSaY6k9IAcJWBXfhujNK6dwonLVX-mfNjwfyzr-86920aB0bYIPlfy0G87mdLWED3dsRt7ahzxaDv-J6o-Tw1dglXXOG1MQftHcu6kDDnNByoN4xJlV7IMsEB4AjtIe0ZQYUIIg1uYBIUUO2t6sz-Hz2-8D0giEDW5ULswCNHCuvkgfZa4yvjej-6AhTh3rHIFRAqQb108EFSSZPggB-1t2ynro68OJJSdUgb6X9dv-z7KTTj8r_DsKbirp92MaYoCgA8i0GwwjUbL2YXJglsVNBxDNiRhqEznZqVaNmc0C7x1dzVXhAIVCP9O36TrEpz1xaCrVdSdB9mu2VoEDLyV4moH2dPG539t4zWTTpiipYix6RP7I4w4tU57uf7K-aWhciR6KXBLAX6E-vj6dOeVBxH6LwvMRGB1NS4K2yuCZFHPqKc2OsuaQrb3SyNHJI3a7UWFCQGASyCwp_k1wsCItbho2V_QyGuQ9h4pQrnBqI4OICCl_xrAfSMG_uzqltvLz6SsDRzYSosojrywIwiXCsz8B8vy6KVDYTD8LpnXuI0SRICt8kp9x6RMvV5Mnxo5XilX6Cux1WqLVkyuLzEFmVNhg-fDtfbSOZyttDu79kF51TmPV_K1UfES9cBRN-t9hQB6kHEiDVnnx3wDsdqeXR47AH5R98I9l76TWE5myilcknNDhwIwfcEmwLIG2tCxVkadSQ6FAYTpKsjIESADfn5wY_VKKwCGLLc0H2_PdQOljSQxGCBmZa2uHBm9-TSq9QEPBOnrUI7MdpneYYdYzJDiDFC3zFHKV599F1xL8wl63vxKOMwWZHZQ_ExZhHL9zMS9Ltk4bf8eA7dc824rFAI1NZMuiNW1_lHFJVccAh9V1Z1d0d4Cl1eKvu8-5CNMje4lAqqM2vcYvFx1SyjzeQRL6d5VUfWqD9WC_OQ9uJ7StJHJYB4FUOg8Ph7PZ7kuznwABQ87522cHGKG-4SFuHclyjCkAv_UVOSWGYmEu0HeU1850jLgNpU-NY8nLrnN68uiXzz-CHY0HUMmjDk2fEaIBd4fXSz3PdGmsC_ft8i_Le_XFCHkRb-GBjPkyaIInFbaAcdbIPbJoHNiqiDFsj-8ScDwSS7DXyBU2CEQGq3aP15kAh3usEcimS4iKw13BZ6BzS4X1SkDaxz9x-04kBn3WPSilFvQW9MYL75Z9_IofXg9iSQ3eGqmlHbpdczhBjclkgXXJlY + id: rs_03b3a7d518e62f29006a8fda452c7c87d0bf4b7d4d0f0efb5f + summary: [] + type: reasoning + - call_id: call_aYFw8deNQVL4tikZDFFDTwql + id: ctc_03b3a7d518e62f29006a8fda465c5887d099228530bacd4e88 + input: fahrenheit + name: set_temperature_unit + status: completed + type: custom_tool_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + output_schema: null + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 228 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 92 + output_tokens_details: + reasoning_tokens: 76 + total_tokens: 320 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_aYFw8deNQVL4tikZDFFDTwql + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: What did you find for the weather and the stock price, and what temperature + unit did you just set? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_03b3a7d518e62f29006a8fda44ad0887d0bc8a407771b366c7 + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812424 + created_at: 1787812423 + error: null + frequency_penalty: 0.0 + id: resp_03b3a7d518e62f29006a8fda46fb3887d0af4f34927e176083 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pJb9Wh0ZDIE_y8P3E0DhgprwZpP5Q4-BNtFvsTzM1yy3lX8pzMjuxjooW0KgLoKKc5WqmIJpdHHumUcja41CWr8YNSeUcKEb64iJhkK5i6c0SclNfITGnP_s53p71aSUTlQAnrAgqL9oQt31Sytp98hOxjuTWZGt8WLjGX34qUCLUtZ8jHtIBmhmtdtc5p8EtFywtw7n-PKBZHh_cbvpV6-tUWzVYygBXIDA9IO2rejfaLJfKK6djJnOrUvKwJ0lOJTq_WnQj5mfd-J6qmqXjBxtHFMCuqTJ309cC_ep2pXtES816xd6j6bFZtOS5qX_zFb4JyNFfjxJ8D7lguVpQZORtmoIywEqYN6L0yCbovh7qMgIJ8tXSpW2DEGn_Riv6aFNBZqg-0-bHIG-A-WcrNazLpnxoTRr3sG6uRmstAGmpSlqd_Lq7SuP_8CQxtk0ms4CcahDKOSDOPhPrPI3ZNVcctahzk7zzzqzODwv7nQ0pGqHL2FoAmAu6xPWlev8Vb8GlMO9Thz3sJn4RJv2a9H7MGMgzKh2-4aEsKAjecLdifDV1I4gYcpElV_H0jSLKwoxIP_9l5IwdqGuahbO3huYRR4HO_TQ2TvUVM63v9vG9mUC_srSIInv884ratoFKHKi__kZxhyvmQwddvmoDo6iRsGtTLin97g7AX_muNLV8rKAuuHR1LcOwVJB0HnvhXDAjHP3jr3nkfXB1N_72ZF3ryhH8La4DXbC1drxHw5On1E3LQOkPTktaDMPWQJIkO1aCH7UXQjyrQmdCUKVugZcuqeXg0nKlYRqCkm1iFM1uWpMdhHut8UcqghY_dYSay6Wl_OlJ2Xa8y0wwck7RNu0Mh10rCN_RItyX_nNEt76LdVWkg1oWBM2DW00fta_5jz8Ky81vFVUB8lpqjSuC_o-NJrstaKEVHAdDW_METZoT5I_EyNtvTFSyKUHg5TP8tw6tJN7Z3qsf5HXzI_WDIdtFlRY33SmitrI28ww_iQgQKPTqRLK8i0QS0auvF0MZMSlrFlkVpyFS1Zugoj7-R7TOCiLM2V1BfSpbaNbVxya7t0Ph1v0BKuDbA0dYuuI7SR_83owoKyvsKwBHkfxvqDPW2sySmZoNJ79irF7zaqb1NjYnULDRzv4Fp0Yb1I_cOouGGVfxCrM9g2MY8cm-LbghUNuLG6PB-Ot7rgMylKJN5UhSIAgxTqmWASLz-s7pfBll3GiS9HQWXVSO5_OKf7Ms4wT2iPI6hlHjt_ehdSk-mZndMpYyfvTTu7aJjECtQCaq3fcS0hzCZrn9AxUywEw== + id: rs_03b3a7d518e62f29006a8fda4841c487d0bbf1b2c8000b4e4f + summary: [] + type: reasoning + - arguments: '{"city":"Tokyo"}' + call_id: call_eHt3sJIa8qWtlFZTGPK458I2 + id: fc_03b3a7d518e62f29006a8fda48bd4487d0bcda74e25a9b41c0 + name: get_weather + status: completed + type: function_call + - arguments: '{"ticker":"AAPL"}' + call_id: call_uXK6tWBlWZkbP570sOxb0Gi4 + id: fc_03b3a7d518e62f29006a8fda48bd5c87d09c32542815434f41 + name: get_stock_price + status: completed + type: function_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_03b3a7d518e62f29006a8fda44ad0887d0bc8a407771b366c7 + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + output_schema: null + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 370 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 75 + output_tokens_details: + reasoning_tokens: 23 + total_tokens: 445 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t3 + request: + body: + input: + - call_id: call_eHt3sJIa8qWtlFZTGPK458I2 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_uXK6tWBlWZkbP570sOxb0Gi4 + output: '{"ticker": "AAPL", "price": 231.45, "currency": "USD"}' + type: function_call_output + - content: 'Do both of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + and (2) call get_weather for "Paris".' + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_03b3a7d518e62f29006a8fda46fb3887d0af4f34927e176083 + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812426 + created_at: 1787812425 + error: null + frequency_penalty: 0.0 + id: resp_03b3a7d518e62f29006a8fda49829487d0a8fcba49f5783cda + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pKvU9K51SQp7Cb__PSXFO5vFVVLyiBfYhf_RduJLMmJXDDO5VjFCahUMtWKfCEOk1RlWooB7mCe5IsbZoJV7hEoAyss34TuyvWC0hK3ZZuW1Hs1Mclro_3BzeJ6ecVcQ3ZDi4Nfv2O9yDRyB8iOWtLEmfNfAwpUVzRjz26KfV_F3PMc4JDecMyJEGOovHAKnvZR8spOnC3jw1f5gkRxu288XaFLpG68iswUlWSHECc0r2-A5CUf8tblXsaNHWTrUzSvT9M1EDf68NrvTSK6HvPJUFdZ8TFojPvGVi1T1tNAaNGRi8zCXdARpFtQF_qQKxk5wkNF6DdgMe7XwlRrt3hp65vOQzlItx6IUc_MQVRwgqH_RXQH7J0BaTawWGyErczR1xNDqiJh9Xx0-_-FwFu71iBhkZQn-9Rk5yYdyZ2vkTjLidl5uEQbOcFec5EeUxd5BIQ49E11GtZWIuloQJX7k7bbP6aX6KBbJ9A31Ap9PCyadRlnWYboNpsYtsyhocG5K7gHhxQU9pI8odJm-CIvYikXi5-uYvgn6snAU4kwRxixzecorxkdnzz6r2PR3SC5N8Gp-gxzNEOAvum052D6tte-jyVkuwYCfZfAeNU2YeblX0e6B0icZqRetA-9Zz9ld6HWw9QPIxGuqBjmkKlS6JiosJaxQNiN3Jg4c6_yskxvlf4ZyhvGe7bZ9z8oeGhuhZmpFE5AYHSTU2XtDiz7PbrrSSG8vPiJdGZWvzcu7laJ_Zbxir-4scvqIbhaJqklrQPvgDocoMheJpDTLhV9ESCuR13TW2i8u72nauW6XzWEDkTBBm2wth-JRvdQ6ZMVgXD0pPQD3e6LSraeLx3XDTmOKOryyzajknQ98SXJlPZ3BcBYsgc41Xm60EWOhw9Ejume84El2z6RuPhLYjzerYHkIP1va9P-UVskU8zBWiIT_wLZAiGU0XmmmlUFz78dGDGU4-32dCvcOLN9S3jaDMOZ0WQP3rmZuFNAQ4nbFC4-dgjti06oX0MnYgTLbSBmsCKLp196XrnORAk9ciTv1gjI-FO2HuT_Bdhay1eNIzuL6CTzbnUHhsysKzjLgnE6kCVx23wjC_ZHyA2xrkn-rAOuDsam8yzIhpANYiFxoEm-hrQ8vbElzbraIt4SiFyslH74zoI8jb7UOTWArR2YukJUE4RJqmyEqQ4Hn6-Pkd9Z2-s7YF_0j2P5ukZ1cf4tLbj4f8GvMoz4rQWxH7YCA== + id: rs_03b3a7d518e62f29006a8fda4a248487d0a58ea8aa99798032 + summary: [] + type: reasoning + - arguments: '{"city":"Tokyo"}' + call_id: call_rP63VS4OqpFKmZo2wOTg5d6U + id: fc_03b3a7d518e62f29006a8fda4a913487d0b5b509fc44ef551a + name: get_weather + status: completed + type: function_call + - arguments: '{"city":"Paris"}' + call_id: call_6R4bvcCLMiyBmbrnDCZ9H41e + id: fc_03b3a7d518e62f29006a8fda4a914487d0a91f984d86519e54 + name: get_weather + status: completed + type: function_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_03b3a7d518e62f29006a8fda46fb3887d0af4f34927e176083 + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + output_schema: null + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 555 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 62 + output_tokens_details: + reasoning_tokens: 12 + total_tokens: 617 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: call_rP63VS4OqpFKmZo2wOTg5d6U + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_6R4bvcCLMiyBmbrnDCZ9H41e + output: '{"city": "Paris", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_03b3a7d518e62f29006a8fda49829487d0a8fcba49f5783cda + store: true + stream: false + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812428 + created_at: 1787812427 + error: null + frequency_penalty: 0.0 + id: resp_03b3a7d518e62f29006a8fda4b419c87d0a289c88c108f1d5d + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pM-5fMzmr_O-KfteHXiJ06f1OR2PBRmMx5q9k958TBlg50geQkq70uj0JPfYjtMsMqn3Uoxam94sENgcpJXIzcqiFD9tJ0gnrqry2SMmkZ-4CgcwI9IiCx-amUv5Rg8zNtMIq10Xpl846NCGQR3OQCLB1Tx-iu_1KC7t_A9TPfoc_MWGWaqLK0b0434KJvdQ2pEb2FMtMVfhO6JA-qQcly0oLKUAlsl8hD-k_Ks9vk8TG9GQIpOcWzpNxeWS3SjH-muWM_IcgpslUUtmnORb_KhjcdJDs9zX07FHYfHjrGN2BCWunRChnfbwGuXHtXYuNYhFUORwbrLtAY5ZsZyVktbO7nYV3N5KDFoulpWs4nxRlSEw0ok1JiENgvoZUo_Cw_gLlF2uS9UjKUMWWP9bKzw9-no2ciMhby2S4MzQJegERrwpLJK7EXtKGCy538hIRnYa_IUJ8qUmEgIlEIzIxD80WgqMkl8AaccFdAiPHFMtq1ifd5OAZz11NxiXtSfeXhzduCaquxoyaJz8sCXkYXZzXT6qVUuTrNaOgBWwBK9nXQKWjcVGSe_E6VkRMVhYsQ79bPKKdaJjj24iJydhM4TJyyGX-T_sPgMJekb38pvj6GNGYapXz9_mTlCo_N-iqsRGR-hQdVHFUlvxB3NeLLqfrB-qH2YFuzDWDaPDcuOJ905V-ItbsLwmKYZUHJDxNjw1HeGLwkBP4b9DdGo1RY1UlW7enhOT8d-7CdWEDVPOIBq3ueRl_8XEY1XVjKSDo4KBnLe5qn2oEi0CFkI5BM-bjfuiPhAafn8nVyo5iHLfLJavh6bxKG0kT2WD3Q40D1_sO5hRdBGRvv88uGNT57e2gRp_L6OvoaioM44tWTE_l4_fUkt03CqYVIDWjJEbzRGyb1jt2tuubH0uQtqvbvvZYtUusEIXVRyspTO-kJrPFBg-MpZTmhGcIP0ZtQWrihMTGAX8BSSgLUUSNzwnwEDSMMuEI43H8CEs5uQTscI6XMkNFvefBuQIOhpTJsmQr7-2ZMJHvP-XiSeV7QV_TsEuDtoLtFaujyZzHu8CxchHbqZ-Dd_YuZadjxdme76b4uaTDkUWZWNP6_GMjkIRXR0frBeI6XjvK-UvVBVSOkT3tMcsblJefFzj2XEuPBODt0zrigRNAapcuU_36_M4QVVON29_Nn-fH6OfZy4PI-XyX-7LiMIZgXxtTQF2TS2eYqrLD9laTNej2-r29Qczm4NjnapTUkH9ApC7so6acsXN0= + id: rs_03b3a7d518e62f29006a8fda4be71087d08ce7e5f041a59034 + summary: [] + type: reasoning + - content: + - annotations: [] + logprobs: [] + text: '- **Tokyo:** Clear, **71.6°F** + + - **Paris:** Clear, **71.6°F**' + type: output_text + id: msg_03b3a7d518e62f29006a8fda4c278c87d0a60ee6f670b2f63c + phase: final_answer + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_03b3a7d518e62f29006a8fda49829487d0a8fcba49f5783cda + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + output_schema: null + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 689 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 53 + output_tokens_details: + reasoning_tokens: 23 + total_tokens: 742 + user: null + headers: + content-type: application/json + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-streaming.yaml new file mode 100644 index 00000000..7d385c4c --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-client-openai-reference-gpt-5.6-streaming.yaml @@ -0,0 +1,927 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call get_stock_price for "AAPL", and (3) call set_temperature_unit to + set my preferred unit to "fahrenheit" for the rest of this conversation.' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8","object":"response","created_at":1787812354,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8","object":"response","created_at":1787812354,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0fcd5b09312e9e37006a8fda029cf487d0a312c6bde200476b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oCL7GawaCSm1g_EULqvMq2U2JW0g7jMzp8vvw-0qNV_ifMIA6ESKTpkQJyjMOYV5-J5KsyTO_Fyl4ivuF3HvZMbKKXPq0i0ETbjrAngSASd2LbSqZvNI7x7Tg-j6D7L4ibDnORSDlpxn9S5J6mlrJjyxaX2cAvUn7G7gjwfLY99NbMDxPSUjbFjLceNxJhtAnf1KOPVNtS203sIdD-RvAH69-5-h29ukMrd2qzh03KOkD34Zn0fkGeJL1kaypMO8lzoi76hVBuNkKv6pThPrV0vwSJzopmbGZiw3Q5fxcoIEcoQ6ACQqmXcWJ_B92q9gfFmwxuju0Ik1ZBB-H_KbjLtkSXpNAzlIkE5fvFtnRuV2owuh94bzX26ZU3uKI6hrM6acxdvPWmnS1MpW_CmcBNWQi479p5YaI9m6LUneVZKRhG4ZmFiVqyNMBFr3Gky3ZjFPzSluCmj6BntLwp3IvC6q3FXFBVcNwFs45TPGMhIKiPSDyTfSfWCYLqUBQS-aRamlbxYSv7VcqU5y_afVI8PijdcSBc0oTjxiU5ecJnMJp7xH5WyW3Xu_lYIYA1DYWrRuM1Ev3AcT8V6LgtYFgud6qPw7xrEn0RvL75CGxImza3j4HPYJlVWaDEpzqSlcbM6CMmbxD8IIyNvMW9BOiPfcCPyTT9xwDUYReEtUn72WsmA1R0lIMoo3tFtJDh4CD9hTDFPV8p9uFaDjJPXWz7s6aizcBQxI1MsQYzaBLrAlAe2pa5FjRTe4VC2YRf-qrmcA8eR1DSVzjKAdawnkRpnr17hBtk3UvdPWNf96_9pITIg-yxaqg3KxyC5J3cnYd_QC0oP8B5p3imw_kYYHFYSj83jGBQki5D0R8s54U-Prm_57wQ9MZmYJcN0JHI1Cp19X4M7CL9C2t5C9HCXgPwv0kyQehcs4xHdpADC2FdOB0zPI80QpHXL1VQxfcrQLKsOXDfEXO5EcSmS_PVos9zlL9Cx-bQk0BX91aB1cxlrTC1eJvsB7xYujSpkKwMHlq8mub9dqBAwcrqPE4pRcVgF8sds-EW-LQJJ97izmfc7eH-ZY9lfyKLGndAI1sH6YGz-LPzpZI68pCWhDfpdndlHmQ_uOPP5-_o9QGrKsWshLeewIXl5sZltCBI2sDj7UZ9zyxl-ufWhfsTfH-eva7bsA==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0fcd5b09312e9e37006a8fda029cf487d0a312c6bde200476b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oD4zdRMHWUvPg0LNmwzEHBkWuQDuip7kI2L779w3C6ck01q0jk0oVUnkRkHK7P2JsvJmpbxiM8C6GKYrleECo2ScuSOwGKk_NoBaRMkpcN08Gm2t4ucnLnws3d4czBEvp3cBVI5I3nNv5-vWiQMVX14EkxKbdETGzW9_uY1Qz61LOepf8p50yUsIzqPLncga-WhElZZ8-DQG1yg6FKTh6uD1UPEWt2UOc7L3f2uUx_QjSg_oNfL7N_QnWklz5GX_obMjYRKC5R-TYJcyfnF0Hv2wL9ZYsJfvXXxfZDKr5iTgDYHn5Zhr-EYQRpRlFMcdoPJNc6O6VlqpLsC9-MBJdDkzxb8IVzuoGMmz0MgwY1HiEfJsypFKvuRtjANZwiKjf_5FQSLq-tUA3E0G2AKqkCUlCh4DTLF3bnpmN6sUZ1DwDfh_MVSB57AQ2bjczC1OzlTHe6Osjd_0E9Xe6DHm9PqfE0x47aDxgYF6Fl74Yc88C5f9vXaPSGt52Mtm6KgZCu4OWBzhuItFfiUKNACB4sRit8kY5O3HU79GGMTcdDNHzK6hdVpB1l8GYkKWir2CHUqkckRlQxQ6xvpCPYzU7Y_OBWpOJ-C2nrSNKTH1n_Y6Lpi7fKHk5wTEBzAm5I2LFQTFr2Nrpa5xJcBQIzAVyuiLIdeslMSR7qcALnz3YT1YZ8icQDW8DLY2R9TYz5Rr439ncoB-Z-tB9yvx_Kst2hmnTkNG5BqtmZIAdn985CwP1a6tn57tXVu8q6wztOSC8HEiqi-xo82MnVK5zReYqzNhHrj6yLMeubswYs8kpQ7L48nP4ixw-oC4CCbUDmvvD1uCZ0KU-TUqszMrkNhDbtg4yZPlC8mz_l-eNXKM9-lJ0dyfIvOeS_pYmN4ZjbfE_rIRL_615x2LG4ejFbk6h3bKGZMjL4H0jChIfNmFR-VXTezzhby8hS5sEOn7Y4NPd-N4jvumEOiw5PqR3YrAcpQLgaF7aPZH04sIl-Vft53ez4gf5jrAZOGf6yFZytfBma21HQV3hIgJrntQuiphwh9jn79ZG5WOzK_cFtSLhGFOAjt5FDPt0lWx95w0T0QIpPkMzHezZoDj43OYDKu6oqPIYSl2tLV27NmByGf4LaYyV8NQV6EfSJvGUN4QJHWNTbMwDtEGUfvoElgcEfvCdh2A0n-81gTUyLy55E78_DjRR2lAUaEpolzKV3YfJZbyyu8g8KEauulCqq1IQEWBcz0IkiT-_QYirocdGJ5fZCgw6-pS5NVjZ8DE9U--TkEn_nTCzmM9-w0sVME90PHI5r89MmGaIRP-gcOWmGYPP5GfH5sqEvLIdtxhBOIvvuPOOhSwi-iJ6FhN-0tdhV3oObmqyvdN23qmrWq6vpUEnDSMF-e6JmGL7uxRGYnt2ePePUFyJ2tdJm9Il1PO_vuDlasKK4QfFDgY0cYR33RNuSDcl-eDLstXlhFCGbyKqFPS_a","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","type":"custom_tool_call","status":"in_progress","call_id":"call_1tuS1yjNz1ux18bU6iZIzm9C","input":"","name":"set_temperature_unit"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","delta":"fahren","item_id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","obfuscation":"5yrQ0vRr4q","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","delta":"heit","item_id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","obfuscation":"UrG6ViPQoGcz","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","delta":"\n","item_id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","obfuscation":"fbzBH9SNCGl5az8","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.done + + ' + - 'data: {"type":"response.custom_tool_call_input.done","input":"fahrenheit\n","item_id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","type":"custom_tool_call","status":"completed","call_id":"call_1tuS1yjNz1ux18bU6iZIzm9C","input":"fahrenheit\n","name":"set_temperature_unit"},"output_index":1,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8","object":"response","created_at":1787812354,"status":"completed","background":false,"completed_at":1787812355,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0fcd5b09312e9e37006a8fda029cf487d0a312c6bde200476b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oDKXU0yQi62j2eX_O5O5qTN9nhRGFEjDr0BquWqTVPnKbqKNkrsnZE7yGhvezjCJbUw4MPEEWj57qg0ieKdNCY_Pla4xo6LVLNFueE0WJF3HPUEjtsgBIx1hfwr28udmr3lHZ78DRI9CHNMuGQs_9sVB0fk921B3oqlOwDJ5by7A70fn8iOgpxCpRAvueXyTqEVCFI4IY5WdVX8Uo5hDY-HeWmQ2dG8EocGtTyPNfmZKqUCmlC_M1JDwn17dDMLE89f9k9leEaAubUs2la9g4EhJMT_P-WdWxWVtCsZ3z8BUFqC3FryOgzj9LClLNrZihcjzFDw4b-Gt5KzlnzO0m7f1EVPJENaSDp5SiCT_QdtAtZQuWgFTwVKowH01c3yY4HYlHGuY8-R--wt2ClpQ6T157zlSz60uV4FxPMenqpmtKZleI4sk3ubFfS3vO19-si0JotW62lzjaByVKWBupSrdvxRsLfQ_rHKMqerYYCmvd8Cq_sDfzskjZXoWdd5i9X6a59XT0kwFIrTxwuUxoubCqUWLIJh2PIh5qdrBrSBXM81tUYCGQSd5DURv3nkYxFoGXJ61IJexyh2eO-EOCf2r_h8r-HqpUzSTmolJXBg8kABLnidiTzHftfaw4Y-0VN-6nGWjYTe1WUbCJnt5piw76ceIMlHDaczxGTifU2P07DShs3MZGMGMWGhT6IuffieGQ9mgOZ_WzoS5dBygzrdVAZqUg1ahOv6oAQ_nMGla8CNEcjG9YDqF7mzTUuSMk31HcR4f-IytTuRaL26U_AOEvhtK6KtsRXCo6h4_u5a-gDzb1dKfCK1WjfstC5h3AXCayBtQgV-zmRJ-zI9juWIc6mviw2UIx_IF-cLW6v9M4R1v3gTFGut4ghWalER99BqOXXCnIqLqeQ9ExMt3mH9Ntz3gIEyDpzSlSUzhXgHj5ISfIyttCYghPyeU33fq7LNBhZF85yQhXEBvxAHBdO-2-hf6ciTKtGKryewcwX4-714wPnIVa67I5fxBRFi-0-0-RFi-f5e0lQ79cSS5Ja6sppetVIjbaEmM7LUGur4Xfd9vWXbixhEN07-acqAF9qMpMs2VXYFx13lq2PMBSp6FZbsuYOlHoGHIBbupXeJXMsz7XI_e1USpxATupNHdAZbCSZuCDy6V8BERU2_zBsuRw6thpfiKcNWPO7wS6ia0gcIxx_ETvIWIwGeqp_aCImt__DqsJ-w6sFQGpdYS9QW-Sks_JdDZQY6nTKJnuHeyysEY4kCOG5NTzTgwenAw0PXWEOI8fZb4n6263CAqwonXbQgsBMPUYrSgek5o5s2oeEYZQrmp00g-Nbbaw8cl27Dyi08pOywGcnDkm2Roo0nHxzWR13qhGNkofyE516phYjdS68q3OgNAWJLy_D1b-XovpWZQ0kqZuIn6-jwriBKSyCYTNRNJueKwo01jN6nsSwCj04-oqNAQpQCXuWP2a1","summary":[]},{"id":"ctc_0fcd5b09312e9e37006a8fda034f3887d0b84eecf54c422e7e","type":"custom_tool_call","status":"completed","call_id":"call_1tuS1yjNz1ux18bU6iZIzm9C","input":"fahrenheit\n","name":"set_temperature_unit"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":228,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":62,"output_tokens_details":{"reasoning_tokens":45},"total_tokens":290},"user":null,"metadata":{}},"sequence_number":10} + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_1tuS1yjNz1ux18bU6iZIzm9C + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: What did you find for the weather and the stock price, and what temperature + unit did you just set? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8 + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc","object":"response","created_at":1787812356,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc","object":"response","created_at":1787812356,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0fcd5b09312e9e37006a8fda04813487d0ad92815c30af1ff7","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oErt0-uvQ40W0f5_DUs17WYCxCCqq26GhWuGz0oWoAIgKRxF2CHXH_oqUCNJmzpD4gi-Mk5wtfXVYFqhaBglFGJzsihTDzrP3swsS_uHtIj6hTTsaL2etn7e57WYBMYRCdjtJECrAEDvISH34-k2FJ-AKwWnUaTFdi2gnKD5EfpRYnorBE8a3IO4DIeZJk8lvrIiAAeFCJ3wcCZmz0Th2gNHVzydUzPt2ZTUmqNQRbE2ZnnlY07wOysxGqP1AUGlqV_ojku9M4IzNqqPRbD3jB50HZWfgDCE1m1_U5vKI8-fFVcYbyxZe51k5_-Ea4vnVGWPNmqdN2A7LNdB1QKkCvvW8Zdn1_XhRfDOBaEWiPkL2fIh_8utAOtAbTDF6rNoZHvIKdMhLj_WKpqkcIMXYXOK6jzef3I-X9xAL7XVp3NXAE5q0CfnU2Urd8I21k8tSQJlv938SaW7maTem7AAW67S02VCBZc1bApiMFg2xbJfMz-tg7BFFJWdX74KJ-W31v08Z8_Fzjelpu5dwoYLapWuYXAz94Vj-TiGdhTLGQAvG-Y0lI88y7lquWq83IjdJsvVwTQ5BxwS2R3uFvT_d79zCFi3nwYfyegJwxDkiidnvMQQZtpRDpxfQg_-tw_bJnYqKtGRMQORMAf0i4ricIrDszYunkGKEX-CKkBC8ylz1XqFpa3kB1Yi3wlcb1sQ3wK3XaEpCqZ0RI6D0uQck7BnhYdS8hSpIjbseQZXqIh-RSQ16-FBrFoZRTr_2YKltZX7TfiU1doG3MHGGRmE20NZ6NNJ_Hmc-a3bFwKJtfL4EEjQUbzWEyWbMbl6kfsflh80yeGxnUSZEYDVVBOMMMW0dANNalrp3d8u7-U9XIhKU92say_tcZsD9CIw_Cs_wOi6t5lvqIBplL0MWTCIGl4VO4liUMWEfcml6Ac8uHbtavtIHx4UNP8pEJTlkWOev0EWBNWO6gf3LGNO3Nm2JH6ADRdfRBdJlgaY20Sny1htTaZmx3TXTUiBEMaKG1Y_gmYNmcyUrNfXJPH02EKKMLJ3l38zryOGW2Fc0aeGI_beaxBR1wfXXPbZ7BxbgdJlsoGxyfmGoiggN_pjBKJxQgYIR2vp-VHcFLoDjKBfemtydaMK_O_5vpENd4nJdGw_RxFdmgmQfwMVAbdD-EYsVF7g==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0fcd5b09312e9e37006a8fda04813487d0ad92815c30af1ff7","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oFqqkBN2DUq8jA9tIREaB0ShON8cvOy7w2derIy5tjosr1VGywSO0inIwb3sx--91u8NCqhAieh96P-ZLMrOBNJvvMtVO89vDZ1PKBQDEiqolnO4b4qdudFJfIyWyfsq5cjGgDZIyw8ismWRoLpupvrK7Lzx3Zvqt-Y04WRI8atRYRMi3z8d4Wdr6-d1dpH_i5gsXdevW0yyQChgc7Wutfpevg6ojUQIJf_jhOGMi5PzyrKugXeYlE3KvmSk40HYS8io6mwESYW7pfmGVgMEyXYL1PAg_3GpCNF8TphKnSXbAj69RH2WyGW5WSSSQ-8JSA-dbrIYz6p2cNL3WxXM8nbYeqMF9IKY1OTHJm7L0B3fByEoTGm4u5a45BRmK5GYqfxFfgZIzIEBdRhMoHkP4HY-snRJ4-LlZYHKNI7nl8ksdpcmzEvsam-KvVSl-3ZLAlYdgMMf5r8HwB6LSPp6ym1yVJZvNb6uRd-jDONRiIeNGLCsVeJ6_d-mlVduMDZDwz8w3JEQV_oMRcadjciFDLBwOoitWnUOEgF0hMbbBClfVTLxLW0CorfkOWW55rchKiT3Y8AYlZ_KK3neoa65zRbAWpQn9EducLJsnQBE7W7vU_Km4NH66k6zJgDJ3Q0gZ3IaVfd4HrZwimAUwQ9qMN4tfywpSSUFlvoLdte7i_nnUY8zzri4lUeY1BGq0URGyZq7vdB1nATLPn8CpzPPzXEZekeXNwcD8RVn7qqyYlmp8pN8guKMGNb5otHhfEqQFilgwDJNDztkgyN8CTMOxVYens278KzkEOuPjn-RMNrZ0Rb_McYgugOAHB7kL77QfJCV9KsORy3yblOvfoMqkx3gr_Qn3tCj1wjtmLgPaeNcUZa7kX44WhnwpJAz5fgWmnJck8WiQ19NO0Nh4aOZnI14MdblPvOrHruQR6YxhuBwWgBbJXG03cYKJ3j1DFWVxRm42Zb0SOp_xpNpisJVtOq5tDNMiPC0tCPwZQ7i-QuXmtWCe-4Zd2upkF2pI0xT19sn9uRxyzA9_P5SHtOudo9UeuTi68YL0-uhXom0u8qwFy-sKVShCLgHoEZUBhai04LewxRlCClKQBMPiUa1qKVCT4uCyNYJ0jnuWz4gqBqJnAaxigu1jH4hZ2ZiDtN5Om0pj54tg5JWqBLWDBcjrtA5HNmMU2tUoKogy99pKrCCzNirR_vD51_0oVuWIryffFl7_lPulKkLI3krs6Xn1mY6IU5EztA17l-6E00-sgg8ih3He-1wHYl7JFLW2CMUgEU5Z1AevqMMcdH-lZ1XnZAe8sQt2uG2Ro2FvTsS2E3IA=","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0fcd5b09312e9e37006a8fda051afc87d0bfe48b2215f1990c","type":"function_call","status":"in_progress","arguments":"","call_id":"call_2WDWxp0hVgglxlaPg8g7Zzn4","name":"get_weather"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Tokyo\"}","item_id":"fc_0fcd5b09312e9e37006a8fda051afc87d0bfe48b2215f1990c","obfuscation":"","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Tokyo\"}","item_id":"fc_0fcd5b09312e9e37006a8fda051afc87d0bfe48b2215f1990c","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0fcd5b09312e9e37006a8fda051afc87d0bfe48b2215f1990c","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_2WDWxp0hVgglxlaPg8g7Zzn4","name":"get_weather"},"output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0fcd5b09312e9e37006a8fda051b1087d09704e2d0d78cb5c2","type":"function_call","status":"in_progress","arguments":"","call_id":"call_tIkjnGRltluvnalEdSS4A4jS","name":"get_stock_price"},"output_index":2,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"ticker\":\"AAPL\"}","item_id":"fc_0fcd5b09312e9e37006a8fda051b1087d09704e2d0d78cb5c2","obfuscation":"abzsFPKm8YHyC4d","output_index":2,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"ticker\":\"AAPL\"}","item_id":"fc_0fcd5b09312e9e37006a8fda051b1087d09704e2d0d78cb5c2","output_index":2,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0fcd5b09312e9e37006a8fda051b1087d09704e2d0d78cb5c2","type":"function_call","status":"completed","arguments":"{\"ticker\":\"AAPL\"}","call_id":"call_tIkjnGRltluvnalEdSS4A4jS","name":"get_stock_price"},"output_index":2,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc","object":"response","created_at":1787812356,"status":"completed","background":false,"completed_at":1787812357,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0fcd5b09312e9e37006a8fda04813487d0ad92815c30af1ff7","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oFk8xSh722GtrAe4x48J-e7ePJgqkQYwyK_iEjEXNobYWNH4JN8WcvCbuTvmF_un8gK22x4IO52iez4TlJiNMeBSJzyU2rD773Es5_ZjOtU6D5O3KULiT1YJ9RzSVg46RnrktKho6-2XEwTxpuCdEckdd3s49v7UkhcZ_RKP6ShvF94AHwpmXZRlyQbQLvNu6KNq3ah0BisxwSWKdRZ6P6ITwcazSsi52AEuwJVg6pF6slO28ISsxayfOnCVIWkIepUjgsglkK4-fcVbtN7iWlJR9rN7Sp77T9zLBLUekhaomUS7gWj0qLzTa2j3QVgJo9UBk1NszF4PkqabbvAJ6PnbHSgPPDBjqtjnWLJ823cOMiLfkOkYis82lHoUvCYzD3pxWS2gH7HSBIV0NuJPqof9T0J8Uki5RuX3Povq2R6FxlKcR60MYTj4vyse7vmHCuV864E5aUzWHNUiHY2veMCu9j0ketyCDnw5HGIxkuC-byR79p5RH2xgp2E3DYanhGUwuJEXbhE5ErWJqvk67tXwfTSANCA8N6wUXMVhqBsu6SVymof-G_CT69A_r6krjDMUwHGM3Vfysq1wRSpzpi0NU8Fy3KJ7MwugO8s168XT3yMwzJZ2gPy_NXaWrL1RcCm8xIHhNnP0r6nGpMSz06iazXNnLpHRouKvWvRuUsvDJmjfhFB4c58VZ8LLRhNcGkn70Zq0_uNI1CMMIdlhX5vSVCFObd1Qxu4bTTx1BaNtQTL0b7obEqj18obsux14IfR8a3W5-XUGRQXHON86GBcXsR-OSaNbVqH6wv_3ZICBGqFI2QZUdF8ivrjoBnf4SSslB8cSPlCvoAVFNcZhkDYWiyLY-mocCs_z3pWv0qYquUjHg2P49BXQkf7DLDeupqIT-mnO1-0q3XKPd7JpZPZ3MRT6D0Yv87uRq1FeFO8eLtAbUCg-eS5z0cClrUyDUmK279-ltpreFKzqmWryTSbcPWvNxcoYijLaf-nM0okM8_jokr1CMlAv7S4oObAO1ngpAQSUdXGdq69d6hYDY1a1kBM1tBSOEYJew3fEKsIBSsOdfFMppP1bBz8_JQT9riiUDUtGFf2JDxi4F9gMb6ZNPnvFT1wblP-XqQqKIFeTKZFrY-wrYUd-_hLa-coyliqgv-b-E2TyqXLsZdKpocl21TyiHXZerYNOjXdC9bSkQ6Mn4qxWbc8_JiHNLo2xMiUJtxQvrwOjSLVB1wOqDH2NrS2YZ40y7d_1u7-PTb3McPhKQ_8HSumImjKdSACWymjWYbofJGb8vXsPLdmAWSuNj98es4orkB-SXnJ2ljITI=","summary":[]},{"id":"fc_0fcd5b09312e9e37006a8fda051afc87d0bfe48b2215f1990c","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_2WDWxp0hVgglxlaPg8g7Zzn4","name":"get_weather"},{"id":"fc_0fcd5b09312e9e37006a8fda051b1087d09704e2d0d78cb5c2","type":"function_call","status":"completed","arguments":"{\"ticker\":\"AAPL\"}","call_id":"call_tIkjnGRltluvnalEdSS4A4jS","name":"get_stock_price"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda02131487d0b2ed5385c7c33aa8","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":340,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":76,"output_tokens_details":{"reasoning_tokens":24},"total_tokens":416},"user":null,"metadata":{}},"sequence_number":12} + + ' + - ' + + ' + status_code: 200 +- filename: t3 + request: + body: + input: + - call_id: call_2WDWxp0hVgglxlaPg8g7Zzn4 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_tIkjnGRltluvnalEdSS4A4jS + output: '{"ticker": "AAPL", "price": 231.45, "currency": "USD"}' + type: function_call_output + - content: 'Do both of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + and (2) call get_weather for "Paris".' + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6","object":"response","created_at":1787812357,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6","object":"response","created_at":1787812357,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0fcd5b09312e9e37006a8fda0641f487d0bb60693299b3284f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oGBDPcWmXWy9nqu9ZOMJ7VJ6ePbOnKKt7DrkvP_7lWGl7a5LinS9m_w3by49kaqJ0I2d9eHGVcEsRMt7iuJ6spYY749wig0C2BwhHGClKBQKqtrHvRXHPhEuQG1gqqcI-5zwZExNgW1GQscHLJKhr5wZHAzuSzLsoL7g7Vr0eHWJA_mFy740K_A-qWJ3vVGCOU7rNGnGEiXOSfY4jTI9VzqRMcH-qhTRcy_5LI4K1KUX-t0V1j3oY8F1hjfmXZU0A2M3gTVZT3r7bSStk42VWTzVSU0TaZ6TqtYs1Tx0kEURf8EnK-WvsbRPgQukhIiPrUCVGpN53aFGLLrPAvBtkv7gmtUJMxFpQOe8XAPGcI5CQeVHkV9HV_-ZIrS_mECunRZMjfQwGc8XY2M2b7ADMTGvIeCMem8BI2g3yADQh93shI7sXmSw08UDCvLTZYdjGZNifo6--3dGNzmW0epX89VgB3WLhubuPQ9_egopMYkdd0NshhSfvl6c3qrIC_XMX9sVyOS5P2H7SfjcBSGL_NMkNiPsKGwx3vXu9_-GqPQnX7gKeUV7T9mjgPT3CRXKqwfZpRoqkfkspJ-jL3P-p7xtegdIzFJzUNB-xYhOKaP8wQFs-vCFBG5Xpo-tkd2j_iXg7Bl1TmdzX_dDXcG9NUkYm4iyobGp7VspNrsS7HV0Qy3GhKhXPd1HGqi8j7W1zMSLDJf4NPEe23pPNRtK4N7mw7BWP-NQ5pK2E2SdGpYaq3Mgrhp9QmzUO1ko8QtC_9Cr_YOfmYbkD7nuaCD_nJwJITKtDt9TmQlO7DrL-StdwvSnnnc_6kuF4zC05XGYHpaiOE2PnnSZEFDVhKjnuBlQfrr0qOJB3uCcViFfyCJBGxqX9UYcUNdnvZ0X3R5oE7RUB-tJMag_3GTft5Iif0OE689rBWQPwwwNb0O_LZ8A8_YCu6ALxJ4v-s8bPOdnbKAFiuGUIycSb-r4_ItxLfG_9x87uHR8mMT9sBpCr6nxUz-WAIaYxXu0f0Nr52ksD2Dw-NiF_tatXmOk6qoyzlTPGDXX0yMe2FHpbqd-ujG3qBEvH8UYI7QAUDpT2IhGiKUZX6F85ijUhvqwoSBBkjevVTqs9Ub6SUrMpUo85bfewuiZxeq8PsJ1Wyi6KWmAab9MFvTiWWgTujGIkqC6LGLw==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0fcd5b09312e9e37006a8fda0641f487d0bb60693299b3284f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oGQBMY8PbozhpjffMVzTm9nF5Hat--BiNybhvNTASz99SrzItSvxGn1p1mmfm9k2LMdwVfOEYadZ0i2Kqghf0MZtguHaUn3T4yZew1jr3VIIrCOCfsYfgkIDprwYO-0fw_rQZhKi3Pj2xilqdalyhbrl7P1lJRWk1BDFgCYOOEm3nNemaJjUFVfXmJZ3Vx3jzctXFoUTU_AmIMKg4H6L5HJe78LUBcYup3M0nof05p9I4WMA2BLPCs2KIWpNfL4Ep8VyCCeMZyMlH7yayNdjBJVmJk5h1lgcb-yXkjqKNVmHDUtxYmLzG3j-DYHpJ2K18incFCTgrnVcXeuid0Cb2XU-OOkDP7PjjwMRBXV6eH1_NLSjZHe3B_RfNpTCpBjLhGwGEqyO01FF_c-IwJAbqaU96UJ5FdtKh-Ge0POLXtJLD273nZnn56TbNA8NUyiKrtxe2SO8pNt3KVBo2NxTwEI1xoAbLZ7zTlCL5jBqtdM6MDEGLI8q7yNCKorfilt_CuFPT1q6-2ZBwYmjg06XNYXHxuLEcKq27xTcOsQWyZ_neie5o5UiCI3PZ1MyHWcP-bmzQ8Ro1qLrxswGIBNGlLPgxTwNZO-IiAvagG4WUeFxItDIRWSyh3Y4BCoEbGQzAepSs8VqO2afVLuNkc5QiC1Q9ECskYP2c8DC1rn8ls_885NCK-9Nt4iKuT9weXu91pBTcNHLc6IzhzYd8UfEGlcG59dAn1noYFFging21eDDjhUhxmDsBaqpvESCSLjh6co3Ct3LCGsj6sgfahFaD_ymjBg0XmsGkbGLs3eb3p9Uk5IBrMUWyYNm1UM8SjGnC1J9rlZ9k-o1UjyP2S1jktecWVAIai5Bn7uQ5pRBF9KQF2OoyYWBxP13_NTZl1axsLKMpdZN3ySZJ2YJe4fODlJusNUUgi74EnO9lR0ePo9IxqcIbyHkGQZG3KAoGXOki9ZdYqoGHK_Az1h2d-fkdXljXc6YmXa82lfC1zU5b9ZCarbYSN4ugfVsVfnrKRf87NV95d3qY7ZTAwciupQbJ2xgFa6WUcrm8rzS6GpYrKNfXTrAPJgy3DzG0VDlyuF9BZPE7motNk3rPMso33-7R_EB4ODC_Odd0wM5ThViQxEwu-NiPjHOJpdx0ChTWM8rj-EVx5mdCKpHXjLjc1moR-2uP2miDvVZuBEnMzQC3dWYvS0QsEU0x-FaOd_zitjPqOWMTWJ37oKKud61b8Ivy3ac8GacGqY4hxEONzXKzO3yOfQOZvwsue97eXDDGpWZEw","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0fcd5b09312e9e37006a8fda06cdbc87d093e6529dcafea6ab","type":"function_call","status":"in_progress","arguments":"","call_id":"call_NVl57dhek87FoAMa3wI4DBCz","name":"get_weather"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Tokyo\"}","item_id":"fc_0fcd5b09312e9e37006a8fda06cdbc87d093e6529dcafea6ab","obfuscation":"","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Tokyo\"}","item_id":"fc_0fcd5b09312e9e37006a8fda06cdbc87d093e6529dcafea6ab","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0fcd5b09312e9e37006a8fda06cdbc87d093e6529dcafea6ab","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_NVl57dhek87FoAMa3wI4DBCz","name":"get_weather"},"output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0fcd5b09312e9e37006a8fda06cdd087d08742b3885d646bbd","type":"function_call","status":"in_progress","arguments":"","call_id":"call_ctYvBVAg9WygJeYaRu6jv2wn","name":"get_weather"},"output_index":2,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Paris\"}","item_id":"fc_0fcd5b09312e9e37006a8fda06cdd087d08742b3885d646bbd","obfuscation":"","output_index":2,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Paris\"}","item_id":"fc_0fcd5b09312e9e37006a8fda06cdd087d08742b3885d646bbd","output_index":2,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0fcd5b09312e9e37006a8fda06cdd087d08742b3885d646bbd","type":"function_call","status":"completed","arguments":"{\"city\":\"Paris\"}","call_id":"call_ctYvBVAg9WygJeYaRu6jv2wn","name":"get_weather"},"output_index":2,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6","object":"response","created_at":1787812357,"status":"completed","background":false,"completed_at":1787812358,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0fcd5b09312e9e37006a8fda0641f487d0bb60693299b3284f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oGrQZjWohyH3ZzsDL1EYsIPl0FdSi04R8xsnI9120B41N9oDusBl0tystN4MzAadnjpgP81swbqH36Ne340wULIkuAVBQ_ovQtkpcDLfnHtr1cw86HIHVmiG41GWYmFUJui5YgCLJXZT9iuToOry-z4d_vlX91MkX_FzpkUrb3cIPk066F7LJTA5v6QVxYOvahVlxubHV2oN5D2fpKw2VfPAUtwzJ3MxLLTYvLAByoye47iSmzdyBXhxJr3S7fQeFt73asykfhU_gldNLBMbN9wGWuyJlw_yh8lqsZIu7SITaGlA-j6Lp_6U1WeSlYd3uMsMcFq1Ef89xDYPyMOy1iRa06YO79r4PaTBhOTnK2TyaNNrv8V0QuVyii_5Hcsb76otfpLuw2pZwzf_IW2b0oczFtIKbY2GZeXJtz2RKPDu1WOCLBe-gSSvn59rUIGXn_wMmsCEMGCZV8h1MjbYBLi2QqX3lt3gAwKYfo_zCO3oxMkx1-5aDPHYREODOndEzqD2QTD1hE5k6giKwOIDpDE1-HESIFbbVfOnj-gkoY6C9U3O4PaC13ZTdACGqCcRU94PPMqhZTMNnML6bKmzsNS0mlu9or1ECQdUWrEZ8WeBr_yclL7C-j46Sc20bAF5FzLE9i1YJPK0zLvT8D9eSjoEoNMbe3Cp1qtIpC_fXx5eEdC1Xu_ui4wyRW5TnvRHxhQY71_zbEiW3OdbY8eGmNI8dJZeZO4llcUFbXYjzWVI70ZpE8mNt4jxlV7GuayNOLrV1qgfzhZWP_vKHBG77vjjvs9l9R5P95Gd-sjq1gUuTXeI4Kev6kdOh0MGRrfP7f01ULMjzp_JeeGloJDsfQIIt-zM4G0tfS0P1zT3Dm3-_kSyL_9tgdLbZbcVbsheip7wFa5P3103TwFy6CCaEZJ7TpBReywZkgZjmRcnje5iTn7tVxRO1IenS5RVMFZ8qxpMTrHvGhoU2DUJh_D5nuZRLQIBhynfpO9CcoKDbr3ovEAlt4QTYhCjhnKCDM7pKBYV0n6PVwZkSkdgATCwwpLYCQKUKPNoqokIHw0Lqvta2QARlBHkAUj3-7duh6wD61JJK0TMkXNeko5o8fpjiwiH6kRHiv4XjgMjp0hGae2RAZXH-Vdt5PtnJaastbFbMvngvVPzkbVV8EUqiWV_CVpz8O1F6o9HxnoCB2BzY6rXYSu1QZdbbHWOvjwApH4cr_j8n35MFL5nQm1-8Ucq7Ix7gOm8XBZHY1Ysyb5UXyoCRtWiAsr898aeqTB5l5yaWa","summary":[]},{"id":"fc_0fcd5b09312e9e37006a8fda06cdbc87d093e6529dcafea6ab","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_NVl57dhek87FoAMa3wI4DBCz","name":"get_weather"},{"id":"fc_0fcd5b09312e9e37006a8fda06cdd087d08742b3885d646bbd","type":"function_call","status":"completed","arguments":"{\"city\":\"Paris\"}","call_id":"call_ctYvBVAg9WygJeYaRu6jv2wn","name":"get_weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda03f3c087d08750d47f7c4b79bc","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":526,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":71,"output_tokens_details":{"reasoning_tokens":21},"total_tokens":597},"user":null,"metadata":{}},"sequence_number":12} + + ' + - ' + + ' + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: call_NVl57dhek87FoAMa3wI4DBCz + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_ctYvBVAg9WygJeYaRu6jv2wn + output: '{"city": "Paris", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6 + store: true + stream: true + tool_choice: auto + tools: + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Paris + type: string + required: + - city + type: object + strict: true + type: function + - description: Get the current stock price for a given ticker symbol. + name: get_stock_price + parameters: + additionalProperties: false + properties: + ticker: + description: Stock ticker symbol, e.g. AAPL + type: string + required: + - ticker + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0fcd5b09312e9e37006a8fda07670887d0b8174fd852ac5ca8","object":"response","created_at":1787812359,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0fcd5b09312e9e37006a8fda07670887d0b8174fd852ac5ca8","object":"response","created_at":1787812359,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"BACEuBESoPF0kVR","output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"KN8Z0aqy9CCLc","output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Tokyo","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"1jiYyEHiCsr","output_index":0,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":":**","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"2lV16UbOav4Le","output_index":0,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Clear","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"rkzkD5ms0L","output_index":0,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"NchPNGpHmYUC5BY","output_index":0,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"lzcMkT3nGigPr","output_index":0,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"72","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"jkVX5sYjLzDhJd","output_index":0,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"3hcu5RzGezIi6J","output_index":0,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**\n","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"SjTyk4bmB5Azm","output_index":0,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"tA9ZYsnFO1rdEZB","output_index":0,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"q7RGc2OKwrYQl","output_index":0,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Paris","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"L54O7intz4s","output_index":0,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":":**","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"pYDCIWFApA4pA","output_index":0,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Clear","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"pBd5pPAVgl","output_index":0,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"uIb82tpEMi3Vy01","output_index":0,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"kVddMkb5qa4ZB","output_index":0,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"72","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"0HRhHfn7lD5140","output_index":0,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"93zw5OlELEFlFc","output_index":0,"sequence_number":22} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"obfuscation":"Gjfax497sHI9Us","output_index":0,"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","logprobs":[],"output_index":0,"sequence_number":24,"text":"- + **Tokyo:** Clear, **72°F**\n- **Paris:** Clear, **72°F**"} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **Tokyo:** Clear, **72°F**\n- **Paris:** Clear, **72°F**"},"sequence_number":25} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **Tokyo:** Clear, **72°F**\n- **Paris:** Clear, **72°F**"}],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":26} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0fcd5b09312e9e37006a8fda07670887d0b8174fd852ac5ca8","object":"response","created_at":1787812359,"status":"completed","background":false,"completed_at":1787812360,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"msg_0fcd5b09312e9e37006a8fda08040c87d0a1bb30889de60a54","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **Tokyo:** Clear, **72°F**\n- **Paris:** Clear, **72°F**"}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0fcd5b09312e9e37006a8fda05ba4087d08279215cbe8374e6","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Paris"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"function","description":"Get + the current stock price for a given ticker symbol.","name":"get_stock_price","output_schema":null,"parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Stock + ticker symbol, e.g. AAPL"}},"required":["ticker"],"additionalProperties":false},"strict":true},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":669,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":24,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":693},"user":null,"metadata":{}},"sequence_number":27} + + ' + - ' + + ' + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml new file mode 100644 index 00000000..928c3909 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml @@ -0,0 +1,544 @@ +turns: +- filename: t1 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "London", and + (2) call get_weather for "Tokyo".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817601 + error: null + id: resp_01a0423b-a0a8-7f72-86a6-8f483c9f2844 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user is asking me to call get_weather for both "London" and "Tokyo" + in parallel, in the same turn. However, looking at the available tools, + I only have one get_weather function that takes a single city parameter. + I cannot call it twice simultaneously with different parameters. + + + I need to clarify this limitation to the user - I can only make one tool + call at a time, and the get_weather function only accepts one city at + a time. I''ll need to make two separate calls, but they will be sequential, + not parallel. + + + Let me explain this to the user and then proceed with making the calls + one after another. + + ' + type: reasoning_text + encrypted_content: null + id: rs_ae982bd56c2adc06 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: "I appreciate you asking me to run these in parallel, but I need to\ + \ clarify something: the `get_weather` tool only accepts one city at a\ + \ time (it has a single `city` parameter), and I can only make one tool\ + \ call at a time. \n\nI'll need to make two separate calls - one for London\ + \ and one for Tokyo. They won't be truly parallel, but I'll get both weather\ + \ reports for you. Let me do that now:" + type: output_text + id: msg_bad63866747fc5bd + role: assistant + status: completed + type: message + - arguments: '{"city": "London"}' + call_id: chatcmpl-tool-8dcd079421b19883 + id: fc_ae02e958313cbde0 + name: get_weather + status: completed + type: function_call + - arguments: '{"city": "Tokyo"}' + call_id: chatcmpl-tool-a4757b20b1ff296e + id: fc_bcecda16270a877e + name: get_weather + status: completed + type: function_call + previous_response_id: null + status: completed + usage: + input_tokens: 848 + input_tokens_details: + cached_tokens: 0 + output_tokens: 282 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1130 + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: chatcmpl-tool-8dcd079421b19883 + output: '{"error": "weather service unavailable: upstream timeout"}' + type: function_call_output + - call_id: chatcmpl-tool-a4757b20b1ff296e + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What did you find for each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-a0a8-7f72-86a6-8f483c9f2844 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817602 + error: null + id: resp_01a0423b-a82b-7892-8834-3e87e709d5ff + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user is asking about the weather results for both cities. I got + two tool results - one for London which had an error, and one for Tokyo + which was successful. Let me summarize what I found for each city. + + ' + type: reasoning_text + encrypted_content: null + id: rs_882e2d6733093d98 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + Based on the weather service results: + + + **London**: Unfortunately, the weather service was unavailable when I + tried to get London''s weather. The request timed out and returned an + error. + + + **Tokyo**: I was able to get Tokyo''s weather information: + + - Temperature: 22°C + + - Condition: Clear skies + + + Would you like me to try getting London''s weather again later, or is + there anything else I can help you with?' + type: output_text + id: msg_abac153aa36ee4e9 + role: assistant + status: completed + type: message + previous_response_id: resp_01a0423b-a0a8-7f72-86a6-8f483c9f2844 + status: completed + usage: + input_tokens: 1062 + input_tokens_details: + cached_tokens: 0 + output_tokens: 138 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1200 + headers: + content-type: application/json + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "Tokyo", and + (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817604 + error: null + id: resp_01a0423b-b197-70a0-9686-59c12c564a36 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: "The user wants me to call get_weather for two cities in parallel:\ + \ Tokyo and Atlantis. I can see that I have the get_weather function available,\ + \ but I notice there's only one parameter \"city\" and it's a single string,\ + \ not an array. \n\nLooking at the function schema more carefully, get_weather\ + \ only accepts a single city parameter, not multiple. However, the user\ + \ is asking me to make two separate calls in parallel.\n\nI should make\ + \ two separate function calls - one for Tokyo and one for Atlantis. Let\ + \ me do this in parallel as requested.\n" + type: reasoning_text + encrypted_content: null + id: rs_a633bae04cfa2322 + status: null + summary: [] + type: reasoning + - arguments: '{"city": "Tokyo"}' + call_id: chatcmpl-tool-8ff6e5abd1214c5e + id: fc_9257b93379b088b0 + name: get_weather + status: completed + type: function_call + - arguments: '{"city": "Atlantis"}' + call_id: chatcmpl-tool-ae496d66897a40a5 + id: fc_90e0e56d9233788c + name: get_weather + status: completed + type: function_call + previous_response_id: null + status: completed + usage: + input_tokens: 849 + input_tokens_details: + cached_tokens: 0 + output_tokens: 171 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1020 + headers: + content-type: application/json + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: chatcmpl-tool-8ff6e5abd1214c5e + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in Tokyo? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-b197-70a0-9686-59c12c564a36 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: invalid_request_error + message: 'tool error: No tool output found for function call chatcmpl-tool-ae496d66897a40a5.' + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 +- filename: t5 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) search the web for the exact query + "Atlantis weather today", and (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817607 + error: null + id: resp_01a0423b-bc31-7a70-ba75-69eee52a8f9e + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user wants me to do two things in parallel: + + 1. Search the web for "Atlantis weather today" + + 2. Call get_weather for "Atlantis" + + + I need to use both tools in the same turn. The web_search function can + take a query parameter, and get_weather needs a city parameter. I''ll + call both at the same time. + + + Let me set up the function calls: + + 1. web_search with query "Atlantis weather today" + + 2. get_weather with city "Atlantis" + + ' + type: reasoning_text + encrypted_content: null + id: rs_bf2ba3e3015bc708 + status: null + summary: [] + type: reasoning + - action: + queries: + - Atlantis weather today + query: Atlantis weather today + sources: + - title: Atlantis, FL Weather Forecast | AccuWeather + url: https://www.accuweather.com/en/us/atlantis/33462/weather-forecast/328118 + - title: Weather for Atlantis Island, New York, USA + url: https://www.timeanddate.com/weather/@5107485 + - title: 10-Day Weather Forecast for Atlantis, Florida - The Weather Channel + ... + url: https://weather.com/us/florida/city/atlantis/tenday + - title: Atlantis, MD Weather Forecast | AccuWeather + url: https://www.accuweather.com/en/us/atlantis/21409/weather-forecast/2169413 + - title: Atlantis, Florida | Current Weather Forecasts, Live Radar Maps + ... + url: https://www.weatherbug.com/weather-forecast/now/atlantis-fl-33462 + - title: Hourly Weather Forecast for Atlantis, Florida 33462 - The Weather + ... + url: https://weather.com/weather/hourbyhour/l/Atlantis+FL+USFL0626:1:US + - title: 'Atlantis Weather Forecast: Hourly & 7-Day Outlook for Florida + • ...' + url: https://www.predictwind.com/weather/united-states/florida/atlantis + - title: National Weather Service + url: https://forecast.weather.gov/MapClick.php?site=mfl&map.x=264&map.y=64 + - title: Atlantis, FL Hourly Weather | AccuWeather + url: https://www.accuweather.com/en/us/atlantis/33462/hourly-weather-forecast/328118 + - title: Atlantis, Florida, USA 14 day weather forecast + url: https://www.timeanddate.com/weather/@4146372/ext + type: search + id: ws_b33de0417f427767 + status: completed + type: web_search_call + - arguments: '{"city": "Atlantis"}' + call_id: chatcmpl-tool-bb1e56cee803040c + id: fc_a489aee71faee3e7 + name: get_weather + status: completed + type: function_call + previous_response_id: null + status: completed + usage: + input_tokens: 854 + input_tokens_details: + cached_tokens: 0 + output_tokens: 166 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1020 + headers: + content-type: application/json + status_code: 200 +- filename: t6 + request: + body: + input: + - content: Never mind the weather lookup -- just tell me one fun fact about + Atlantis instead. + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-bc31-7a70-ba75-69eee52a8f9e + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: invalid_request_error + message: 'tool error: No tool output found for function call chatcmpl-tool-bb1e56cee803040c.' + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml new file mode 100644 index 00000000..a71c7591 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml @@ -0,0 +1,6575 @@ +turns: +- filename: t1 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "London", and + (2) call get_weather for "Tokyo".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817551,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-e7cd-7052-b82c-be5cc3f69424","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817551,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-e7cd-7052-b82c-be5cc3f69424","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"8a68aa7c23b2e107","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"8a68aa7c23b2e107","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + is","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + asking","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + me","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + to","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + call","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + get","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + function","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + for","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + two","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + cities","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + (","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":"London","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + and","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":")","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + in","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":",","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + in","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + same","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + turn","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":" + They","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":" + want","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + me","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + to","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + do","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + both","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + without","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + waiting","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + for","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + one","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + before","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":" + starting","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + other","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":"I","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":" + can","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + use","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + web","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":"_search","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":" + function","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + to","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":" + run","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":" + multiple","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + queries","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":" + in","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":",","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":" + but","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":" + that","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":"''s","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + not","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + what","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + they","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":"''re","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":" + asking","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":" + for","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":" + they","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":" + want","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":" + me","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":" + to","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":" + call","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":0,"content_index":0,"delta":" + get","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":0,"content_index":0,"delta":" + Let","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":0,"content_index":0,"delta":" + me","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":81,"output_index":0,"content_index":0,"delta":" + check","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":82,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":83,"output_index":0,"content_index":0,"delta":" + get","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":84,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":85,"output_index":0,"content_index":0,"delta":" + function","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":86,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":87,"output_index":0,"content_index":0,"delta":" + it","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":88,"output_index":0,"content_index":0,"delta":" + only","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":89,"output_index":0,"content_index":0,"delta":" + takes","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":90,"output_index":0,"content_index":0,"delta":" + one","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":91,"output_index":0,"content_index":0,"delta":" + city","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":0,"content_index":0,"delta":" + parameter","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":93,"output_index":0,"content_index":0,"delta":" + and","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":94,"output_index":0,"content_index":0,"delta":" + doesn","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":95,"output_index":0,"content_index":0,"delta":"''t","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":96,"output_index":0,"content_index":0,"delta":" + have","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":97,"output_index":0,"content_index":0,"delta":" + a","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":98,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":99,"output_index":0,"content_index":0,"delta":"/c","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":100,"output_index":0,"content_index":0,"delta":"all","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":101,"output_index":0,"content_index":0,"delta":" + mechanism","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":102,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":103,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":104,"output_index":0,"content_index":0,"delta":"However","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":105,"output_index":0,"content_index":0,"delta":",","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":106,"output_index":0,"content_index":0,"delta":" + I","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":107,"output_index":0,"content_index":0,"delta":" + notice","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":108,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":109,"output_index":0,"content_index":0,"delta":" + tools","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":110,"output_index":0,"content_index":0,"delta":" + I","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":111,"output_index":0,"content_index":0,"delta":" + have","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":112,"output_index":0,"content_index":0,"delta":" + available","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":113,"output_index":0,"content_index":0,"delta":" + include","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":114,"output_index":0,"content_index":0,"delta":":","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":115,"output_index":0,"content_index":0,"delta":"\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":116,"output_index":0,"content_index":0,"delta":"1","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":117,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":118,"output_index":0,"content_index":0,"delta":" + web","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":119,"output_index":0,"content_index":0,"delta":"_search","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":120,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":121,"output_index":0,"content_index":0,"delta":" + which","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":122,"output_index":0,"content_index":0,"delta":" + supports","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":123,"output_index":0,"content_index":0,"delta":" + multiple","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":124,"output_index":0,"content_index":0,"delta":" + queries","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":125,"output_index":0,"content_index":0,"delta":" + in","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":126,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":127,"output_index":0,"content_index":0,"delta":"\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":128,"output_index":0,"content_index":0,"delta":"2","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":129,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":130,"output_index":0,"content_index":0,"delta":" + get","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":131,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":132,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":133,"output_index":0,"content_index":0,"delta":" + which","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":134,"output_index":0,"content_index":0,"delta":" + takes","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":135,"output_index":0,"content_index":0,"delta":" + a","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":136,"output_index":0,"content_index":0,"delta":" + single","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":137,"output_index":0,"content_index":0,"delta":" + city","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":138,"output_index":0,"content_index":0,"delta":"\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":139,"output_index":0,"content_index":0,"delta":"3","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":140,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":141,"output_index":0,"content_index":0,"delta":" + set","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":142,"output_index":0,"content_index":0,"delta":"_temperature","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":143,"output_index":0,"content_index":0,"delta":"_unit","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":144,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":145,"output_index":0,"content_index":0,"delta":" + for","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":146,"output_index":0,"content_index":0,"delta":" + setting","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":147,"output_index":0,"content_index":0,"delta":" + temperature","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":148,"output_index":0,"content_index":0,"delta":" + unit","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":149,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":150,"output_index":0,"content_index":0,"delta":"The","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":151,"output_index":0,"content_index":0,"delta":" + get","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":152,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":153,"output_index":0,"content_index":0,"delta":" + function","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":154,"output_index":0,"content_index":0,"delta":" + doesn","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":155,"output_index":0,"content_index":0,"delta":"''t","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":156,"output_index":0,"content_index":0,"delta":" + appear","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":157,"output_index":0,"content_index":0,"delta":" + to","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":158,"output_index":0,"content_index":0,"delta":" + support","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":159,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":160,"output_index":0,"content_index":0,"delta":" + calls","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":161,"output_index":0,"content_index":0,"delta":" + directly","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":162,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":163,"output_index":0,"content_index":0,"delta":" + But","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":164,"output_index":0,"content_index":0,"delta":" + since","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":165,"output_index":0,"content_index":0,"delta":" + I","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":166,"output_index":0,"content_index":0,"delta":"''m","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":167,"output_index":0,"content_index":0,"delta":" + an","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":168,"output_index":0,"content_index":0,"delta":" + AI","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":169,"output_index":0,"content_index":0,"delta":" + assistant","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":170,"output_index":0,"content_index":0,"delta":",","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":171,"output_index":0,"content_index":0,"delta":" + I","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":172,"output_index":0,"content_index":0,"delta":" + can","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":173,"output_index":0,"content_index":0,"delta":" + make","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":174,"output_index":0,"content_index":0,"delta":" + multiple","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":175,"output_index":0,"content_index":0,"delta":" + function","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":176,"output_index":0,"content_index":0,"delta":" + calls","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":177,"output_index":0,"content_index":0,"delta":" + in","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":178,"output_index":0,"content_index":0,"delta":" + a","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":179,"output_index":0,"content_index":0,"delta":" + single","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":180,"output_index":0,"content_index":0,"delta":" + response","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":181,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":182,"output_index":0,"content_index":0,"delta":" + Let","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":183,"output_index":0,"content_index":0,"delta":" + me","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":184,"output_index":0,"content_index":0,"delta":" + make","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":185,"output_index":0,"content_index":0,"delta":" + two","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":186,"output_index":0,"content_index":0,"delta":" + separate","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":187,"output_index":0,"content_index":0,"delta":" + get","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":188,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":189,"output_index":0,"content_index":0,"delta":" + calls","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":190,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":191,"output_index":0,"content_index":0,"delta":" + one","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":192,"output_index":0,"content_index":0,"delta":" + for","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":193,"output_index":0,"content_index":0,"delta":" + London","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":194,"output_index":0,"content_index":0,"delta":" + and","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":195,"output_index":0,"content_index":0,"delta":" + one","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":196,"output_index":0,"content_index":0,"delta":" + for","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":197,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":198,"output_index":0,"content_index":0,"delta":" + -","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":199,"output_index":0,"content_index":0,"delta":" + in","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":200,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":201,"output_index":0,"content_index":0,"delta":" + same","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":202,"output_index":0,"content_index":0,"delta":" + response","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":203,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":204,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":205,"output_index":0,"content_index":0,"delta":"Actually","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":206,"output_index":0,"content_index":0,"delta":",","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":207,"output_index":0,"content_index":0,"delta":" + looking","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":208,"output_index":0,"content_index":0,"delta":" + at","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":209,"output_index":0,"content_index":0,"delta":" + the","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":210,"output_index":0,"content_index":0,"delta":" + instructions","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":211,"output_index":0,"content_index":0,"delta":" + more","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":212,"output_index":0,"content_index":0,"delta":" + carefully","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":213,"output_index":0,"content_index":0,"delta":",","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":214,"output_index":0,"content_index":0,"delta":" + I","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":215,"output_index":0,"content_index":0,"delta":" + should","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":216,"output_index":0,"content_index":0,"delta":" + call","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":217,"output_index":0,"content_index":0,"delta":" + both","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":218,"output_index":0,"content_index":0,"delta":" + functions","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":219,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":220,"output_index":0,"content_index":0,"delta":" + The","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":221,"output_index":0,"content_index":0,"delta":" + tool","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":222,"output_index":0,"content_index":0,"delta":" + system","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":223,"output_index":0,"content_index":0,"delta":" + should","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":224,"output_index":0,"content_index":0,"delta":" + handle","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":225,"output_index":0,"content_index":0,"delta":" + this","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":226,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":227,"output_index":0,"content_index":0,"delta":" + Let","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":228,"output_index":0,"content_index":0,"delta":" + me","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":229,"output_index":0,"content_index":0,"delta":" + make","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":230,"output_index":0,"content_index":0,"delta":" + both","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":231,"output_index":0,"content_index":0,"delta":" + calls","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":232,"output_index":0,"content_index":0,"delta":".","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":233,"output_index":0,"content_index":0,"delta":"\n","item_id":"8a68aa7c23b2e107"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":234,"output_index":0,"content_index":0,"item_id":"8a68aa7c23b2e107","text":"The + user is asking me to call the get_weather function for two cities (London and + Tokyo) in parallel, in the same turn. They want me to do both without waiting + for one before starting the other.\n\nI can use the web_search function to run + multiple queries in parallel, but that''s not what they''re asking for - they + want me to call get_weather. Let me check the get_weather function - it only + takes one city parameter and doesn''t have a parallel/call mechanism.\n\nHowever, + I notice the tools I have available include:\n1. web_search - which supports + multiple queries in parallel\n2. get_weather - which takes a single city\n3. + set_temperature_unit - for setting temperature unit\n\nThe get_weather function + doesn''t appear to support parallel calls directly. But since I''m an AI assistant, + I can make multiple function calls in a single response. Let me make two separate + get_weather calls - one for London and one for Tokyo - in the same response.\n\nActually, + looking at the instructions more carefully, I should call both functions. The + tool system should handle this. Let me make both calls.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":235,"output_index":0,"content_index":0,"item_id":"8a68aa7c23b2e107","part":{"text":"The + user is asking me to call the get_weather function for two cities (London and + Tokyo) in parallel, in the same turn. They want me to do both without waiting + for one before starting the other.\n\nI can use the web_search function to run + multiple queries in parallel, but that''s not what they''re asking for - they + want me to call get_weather. Let me check the get_weather function - it only + takes one city parameter and doesn''t have a parallel/call mechanism.\n\nHowever, + I notice the tools I have available include:\n1. web_search - which supports + multiple queries in parallel\n2. get_weather - which takes a single city\n3. + set_temperature_unit - for setting temperature unit\n\nThe get_weather function + doesn''t appear to support parallel calls directly. But since I''m an AI assistant, + I can make multiple function calls in a single response. Let me make two separate + get_weather calls - one for London and one for Tokyo - in the same response.\n\nActually, + looking at the instructions more carefully, I should call both functions. The + tool system should handle this. Let me make both calls.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":236,"output_index":0,"item":{"content":[{"text":"The + user is asking me to call the get_weather function for two cities (London and + Tokyo) in parallel, in the same turn. They want me to do both without waiting + for one before starting the other.\n\nI can use the web_search function to run + multiple queries in parallel, but that''s not what they''re asking for - they + want me to call get_weather. Let me check the get_weather function - it only + takes one city parameter and doesn''t have a parallel/call mechanism.\n\nHowever, + I notice the tools I have available include:\n1. web_search - which supports + multiple queries in parallel\n2. get_weather - which takes a single city\n3. + set_temperature_unit - for setting temperature unit\n\nThe get_weather function + doesn''t appear to support parallel calls directly. But since I''m an AI assistant, + I can make multiple function calls in a single response. Let me make two separate + get_weather calls - one for London and one for Tokyo - in the same response.\n\nActually, + looking at the instructions more carefully, I should call both functions. The + tool system should handle this. Let me make both calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8a68aa7c23b2e107","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":237,"output_index":1,"item":{"arguments":"","call_id":"call_9999e87ae0b28153","caller":null,"id":"945ea519a03280b6","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":238,"output_index":1,"delta":"{\"city\": + \"","item_id":"945ea519a03280b6"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":239,"output_index":1,"delta":"London","item_id":"945ea519a03280b6"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":240,"output_index":1,"delta":"\"}","item_id":"945ea519a03280b6"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":241,"output_index":1,"arguments":"{\"city\": + \"London\"}","item_id":"945ea519a03280b6","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":242,"output_index":1,"item":{"arguments":"{\"city\": + \"London\"}","call_id":"call_9999e87ae0b28153","caller":null,"id":"945ea519a03280b6","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":243,"output_index":2,"item":{"arguments":"","call_id":"call_a03cbd698c28b0cd","caller":null,"id":"9829db6460cac893","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":244,"output_index":2,"delta":"{\"city\": + \"","item_id":"9829db6460cac893"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":245,"output_index":2,"delta":"Tok","item_id":"9829db6460cac893"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":246,"output_index":2,"delta":"yo","item_id":"9829db6460cac893"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":247,"output_index":2,"delta":"\"}","item_id":"9829db6460cac893"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":248,"output_index":2,"arguments":"{\"city\": + \"Tokyo\"}","item_id":"9829db6460cac893","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":249,"output_index":2,"item":{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_a03cbd698c28b0cd","caller":null,"id":"9829db6460cac893","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":250,"response":{"conversation_id":null,"created_at":1787817553,"error":null,"id":"resp_01a0423a-e7cd-7052-b82c-be5cc3f69424","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user is asking me to call the get_weather function for two cities (London and + Tokyo) in parallel, in the same turn. They want me to do both without waiting + for one before starting the other.\n\nI can use the web_search function to run + multiple queries in parallel, but that''s not what they''re asking for - they + want me to call get_weather. Let me check the get_weather function - it only + takes one city parameter and doesn''t have a parallel/call mechanism.\n\nHowever, + I notice the tools I have available include:\n1. web_search - which supports + multiple queries in parallel\n2. get_weather - which takes a single city\n3. + set_temperature_unit - for setting temperature unit\n\nThe get_weather function + doesn''t appear to support parallel calls directly. But since I''m an AI assistant, + I can make multiple function calls in a single response. Let me make two separate + get_weather calls - one for London and one for Tokyo - in the same response.\n\nActually, + looking at the instructions more carefully, I should call both functions. The + tool system should handle this. Let me make both calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8a68aa7c23b2e107","status":null,"summary":[],"type":"reasoning"},{"arguments":"{\"city\": + \"London\"}","call_id":"call_9999e87ae0b28153","id":"945ea519a03280b6","name":"get_weather","status":"completed","type":"function_call"},{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_a03cbd698c28b0cd","id":"9829db6460cac893","name":"get_weather","status":"completed","type":"function_call"}],"previous_response_id":null,"status":"completed","usage":{"input_tokens":848,"input_tokens_details":{"cached_tokens":0},"output_tokens":285,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":1133}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_9999e87ae0b28153 + output: '{"error": "weather service unavailable: upstream timeout"}' + type: function_call_output + - call_id: call_a03cbd698c28b0cd + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What did you find for each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423a-e7cd-7052-b82c-be5cc3f69424 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817553,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-efb4-7c03-ab91-f278a7afba28","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-e7cd-7052-b82c-be5cc3f69424","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817553,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-efb4-7c03-ab91-f278a7afba28","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-e7cd-7052-b82c-be5cc3f69424","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"9d4f1bb37799de7d","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"9d4f1bb37799de7d","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + is","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + asking","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + me","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + to","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + report","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + on","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + the","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + results","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + from","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + both","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + weather","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + calls","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + I","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + just","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + made","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + in","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":".","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + Let","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + me","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + summarize","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + what","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + I","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + found","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":":","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":"1","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":".","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + London","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + -","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + There","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + was","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + an","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + error","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":":","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + \"","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":"weather","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + service","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + unavailable","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":":","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":" + upstream","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":" + timeout","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":"\"","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + -","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":" + so","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + I","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + couldn","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":"''t","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + get","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":" + the","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":" + weather","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + data","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":" + for","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + London","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":".","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":"2","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":".","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + -","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + The","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":" + weather","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":" + data","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":" + was","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + successfully","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":" + retrieved","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":":","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":" + temperature","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":"_c","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":":","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":0,"content_index":0,"delta":" + ","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":0,"content_index":0,"delta":"2","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":0,"content_index":0,"delta":"2","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":0,"content_index":0,"delta":"°C","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":0,"content_index":0,"delta":",","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":81,"output_index":0,"content_index":0,"delta":" + condition","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":82,"output_index":0,"content_index":0,"delta":":","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":83,"output_index":0,"content_index":0,"delta":" + \"","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":84,"output_index":0,"content_index":0,"delta":"Clear","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":85,"output_index":0,"content_index":0,"delta":"\"","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":86,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":87,"output_index":0,"content_index":0,"delta":"I","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":88,"output_index":0,"content_index":0,"delta":" + should","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":89,"output_index":0,"content_index":0,"delta":" + present","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":90,"output_index":0,"content_index":0,"delta":" + this","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":91,"output_index":0,"content_index":0,"delta":" + information","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":0,"content_index":0,"delta":" + clearly","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":93,"output_index":0,"content_index":0,"delta":" + to","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":94,"output_index":0,"content_index":0,"delta":" + the","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":95,"output_index":0,"content_index":0,"delta":" + user","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":96,"output_index":0,"content_index":0,"delta":".","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":97,"output_index":0,"content_index":0,"delta":"\n","item_id":"9d4f1bb37799de7d"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":98,"output_index":0,"content_index":0,"item_id":"9d4f1bb37799de7d","text":"The + user is asking me to report on the results from both weather calls I just made + in parallel. Let me summarize what I found:\n\n1. London - There was an error: + \"weather service unavailable: upstream timeout\" - so I couldn''t get the weather + data for London.\n\n2. Tokyo - The weather data was successfully retrieved: + temperature_c: 22°C, condition: \"Clear\"\n\nI should present this information + clearly to the user.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":99,"output_index":0,"content_index":0,"item_id":"9d4f1bb37799de7d","part":{"text":"The + user is asking me to report on the results from both weather calls I just made + in parallel. Let me summarize what I found:\n\n1. London - There was an error: + \"weather service unavailable: upstream timeout\" - so I couldn''t get the weather + data for London.\n\n2. Tokyo - The weather data was successfully retrieved: + temperature_c: 22°C, condition: \"Clear\"\n\nI should present this information + clearly to the user.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":100,"output_index":0,"item":{"content":[{"text":"The + user is asking me to report on the results from both weather calls I just made + in parallel. Let me summarize what I found:\n\n1. London - There was an error: + \"weather service unavailable: upstream timeout\" - so I couldn''t get the weather + data for London.\n\n2. Tokyo - The weather data was successfully retrieved: + temperature_c: 22°C, condition: \"Clear\"\n\nI should present this information + clearly to the user.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"9d4f1bb37799de7d","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":101,"output_index":1,"item":{"content":[],"id":"9eeb884a6d900db4","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":102,"output_index":1,"content_index":0,"item_id":"9eeb884a6d900db4","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":103,"output_index":1,"content_index":0,"delta":"\n\nHere","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":104,"output_index":1,"content_index":0,"delta":" + are","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":105,"output_index":1,"content_index":0,"delta":" + the","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":106,"output_index":1,"content_index":0,"delta":" + results","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":107,"output_index":1,"content_index":0,"delta":" + for","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":108,"output_index":1,"content_index":0,"delta":" + both","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":109,"output_index":1,"content_index":0,"delta":" + cities","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":110,"output_index":1,"content_index":0,"delta":":","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":111,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":112,"output_index":1,"content_index":0,"delta":"**","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":113,"output_index":1,"content_index":0,"delta":"London","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":114,"output_index":1,"content_index":0,"delta":":**","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":115,"output_index":1,"content_index":0,"delta":" + Unfortunately","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":116,"output_index":1,"content_index":0,"delta":",","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":117,"output_index":1,"content_index":0,"delta":" + I","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":118,"output_index":1,"content_index":0,"delta":" + couldn","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":119,"output_index":1,"content_index":0,"delta":"''t","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":120,"output_index":1,"content_index":0,"delta":" + get","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":121,"output_index":1,"content_index":0,"delta":" + the","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":122,"output_index":1,"content_index":0,"delta":" + weather","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":123,"output_index":1,"content_index":0,"delta":" + data","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":124,"output_index":1,"content_index":0,"delta":" + for","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":125,"output_index":1,"content_index":0,"delta":" + London","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":126,"output_index":1,"content_index":0,"delta":".","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":127,"output_index":1,"content_index":0,"delta":" + The","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":128,"output_index":1,"content_index":0,"delta":" + weather","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":129,"output_index":1,"content_index":0,"delta":" + service","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":130,"output_index":1,"content_index":0,"delta":" + returned","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":131,"output_index":1,"content_index":0,"delta":" + an","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":132,"output_index":1,"content_index":0,"delta":" + error","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":133,"output_index":1,"content_index":0,"delta":" + indicating","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":134,"output_index":1,"content_index":0,"delta":" + \"","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":135,"output_index":1,"content_index":0,"delta":"weather","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":136,"output_index":1,"content_index":0,"delta":" + service","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":137,"output_index":1,"content_index":0,"delta":" + unavailable","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":138,"output_index":1,"content_index":0,"delta":":","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":139,"output_index":1,"content_index":0,"delta":" + upstream","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":140,"output_index":1,"content_index":0,"delta":" + timeout","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":141,"output_index":1,"content_index":0,"delta":"\"","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":142,"output_index":1,"content_index":0,"delta":" + -","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":143,"output_index":1,"content_index":0,"delta":" + this","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":144,"output_index":1,"content_index":0,"delta":" + was","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":145,"output_index":1,"content_index":0,"delta":" + a","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":146,"output_index":1,"content_index":0,"delta":" + temporary","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":147,"output_index":1,"content_index":0,"delta":" + connection","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":148,"output_index":1,"content_index":0,"delta":" + issue","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":149,"output_index":1,"content_index":0,"delta":".","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":150,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":151,"output_index":1,"content_index":0,"delta":"**","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":152,"output_index":1,"content_index":0,"delta":"Tok","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":153,"output_index":1,"content_index":0,"delta":"yo","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":154,"output_index":1,"content_index":0,"delta":":**","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":155,"output_index":1,"content_index":0,"delta":" + The","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":156,"output_index":1,"content_index":0,"delta":" + weather","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":157,"output_index":1,"content_index":0,"delta":" + data","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":158,"output_index":1,"content_index":0,"delta":" + was","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":159,"output_index":1,"content_index":0,"delta":" + successfully","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":160,"output_index":1,"content_index":0,"delta":" + retrieved","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":161,"output_index":1,"content_index":0,"delta":".","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":162,"output_index":1,"content_index":0,"delta":" + Tokyo","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":163,"output_index":1,"content_index":0,"delta":" + is","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":164,"output_index":1,"content_index":0,"delta":" + currently","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":165,"output_index":1,"content_index":0,"delta":" + **","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":166,"output_index":1,"content_index":0,"delta":"2","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":167,"output_index":1,"content_index":0,"delta":"2","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":168,"output_index":1,"content_index":0,"delta":"°C","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":169,"output_index":1,"content_index":0,"delta":"**","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":170,"output_index":1,"content_index":0,"delta":" + with","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":171,"output_index":1,"content_index":0,"delta":" + **","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":172,"output_index":1,"content_index":0,"delta":"Clear","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":173,"output_index":1,"content_index":0,"delta":"**","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":174,"output_index":1,"content_index":0,"delta":" + conditions","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":175,"output_index":1,"content_index":0,"delta":".","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":176,"output_index":1,"content_index":0,"delta":"\n\n","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":177,"output_index":1,"content_index":0,"delta":"If","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":178,"output_index":1,"content_index":0,"delta":" + you","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":179,"output_index":1,"content_index":0,"delta":"''d","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":180,"output_index":1,"content_index":0,"delta":" + like","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":181,"output_index":1,"content_index":0,"delta":",","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":182,"output_index":1,"content_index":0,"delta":" + I","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":183,"output_index":1,"content_index":0,"delta":" + can","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":184,"output_index":1,"content_index":0,"delta":" + try","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":185,"output_index":1,"content_index":0,"delta":" + calling","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":186,"output_index":1,"content_index":0,"delta":" + the","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":187,"output_index":1,"content_index":0,"delta":" + London","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":188,"output_index":1,"content_index":0,"delta":" + weather","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":189,"output_index":1,"content_index":0,"delta":" + service","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":190,"output_index":1,"content_index":0,"delta":" + again","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":191,"output_index":1,"content_index":0,"delta":" + to","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":192,"output_index":1,"content_index":0,"delta":" + see","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":193,"output_index":1,"content_index":0,"delta":" + if","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":194,"output_index":1,"content_index":0,"delta":" + the","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":195,"output_index":1,"content_index":0,"delta":" + connection","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":196,"output_index":1,"content_index":0,"delta":" + issue","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":197,"output_index":1,"content_index":0,"delta":" + has","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":198,"output_index":1,"content_index":0,"delta":" + resolved","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":199,"output_index":1,"content_index":0,"delta":".","item_id":"9eeb884a6d900db4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":200,"output_index":1,"content_index":0,"item_id":"9eeb884a6d900db4","logprobs":[],"text":"\n\nHere + are the results for both cities:\n\n**London:** Unfortunately, I couldn''t get + the weather data for London. The weather service returned an error indicating + \"weather service unavailable: upstream timeout\" - this was a temporary connection + issue.\n\n**Tokyo:** The weather data was successfully retrieved. Tokyo is currently + **22°C** with **Clear** conditions.\n\nIf you''d like, I can try calling the + London weather service again to see if the connection issue has resolved."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":201,"output_index":1,"content_index":0,"item_id":"9eeb884a6d900db4","part":{"annotations":[],"logprobs":null,"text":"\n\nHere + are the results for both cities:\n\n**London:** Unfortunately, I couldn''t get + the weather data for London. The weather service returned an error indicating + \"weather service unavailable: upstream timeout\" - this was a temporary connection + issue.\n\n**Tokyo:** The weather data was successfully retrieved. Tokyo is currently + **22°C** with **Clear** conditions.\n\nIf you''d like, I can try calling the + London weather service again to see if the connection issue has resolved.","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":202,"output_index":1,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\nHere + are the results for both cities:\n\n**London:** Unfortunately, I couldn''t get + the weather data for London. The weather service returned an error indicating + \"weather service unavailable: upstream timeout\" - this was a temporary connection + issue.\n\n**Tokyo:** The weather data was successfully retrieved. Tokyo is currently + **22°C** with **Clear** conditions.\n\nIf you''d like, I can try calling the + London weather service again to see if the connection issue has resolved.","type":"output_text"}],"id":"9eeb884a6d900db4","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":203,"response":{"conversation_id":null,"created_at":1787817555,"error":null,"id":"resp_01a0423a-efb4-7c03-ab91-f278a7afba28","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user is asking me to report on the results from both weather calls I just made + in parallel. Let me summarize what I found:\n\n1. London - There was an error: + \"weather service unavailable: upstream timeout\" - so I couldn''t get the weather + data for London.\n\n2. Tokyo - The weather data was successfully retrieved: + temperature_c: 22°C, condition: \"Clear\"\n\nI should present this information + clearly to the user.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"9d4f1bb37799de7d","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\nHere + are the results for both cities:\n\n**London:** Unfortunately, I couldn''t get + the weather data for London. The weather service returned an error indicating + \"weather service unavailable: upstream timeout\" - this was a temporary connection + issue.\n\n**Tokyo:** The weather data was successfully retrieved. Tokyo is currently + **22°C** with **Clear** conditions.\n\nIf you''d like, I can try calling the + London weather service again to see if the connection issue has resolved.","type":"output_text"}],"id":"9eeb884a6d900db4","role":"assistant","status":"completed","type":"message"}],"previous_response_id":"resp_01a0423a-e7cd-7052-b82c-be5cc3f69424","status":"completed","usage":{"input_tokens":967,"input_tokens_details":{"cached_tokens":0},"output_tokens":194,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":1161}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "Tokyo", and + (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817556,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-fb67-79c0-a385-5b642828f47d","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817556,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-fb67-79c0-a385-5b642828f47d","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"b07cbd9b08d531fa","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"b07cbd9b08d531fa","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + call","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + get","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":"_weather","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + for","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + two","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + cities","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + in","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + -","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + and","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + Atlantis","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":".","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + I","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + need","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + to","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + make","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + both","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + function","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + calls","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + in","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + the","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":" + same","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":" + turn","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + without","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + waiting","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + for","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + one","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + to","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + complete","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + before","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + starting","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + the","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":" + other","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":".","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":"I","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"''ll","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":" + use","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":" + the","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":" + function","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + call","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + syntax","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":" + with","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + two","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":" + separate","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":" + function","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + calls","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":".","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":"\n","item_id":"b07cbd9b08d531fa"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":60,"output_index":0,"content_index":0,"item_id":"b07cbd9b08d531fa","text":"The + user wants me to call get_weather for two cities in parallel - Tokyo and Atlantis. + I need to make both function calls in the same turn without waiting for one + to complete before starting the other.\n\nI''ll use the parallel function call + syntax with two separate function calls.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":61,"output_index":0,"content_index":0,"item_id":"b07cbd9b08d531fa","part":{"text":"The + user wants me to call get_weather for two cities in parallel - Tokyo and Atlantis. + I need to make both function calls in the same turn without waiting for one + to complete before starting the other.\n\nI''ll use the parallel function call + syntax with two separate function calls.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":62,"output_index":0,"item":{"content":[{"text":"The + user wants me to call get_weather for two cities in parallel - Tokyo and Atlantis. + I need to make both function calls in the same turn without waiting for one + to complete before starting the other.\n\nI''ll use the parallel function call + syntax with two separate function calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"b07cbd9b08d531fa","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":63,"output_index":1,"item":{"arguments":"","call_id":"call_9414b35ff8c7cc7d","caller":null,"id":"b724e9b7307961c5","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":64,"output_index":1,"delta":"{\"city\": + \"","item_id":"b724e9b7307961c5"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":65,"output_index":1,"delta":"Tok","item_id":"b724e9b7307961c5"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":66,"output_index":1,"delta":"yo","item_id":"b724e9b7307961c5"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":67,"output_index":1,"delta":"\"}","item_id":"b724e9b7307961c5"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":68,"output_index":1,"arguments":"{\"city\": + \"Tokyo\"}","item_id":"b724e9b7307961c5","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":69,"output_index":1,"item":{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_9414b35ff8c7cc7d","caller":null,"id":"b724e9b7307961c5","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":70,"output_index":2,"item":{"arguments":"","call_id":"call_97d7de60219cf423","caller":null,"id":"893bcf2d6214105c","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":71,"output_index":2,"delta":"{\"city\": + \"","item_id":"893bcf2d6214105c"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":72,"output_index":2,"delta":"Atl","item_id":"893bcf2d6214105c"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":73,"output_index":2,"delta":"antis","item_id":"893bcf2d6214105c"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":74,"output_index":2,"delta":"\"}","item_id":"893bcf2d6214105c"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":75,"output_index":2,"arguments":"{\"city\": + \"Atlantis\"}","item_id":"893bcf2d6214105c","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":76,"output_index":2,"item":{"arguments":"{\"city\": + \"Atlantis\"}","call_id":"call_97d7de60219cf423","caller":null,"id":"893bcf2d6214105c","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":77,"response":{"conversation_id":null,"created_at":1787817557,"error":null,"id":"resp_01a0423a-fb67-79c0-a385-5b642828f47d","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to call get_weather for two cities in parallel - Tokyo and Atlantis. + I need to make both function calls in the same turn without waiting for one + to complete before starting the other.\n\nI''ll use the parallel function call + syntax with two separate function calls.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"b07cbd9b08d531fa","status":null,"summary":[],"type":"reasoning"},{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_9414b35ff8c7cc7d","id":"b724e9b7307961c5","name":"get_weather","status":"completed","type":"function_call"},{"arguments":"{\"city\": + \"Atlantis\"}","call_id":"call_97d7de60219cf423","id":"893bcf2d6214105c","name":"get_weather","status":"completed","type":"function_call"}],"previous_response_id":null,"status":"completed","usage":{"input_tokens":849,"input_tokens_details":{"cached_tokens":0},"output_tokens":112,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":961}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: call_9414b35ff8c7cc7d + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in Tokyo? + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423a-fb67-79c0-a385-5b642828f47d + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: invalid_request_error + message: 'tool error: No tool output found for function call call_97d7de60219cf423.' + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 +- filename: t5 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) search the web for the exact query + "Atlantis weather today", and (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817559,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423b-0719-77f1-9a0f-760262de6d49","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817559,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423b-0719-77f1-9a0f-760262de6d49","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"97de3ec29a11b08b","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"97de3ec29a11b08b","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + do","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + two","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + tasks","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + in","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":":","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":"\n","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":"1","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":".","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + Search","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + the","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + web","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + for","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + the","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + exact","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + query","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + \"","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":"Atl","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":"antis","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + weather","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + today","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":"\"","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":"\n","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":"2","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":".","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + Call","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + get","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":"_weather","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + for","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + the","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + city","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + \"","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":"Atl","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":"antis","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":"\"","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":"I","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":" + can","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":" + do","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":" + both","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + of","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":" + these","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + in","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":" + using","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":" + the","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":" + tool","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":" + call","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + interface","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":".","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + Let","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":" + me","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":" + make","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":" + both","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":" + function","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + calls","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + at","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":" + once","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":".","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":"\n","item_id":"97de3ec29a11b08b"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":69,"output_index":0,"content_index":0,"item_id":"97de3ec29a11b08b","text":"The + user wants me to do two tasks in parallel:\n1. Search the web for the exact + query \"Atlantis weather today\"\n2. Call get_weather for the city \"Atlantis\"\n\nI + can do both of these in parallel using the tool call interface. Let me make + both function calls at once.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":70,"output_index":0,"content_index":0,"item_id":"97de3ec29a11b08b","part":{"text":"The + user wants me to do two tasks in parallel:\n1. Search the web for the exact + query \"Atlantis weather today\"\n2. Call get_weather for the city \"Atlantis\"\n\nI + can do both of these in parallel using the tool call interface. Let me make + both function calls at once.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":71,"output_index":0,"item":{"content":[{"text":"The + user wants me to do two tasks in parallel:\n1. Search the web for the exact + query \"Atlantis weather today\"\n2. Call get_weather for the city \"Atlantis\"\n\nI + can do both of these in parallel using the tool call interface. Let me make + both function calls at once.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"97de3ec29a11b08b","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":72,"item":{"action":{"queries":["Atlantis + weather today"],"query":"Atlantis weather today","type":"search"},"id":"ws_9ddb5baf3a7bc482","status":"in_progress","type":"web_search_call"},"output_index":1} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","sequence_number":73,"item_id":"ws_9ddb5baf3a7bc482","output_index":1} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","sequence_number":74,"item_id":"ws_9ddb5baf3a7bc482","output_index":1} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","sequence_number":75,"item":{"action":{"queries":["Atlantis + weather today"],"query":"Atlantis weather today","sources":[{"title":"Atlantis, + FL Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/33462/weather-forecast/328118"},{"title":"Weather + for Atlantis Island, New York, USA","url":"https://www.timeanddate.com/weather/@5107485"},{"title":"10-Day + Weather Forecast for Atlantis, Florida - The Weather Channel ...","url":"https://weather.com/us/florida/city/atlantis/tenday"},{"title":"Atlantis, + MD Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/21409/weather-forecast/2169413"},{"title":"Atlantis, + Florida | Current Weather Forecasts, Live Radar Maps ...","url":"https://www.weatherbug.com/weather-forecast/now/atlantis-fl-33462"},{"title":"Hourly + Weather Forecast for Atlantis, Florida 33462 - The Weather ...","url":"https://weather.com/weather/hourbyhour/l/Atlantis+FL+USFL0626:1:US"},{"title":"Atlantis + Weather Forecast: Hourly & 7-Day Outlook for Florida • ...","url":"https://www.predictwind.com/weather/united-states/florida/atlantis"},{"title":"National + Weather Service","url":"https://forecast.weather.gov/MapClick.php?site=mfl&map.x=264&map.y=64"},{"title":"Atlantis, + FL Hourly Weather | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/33462/hourly-weather-forecast/328118"},{"title":"Atlantis, + Florida, USA 14 day weather forecast","url":"https://www.timeanddate.com/weather/@4146372/ext"}],"type":"search"},"id":"ws_9ddb5baf3a7bc482","status":"completed","type":"web_search_call"},"item_id":"ws_9ddb5baf3a7bc482","output_index":1} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":76,"item":{"action":{"queries":["Atlantis + weather today"],"query":"Atlantis weather today","sources":[{"title":"Atlantis, + FL Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/33462/weather-forecast/328118"},{"title":"Weather + for Atlantis Island, New York, USA","url":"https://www.timeanddate.com/weather/@5107485"},{"title":"10-Day + Weather Forecast for Atlantis, Florida - The Weather Channel ...","url":"https://weather.com/us/florida/city/atlantis/tenday"},{"title":"Atlantis, + MD Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/21409/weather-forecast/2169413"},{"title":"Atlantis, + Florida | Current Weather Forecasts, Live Radar Maps ...","url":"https://www.weatherbug.com/weather-forecast/now/atlantis-fl-33462"},{"title":"Hourly + Weather Forecast for Atlantis, Florida 33462 - The Weather ...","url":"https://weather.com/weather/hourbyhour/l/Atlantis+FL+USFL0626:1:US"},{"title":"Atlantis + Weather Forecast: Hourly & 7-Day Outlook for Florida • ...","url":"https://www.predictwind.com/weather/united-states/florida/atlantis"},{"title":"National + Weather Service","url":"https://forecast.weather.gov/MapClick.php?site=mfl&map.x=264&map.y=64"},{"title":"Atlantis, + FL Hourly Weather | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/33462/hourly-weather-forecast/328118"},{"title":"Atlantis, + Florida, USA 14 day weather forecast","url":"https://www.timeanddate.com/weather/@4146372/ext"}],"type":"search"},"id":"ws_9ddb5baf3a7bc482","status":"completed","type":"web_search_call"},"output_index":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":77,"output_index":2,"item":{"arguments":"","call_id":"call_b7e54e3ef5ad6dec","caller":null,"id":"8f0daec56e69545e","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":78,"output_index":2,"delta":"{\"city\": + \"","item_id":"8f0daec56e69545e"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":79,"output_index":2,"delta":"Atl","item_id":"8f0daec56e69545e"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":80,"output_index":2,"delta":"antis","item_id":"8f0daec56e69545e"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":81,"output_index":2,"delta":"\"}","item_id":"8f0daec56e69545e"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":82,"output_index":2,"arguments":"{\"city\": + \"Atlantis\"}","item_id":"8f0daec56e69545e","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":83,"output_index":2,"item":{"arguments":"{\"city\": + \"Atlantis\"}","call_id":"call_b7e54e3ef5ad6dec","caller":null,"id":"8f0daec56e69545e","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":84,"response":{"conversation_id":null,"created_at":1787817560,"error":null,"id":"resp_01a0423b-0719-77f1-9a0f-760262de6d49","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to do two tasks in parallel:\n1. Search the web for the exact + query \"Atlantis weather today\"\n2. Call get_weather for the city \"Atlantis\"\n\nI + can do both of these in parallel using the tool call interface. Let me make + both function calls at once.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"97de3ec29a11b08b","status":null,"summary":[],"type":"reasoning"},{"action":{"queries":["Atlantis + weather today"],"query":"Atlantis weather today","sources":[{"title":"Atlantis, + FL Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/33462/weather-forecast/328118"},{"title":"Weather + for Atlantis Island, New York, USA","url":"https://www.timeanddate.com/weather/@5107485"},{"title":"10-Day + Weather Forecast for Atlantis, Florida - The Weather Channel ...","url":"https://weather.com/us/florida/city/atlantis/tenday"},{"title":"Atlantis, + MD Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/21409/weather-forecast/2169413"},{"title":"Atlantis, + Florida | Current Weather Forecasts, Live Radar Maps ...","url":"https://www.weatherbug.com/weather-forecast/now/atlantis-fl-33462"},{"title":"Hourly + Weather Forecast for Atlantis, Florida 33462 - The Weather ...","url":"https://weather.com/weather/hourbyhour/l/Atlantis+FL+USFL0626:1:US"},{"title":"Atlantis + Weather Forecast: Hourly & 7-Day Outlook for Florida • ...","url":"https://www.predictwind.com/weather/united-states/florida/atlantis"},{"title":"National + Weather Service","url":"https://forecast.weather.gov/MapClick.php?site=mfl&map.x=264&map.y=64"},{"title":"Atlantis, + FL Hourly Weather | AccuWeather","url":"https://www.accuweather.com/en/us/atlantis/33462/hourly-weather-forecast/328118"},{"title":"Atlantis, + Florida, USA 14 day weather forecast","url":"https://www.timeanddate.com/weather/@4146372/ext"}],"type":"search"},"id":"ws_9ddb5baf3a7bc482","status":"completed","type":"web_search_call"},{"arguments":"{\"city\": + \"Atlantis\"}","call_id":"call_b7e54e3ef5ad6dec","id":"8f0daec56e69545e","name":"get_weather","status":"completed","type":"function_call"}],"previous_response_id":null,"status":"completed","usage":{"input_tokens":854,"input_tokens_details":{"cached_tokens":0},"output_tokens":123,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":977}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t6 + request: + body: + input: + - content: Never mind the weather lookup -- just tell me one fun fact about + Atlantis instead. + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-0719-77f1-9a0f-760262de6d49 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: invalid_request_error + message: 'tool error: No tool output found for function call call_b7e54e3ef5ad6dec.' + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-nonstreaming.yaml new file mode 100644 index 00000000..2bd41ffb --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-nonstreaming.yaml @@ -0,0 +1,737 @@ +turns: +- filename: t1 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "London", and + (2) call get_weather for "Tokyo".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812431 + created_at: 1787812430 + error: null + frequency_penalty: 0.0 + id: resp_0a5e3c6121cde6b2006a8fda4e94dc87d0aa55fbde4ca0cac4 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - arguments: '{"city":"London"}' + call_id: call_WE8wWgV8UgVDxfoioUOBTOto + id: fc_0a5e3c6121cde6b2006a8fda4fc05887d0a35805c5b1e3a9c9 + name: get_weather + status: completed + type: function_call + - arguments: '{"city":"Tokyo"}' + call_id: call_Agme3xEY7hwsd4ce5PdLuswX + id: fc_0a5e3c6121cde6b2006a8fda4fc07087d0a3afe2cfa6431c6d + name: get_weather + status: completed + type: function_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 4600 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 4557 + output_tokens: 48 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 4648 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_WE8wWgV8UgVDxfoioUOBTOto + output: '{"error": "weather service unavailable: upstream timeout"}' + type: function_call_output + - call_id: call_Agme3xEY7hwsd4ce5PdLuswX + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What did you find for each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0a5e3c6121cde6b2006a8fda4e94dc87d0aa55fbde4ca0cac4 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812433 + created_at: 1787812432 + error: null + frequency_penalty: 0.0 + id: resp_0a5e3c6121cde6b2006a8fda507be087d0bffd23e048c74064 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: + - annotations: [] + logprobs: [] + text: '- **London:** Weather lookup failed because the service timed out. + + - **Tokyo:** **22°C**, clear.' + type: output_text + id: msg_0a5e3c6121cde6b2006a8fda51276087d0a5479db983ea3823 + phase: final_answer + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_0a5e3c6121cde6b2006a8fda4e94dc87d0aa55fbde4ca0cac4 + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 4713 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 4670 + output_tokens: 27 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 4740 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "Tokyo", and + (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812438 + created_at: 1787812435 + error: null + frequency_penalty: 0.0 + id: resp_0c1c9e8e0577a7db006a8fda53774c87d0bae32d76950ae3b8 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pWmv_C6VzOmq8zPnhLNFyCEdMdD9Ku2De-GVXExUda55SGUrQ2pY8TwES3jYgein_4NxwaCf62d61zC8NmIESNnVbdHBHCMqGsC5H3HGUs9HLPupv0hKIPnShJlcvi8ju3r8BSZPrlvtiC6Ltn2TfRc8QOoT3oiUrvquZIAEsiSMmiqByTWJBPxAewH76jcCYB4aTOI3Jepc_VVXP9fI7LE3XhYtSdwNILxK4Dw-gkPR1Yuw5Z8aznAK1lLf6kgfljLQ61xSRb9ny7x5_nj5_NY-MdFSfkm2AuLxHy3MzdpU3n2cHTFLeRbmasZy1qmqIC1w3Dq8TUbZd7C99ykXk54usec1WpfXWjIYvgfkZbAo23FaRA0ZHiF6Mv2puLplaVb5YfB9uxFyTmxvml2bCTWSnHVlgJqXTMIocVSYXA-CsDqmHBrw-FtvtlPNFsZpzLvYGlXGwje20iIna8u5ZiO8I4hI2PaKF8Pa_F1zeaEwJRBINdkg-f9kKerXxPCthRg108ExjLJFgVK-yVy8J0eMrgxdgucReYb-ao3rkCC5de5IYXI0hWwI-vOTeRQlmANkOFTb88r8zjuf_2ZDi57XS9wtZ-q7eUeRo5ptauFyhNkikq-8iZXvCTXx6D1VqZ9tpr-T0NeuSXR2ESanVlhl8llHitLvZOfFB7no8HA5rE1hNoJs1GecjoiiZb0mX_ySbo9n1vs2n6m0mY6udJ_sFJ5RPX9JnI4xTYv6CME4XasDFfIPfySza1DRAbqO7V7HDxhmC5QsFMZ9Kc0WJXsMZXFaO7PIunRc97Wws338lakQIP8DRNvLMt11MlKRRFqu2s2IfcEeWiKRLIvFi05GhasmNBWGZpRLF6lvwbaUUnyp0OgCVTbMGuUb-G3mEZmuk93yWIkfsiOK5viGgvWf_wzdRcMnFVwMNjh5ZGx5I18hIwFi3jBzrrz2mGNjIEuabJT_RjHBmkt0i1FLXu3pXwxE8GLEZxhJ-ZES8__qxWvez2vYzn1zRRhhuZpRENdcdROhBuT-W7vvIvu9-OmTPiTC0JH3WSDxb6POL1ZboOG-OvG0-6cw1mobI1dgTwdqLL-Q2PuosZAtGG9DG2ZwrhF_sFv-hM-JGz8CtVQSgvipsEmqPlsgwvaLAlSz0HLKqNE_1Rjsl82zQKVseEoxhMs3kfRPvB6gKzTrDQT5YsbqmJHH6VFAErLV7N8DeCYWn3-x726SWyFJ_5mpS5Kg== + id: rs_0c1c9e8e0577a7db006a8fda55ac5c87d08f39deed67b7a6c5 + summary: [] + type: reasoning + - arguments: '{"city":"Tokyo"}' + call_id: call_FjBBRxripdVfWpvRo1GDyGvr + id: fc_0c1c9e8e0577a7db006a8fda56151c87d0b3069c2aba8db747 + name: get_weather + status: completed + type: function_call + - arguments: '{"city":"Atlantis"}' + call_id: call_RPIOKOFk43QbxegFLRxh1GxC + id: fc_0c1c9e8e0577a7db006a8fda56153087d0ace5e1b80a5f2ada + name: get_weather + status: completed + type: function_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 4601 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 4558 + output_tokens: 63 + output_tokens_details: + reasoning_tokens: 12 + total_tokens: 4664 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: call_FjBBRxripdVfWpvRo1GDyGvr + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in Tokyo? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0c1c9e8e0577a7db006a8fda53774c87d0bae32d76950ae3b8 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: null + message: No tool output found for function call call_RPIOKOFk43QbxegFLRxh1GxC. + param: input + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 +- filename: t5 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) search the web for the exact query + "Atlantis weather today", and (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812445 + created_at: 1787812440 + error: null + frequency_penalty: 0.0 + id: resp_0d4d6420d6ed155e006a8fda58ebd887d088ae9c603a58c9b8 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pdeAb3o8hirz8AJvIo-4CLtfrXCnQD_28E_PVeXWhbcTEx-cRTT9LUBj5K6rRtJ54hJNADtfwOM1jts0GW3HvhuGX-jdFmdkSpH06HN29EE8GuLEhUofohXs7XjRyDa9G3VXILZ8lfKk5aRBzOgJz1b4KcabdP_PPWQnSHuWpk3xZSQonjQRxpE_Ao2nIOxPWCDNy46CiR81MdyeyMC90NunN6fewA0F0m8gUOCku7zABFunOhCGkXNjnXNPynJK-hkPJEFp8Xl5qJ6YEzpDFmsb5H36S_9mInluO3GgEK44lP2gWrL4dxKHvRPGFHMdFPMZhE5Olpqw7EAXo30R8BM86ZBnQTPtGQTacO2KAmodwQp4iUE1DTfVY797PbmMrpt26YMNQNYl11YbgEwmJkQNIw9s-xXPtk49YODqHuDGSm3edX2ihGyVP0syadBaAmQQ8sXC8dPcup_sTD4C7267-w7rrlViJEbHNkbfUKhFcKgEiJHCsEGidjtLk5w0ywcyUsCVQekZaDUThunF87dHGk6m39c3g-IY-X1-OnpJgjqaDXOYY2cnx-8Yy97EQM33GD-HsJl1_4oYnq7CI43Lun-UoXaUkcBq3kTTdXID3hfjTg4Uo3bhtJrCAsMsSmED46bf75zceexqi1m5X6hUHr2xbAKwMUwuKMRkQllV44f2dkIW-9Lh3daj6AAtlXYX5mj_rvfckKW-BSmk5pRH5MML7H6lmORLQpwVcIG3Tcx0mKLNa3DjUtTQhLTOnobUqlZlzCTDftshEhOiSSLOfwL4qsTf4RrTesPwpwdeBw-3iLLRSU2WPYAer9W7EoVzTCv9EPkQNWgpc4YyZOdMK2w3fD8_sYGCcOow4NeWDYwUOcxtJWpHHuYSn9DV8--Zrj4L49gTj7kSjnrGlxQUV9p0cqgzw1ScfgYqY3EWCTKtAEhe9-3fTyLiwEpbGTvRXB4Q3OoS3OeITrR7jNfYY2djZfK6apWu-0nzd0H847ZlqVmGzjWhkIRzdqPy2m4mA6B-R48HLZ0o2vM9XOy9YZ3KPNpPXvUozoDTqgrmjJHFGe3UV5qjvSH1oB18XqNocbl1JS3hTWEiVP1tjut5NgcVgqQDYnLb7Tf9pCmz7b0c3pV0z7_6tekf-7wBGAuxvF3kO7fmR0mLVd7jbCToHmLezshIz7B6MmGRa-VGtf7Th-91736pEN3ARKJDDmXTR4cS2VYSxpMgEy0ohD7PRnCnwy87YN7Q-N20lY9oPNvRJrWahKWqAn8iStagMeNm4QoI5cEfOhKk40qOaVU8qxl8EZzHrtbv6Kh6KfW5citodX5IPBgdHm8TeqpGihvInpwX5Yvls3scXg0WPhZ7gf_5WervjQ4N7vVxkpDUjnW38iYYm0_cck-aNGXn9wP-w0AAXpRmyQcE4jWAPqHKg5UniNqiGwXFJetGa5mPR729m-qV9CzvNZYZd9OZrForQ7aRZLsuRkmJzsurp88Tw8NzkowvDee79emCMA7tlYRYHPKtHgz-llYM2uGKXT6E3ptaRcXarCiHh0lrCg8NsMUF31OCbLu5jV7ySq2iwFFGqoNx8Fdazo-0yt-bhBsP0OWnZMrCchU71waw1BICEkHzfrOAXtJ6rUrYcsPi6Jb9So1wS_oL-Cdz-GuhSIHHyKUgAty2ICxvXWVNfoEIdoUQl9NYvxuuKDij_jErZFq6K8GJDvyIjgDTLj98TsXSnuFAJEvky6aTKQHXGJdQTngo4LXKm6r_2EB21ZCpA6q8rAnqYCxGB7xQvBkdNszOTe-gcdpDwxP8dWiRQW7y6I4dTys0psPGMFlpDaF8bXqe9BTcw5KqFWZUijKVRbpFvVMeho-MNzhcj6WEzTjbg8qr3wEb0n7BmJ-obTBV8yxoHvt8joZD3fuF9R3Wb05SlKf0b2JIQtPWcDEnDbrDGuzH-SO_dS0vrOjaJJe6P4bwprB_ZXb8iNlMfoJo6YBE8NYnEtG-19-b0HDU7FPST-PjlKEXVoip0RMgB7EynYoLlyr6FvUui_qb193c67nDhJtZ944kFObg8q9tAHsLmPCRD1nBE36srq7X8pFnI= + id: rs_0d4d6420d6ed155e006a8fda59aed887d0a8ce7f135b964c4e + summary: [] + type: reasoning + - action: + queries: + - '"Atlantis weather today"' + query: '"Atlantis weather today"' + type: search + id: ws_0d4d6420d6ed155e006a8fda5b579087d0be582f37bde92fdf + status: completed + type: web_search_call + - arguments: '{"city":"Atlantis"}' + call_id: call_DdPmBVseli7XUMPMbKii0SOX + id: fc_0d4d6420d6ed155e006a8fda5ce3c487d0a07d3b09faba768c + name: get_weather + status: completed + type: function_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 1 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 8692 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 4564 + output_tokens: 174 + output_tokens_details: + reasoning_tokens: 155 + total_tokens: 8866 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t6 + request: + body: + input: + - content: Never mind the weather lookup -- just tell me one fun fact about + Atlantis instead. + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0d4d6420d6ed155e006a8fda58ebd887d088ae9c603a58c9b8 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: null + message: No tool output found for function call call_DdPmBVseli7XUMPMbKii0SOX. + param: input + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-streaming.yaml new file mode 100644 index 00000000..3dfa6da4 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-failures-openai-reference-gpt-5.6-streaming.yaml @@ -0,0 +1,1006 @@ +turns: +- filename: t1 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "London", and + (2) call get_weather for "Tokyo".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65","object":"response","created_at":1787812362,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65","object":"response","created_at":1787812362,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0aebdab56c74fb92006a8fda0bcc7487d09625bbb4ab55f454","type":"function_call","status":"in_progress","arguments":"","call_id":"call_2Rmk7Ubi1d3tJ8bqzCeCLPyk","name":"get_weather"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"London\"}","item_id":"fc_0aebdab56c74fb92006a8fda0bcc7487d09625bbb4ab55f454","obfuscation":"KiP8N2sPuXMbIwi","output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"London\"}","item_id":"fc_0aebdab56c74fb92006a8fda0bcc7487d09625bbb4ab55f454","output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0aebdab56c74fb92006a8fda0bcc7487d09625bbb4ab55f454","type":"function_call","status":"completed","arguments":"{\"city\":\"London\"}","call_id":"call_2Rmk7Ubi1d3tJ8bqzCeCLPyk","name":"get_weather"},"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0aebdab56c74fb92006a8fda0bcc8887d0acea329dd6c2f2ac","type":"function_call","status":"in_progress","arguments":"","call_id":"call_f0nWTjDVt9ClTVq1Nfj59m9J","name":"get_weather"},"output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Tokyo\"}","item_id":"fc_0aebdab56c74fb92006a8fda0bcc8887d0acea329dd6c2f2ac","obfuscation":"","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Tokyo\"}","item_id":"fc_0aebdab56c74fb92006a8fda0bcc8887d0acea329dd6c2f2ac","output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0aebdab56c74fb92006a8fda0bcc8887d0acea329dd6c2f2ac","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_f0nWTjDVt9ClTVq1Nfj59m9J","name":"get_weather"},"output_index":1,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65","object":"response","created_at":1787812362,"status":"completed","background":false,"completed_at":1787812363,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"fc_0aebdab56c74fb92006a8fda0bcc7487d09625bbb4ab55f454","type":"function_call","status":"completed","arguments":"{\"city\":\"London\"}","call_id":"call_2Rmk7Ubi1d3tJ8bqzCeCLPyk","name":"get_weather"},{"id":"fc_0aebdab56c74fb92006a8fda0bcc8887d0acea329dd6c2f2ac","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_f0nWTjDVt9ClTVq1Nfj59m9J","name":"get_weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":4600,"input_tokens_details":{"cache_write_tokens":49,"cached_tokens":4508},"output_tokens":48,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":4648},"user":null,"metadata":{}},"sequence_number":10} + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_2Rmk7Ubi1d3tJ8bqzCeCLPyk + output: '{"error": "weather service unavailable: upstream timeout"}' + type: function_call_output + - call_id: call_f0nWTjDVt9ClTVq1Nfj59m9J + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What did you find for each of those two cities? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0aebdab56c74fb92006a8fda0c514887d088304ea46bfd64fd","object":"response","created_at":1787812364,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0aebdab56c74fb92006a8fda0c514887d088304ea46bfd64fd","object":"response","created_at":1787812364,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"77H37UJJ0un4gu2","output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"u6NzE0tYqLiw6","output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"London","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"kxyx7vtsfv","output_index":0,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":":**","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"ApEI9vkdh53iS","output_index":0,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" The","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"yhxzyigzV9AW","output_index":0,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" weather","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"esW8E1rD","output_index":0,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" service","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"Su09Tiqi","output_index":0,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" timed","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"vLwVbqqcqk","output_index":0,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" out","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"l8yJDaNOdEA6","output_index":0,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"7MFbpkr1K0Bvf4d","output_index":0,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" so","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"gWJYXyu88EdPD","output_index":0,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" no","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"lsHQjS4r6Seix","output_index":0,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" weather","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"BwjyquUB","output_index":0,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" data","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"PpX6YOxjRgn","output_index":0,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" was","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"LiqYrWAWvUPj","output_index":0,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" returned","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"8R8i06A","output_index":0,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".\n","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"Hs9IHyjEwKuYZL","output_index":0,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"KcZVR7Z4G7Vdo8H","output_index":0,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"p0SJ63xm08MmF","output_index":0,"sequence_number":22} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Tokyo","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"1lu7VYieTM2","output_index":0,"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":":**","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"gcySgsFnzPUtK","output_index":0,"sequence_number":24} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"14i4G8GzS0B5p","output_index":0,"sequence_number":25} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"22","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"ZJijd57ivrs82p","output_index":0,"sequence_number":26} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"CRfQVBgZOdVb40","output_index":0,"sequence_number":27} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**,","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"sA5Dva1DMsuwh","output_index":0,"sequence_number":28} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" clear","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"5kRrZu1qT0","output_index":0,"sequence_number":29} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"obfuscation":"cklD6HgnG3tcFBP","output_index":0,"sequence_number":30} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","logprobs":[],"output_index":0,"sequence_number":31,"text":"- + **London:** The weather service timed out, so no weather data was returned.\n- + **Tokyo:** **22°C**, clear."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **London:** The weather service timed out, so no weather data was returned.\n- + **Tokyo:** **22°C**, clear."},"sequence_number":32} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **London:** The weather service timed out, so no weather data was returned.\n- + **Tokyo:** **22°C**, clear."}],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":33} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0aebdab56c74fb92006a8fda0c514887d088304ea46bfd64fd","object":"response","created_at":1787812364,"status":"completed","background":false,"completed_at":1787812365,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"msg_0aebdab56c74fb92006a8fda0ce35c87d09ba612d6639d5859","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"- + **London:** The weather service timed out, so no weather data was returned.\n- + **Tokyo:** **22°C**, clear."}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0aebdab56c74fb92006a8fda0a423887d08b2938692efd1b65","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":4713,"input_tokens_details":{"cache_write_tokens":113,"cached_tokens":4557},"output_tokens":31,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":4744},"user":null,"metadata":{}},"sequence_number":34} + + ' + - ' + + ' + status_code: 200 +- filename: t3 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) call get_weather for "Tokyo", and + (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_03785e5502eb8c40006a8fda0f142487d0a54a91f252f28626","object":"response","created_at":1787812367,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_03785e5502eb8c40006a8fda0f142487d0a54a91f252f28626","object":"response","created_at":1787812367,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_03785e5502eb8c40006a8fda0febb887d0a0aac017b8d59d71","type":"function_call","status":"in_progress","arguments":"","call_id":"call_rPnqhB9bG91nRPUT3ogN6agj","name":"get_weather"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Tokyo\"}","item_id":"fc_03785e5502eb8c40006a8fda0febb887d0a0aac017b8d59d71","obfuscation":"","output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Tokyo\"}","item_id":"fc_03785e5502eb8c40006a8fda0febb887d0a0aac017b8d59d71","output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_03785e5502eb8c40006a8fda0febb887d0a0aac017b8d59d71","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_rPnqhB9bG91nRPUT3ogN6agj","name":"get_weather"},"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_03785e5502eb8c40006a8fda0febcc87d08af4eea434369729","type":"function_call","status":"in_progress","arguments":"","call_id":"call_CXSmlw46AHbsPaGBuFujw8TN","name":"get_weather"},"output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Atlantis\"}","item_id":"fc_03785e5502eb8c40006a8fda0febcc87d08af4eea434369729","obfuscation":"OIZaGhAI11vUd","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Atlantis\"}","item_id":"fc_03785e5502eb8c40006a8fda0febcc87d08af4eea434369729","output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_03785e5502eb8c40006a8fda0febcc87d08af4eea434369729","type":"function_call","status":"completed","arguments":"{\"city\":\"Atlantis\"}","call_id":"call_CXSmlw46AHbsPaGBuFujw8TN","name":"get_weather"},"output_index":1,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_03785e5502eb8c40006a8fda0f142487d0a54a91f252f28626","object":"response","created_at":1787812367,"status":"completed","background":false,"completed_at":1787812367,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"fc_03785e5502eb8c40006a8fda0febb887d0a0aac017b8d59d71","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_rPnqhB9bG91nRPUT3ogN6agj","name":"get_weather"},{"id":"fc_03785e5502eb8c40006a8fda0febcc87d08af4eea434369729","type":"function_call","status":"completed","arguments":"{\"city\":\"Atlantis\"}","call_id":"call_CXSmlw46AHbsPaGBuFujw8TN","name":"get_weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":4601,"input_tokens_details":{"cache_write_tokens":50,"cached_tokens":4508},"output_tokens":49,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":4650},"user":null,"metadata":{}},"sequence_number":10} + + ' + - ' + + ' + status_code: 200 +- filename: t4 + request: + body: + input: + - call_id: call_rPnqhB9bG91nRPUT3ogN6agj + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - content: What's the weather in Tokyo? + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_03785e5502eb8c40006a8fda0f142487d0a54a91f252f28626 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: null + message: No tool output found for function call call_CXSmlw46AHbsPaGBuFujw8TN. + param: input + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 +- filename: t5 + request: + body: + input: 'Do both of these right now, in parallel, in this single turn -- do not + wait for one before starting another: (1) search the web for the exact query + "Atlantis weather today", and (2) call get_weather for "Atlantis".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0996a9fa4f1eac02006a8fda12fc6c87d0b1544996cee68cbb","object":"response","created_at":1787812371,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0996a9fa4f1eac02006a8fda12fc6c87d0b1544996cee68cbb","object":"response","created_at":1787812371,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0996a9fa4f1eac02006a8fda139bb087d0b4ddcd395bc907b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oT37-xzZrsk_Ma18FxDMJ-nmWlsoCx3FX2R3xi6mj6K3mvSNP8kprDQjDKuRqkf7byGp_XOU_XQbR04beGmKnvwmjvSQtHWVxiGCOvq07VDpAVeP7IeSt_eCLLnhgIMka-ojijaOEOqiF7QVRwiMR-HNQuabmykgWZ3pJ9-Cos_BC0oZwh5Kia3rR_rC4LbGLtQqDYG8au0a9Yv3JZhcf-aD8Qn_AgqwPnM9LwRZaFC-j0m8ShcUHv-AzD6z0JgfyUZZUOonkBiQ1yJKospWGp_WON9k6cDWOVYwP1FcNePlnMtsEnPPEDYxIMcM7j26i5EGyd3LZzp53vTyOHtQrjdXpi44mvphk0JtqeDAxLdwTzaV3DiatWmiq1l5R2pq79IxrWLLiUS7HFXxxDGdEDkHqv0wulYPK8lHW0cYhqPJ0A0OajScVoOn0hnn7lS7LjY2zq3TbX4QgTTPdvYri17pzwqQLmn2W8hf3wi1XxjGvfD88E7AHELh0eNk87v5lHUirFzHV2FgHRpClOEA2YomeCQgLjSkdi-N4Zu4tRRyemHULn1WsoUaRcL1DNEFjlZ0zbBdvvjHbj1xjDWP7Id221F7CZwwOT0g7AGLZl3Ntjd66k_dpr_PRqBogLvpAQZ3Sdpoz5axn1eoPKgBRbBXpeQKPcjq0WsOxY3g50jLGcMM9iQ1WAQpPbUaJWJr-Q6UGqILgZNDDfb6VU1pCQMHYDpZosXymXFHOhbpqaJtQKnHe4fE3IbUV1diY9RBhFvBAX0FFulWLrn1oUUfEL4b9FGmWXHIwGdvwPHR3PnBpaWzg40VqBv9njEUPjOd5g1qkiaLD-9gp7a0vGlxdGV8BSjDo-DEoFI3qWC7RgS_rrEbzf9CCtChVStpQQCRModgyBuB1NWQRDpCSwhMwzsFtJaANqyOcFnURyekxXSrIgjdvllvN30hbQfMPsvzdq44KAVXwIFRbev2FYs766_HnEACIN_pif5tESI7PFhvPXv6chVcKviJq43qdEjblCFa-4o0eSJAgaiWVd7QKHlSuc-EKUCp6QPy7Szmo-eGxugCYKWgwHY2ocwFbc_ZT2pg_MIU5yQYYx7hB1jUGlfWwuerhAhTzHvVu763YYC8inbZO1qu3Qw292UdHk1GOzLPz-e1yVfAyLfWq_BvldNw==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0996a9fa4f1eac02006a8fda139bb087d0b4ddcd395bc907b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oUE16pc8Lj2PC4JTgjg4pV4ezmj4FWlFeW5Ovx0bImvspruKcF43W1WBCE1xqXDcRUPJw5QR4KKtht98UjRoZp60up2zl-U5xkQseQEiPIWGYUid2mNMbVbHXqduGcAjqvKsESuefqs60LzDJwOvec7tJaRDLFCwM-VaYRaY8OYYh1v7boH8sdIfH8LT8dApR6s_rP8kqc9ODDqOVzmECOSGL_kgDM8HGO9HYX4HNAEltEraVYR6siW1BATyJawT9jgYaIq_gkz-_b-QuxAXktwF0OIN9BPek_KU_g-0Hh-bTOMdR0jY24BbQ1w8WAlpEBTLvk9CDDqA9h1i8-8LiYFxu1A1LaE6wlaLcxnBG9o2RZOJIi8P6WtNH00-sW_QmntVWnMXUbJIxk86rg5MRYYZ3A8RnGPb1grxPBgbuFOiy1sBIcHB73KVFmAzPxMWu_Yk_ULyNmzjUAQr900fmMQReZzCBZrxT07NNf7g5A2S0i4nWjdbol1RVPBiqEgFCgCPUOnIyVkWlr5UWgPludheGd2n0IP_J5nrKcBUXNy0tlWlmacmIIX44bc-nUYezgKNL8UqrpW0WhiDC_wHR_EFIoB1UrQT1AnIYofvm51md6pPBbqjV0IUx1KgKPhrP7CXMt3bhRfhfHnxlN7WLiMEZcBeHI_xlyHhp3kzzfbzRSvHCN0oA_HcWm-hOB_t9dD3B_BBi_mq9S56RHfa2gnt4n7LTPVb-GCZKXIYSGhfropWpnEa4OnqPhCq90uhR1wEYMqpvnwNwtfuJvFK2R7_FewFrtwt86ixhx65QSX-T2W91a2KnznW91kyl2v8CtFX81VqbHRrP_zxo0RQFMdKZLGW52ZQQNBFpMqAAVC-2PUlLm1sv5tgWqHHF2aJRX0XwBax8iIWn-1RgJ9x2qEH_Lu1EoLY40n10U4WdXUOmnSDO8J-UlzbTgTeLOJyMefDu_Nc8_4ZiN4HpY7vom57_3iKg1mKt0FQDUZFYSyZMO9zrpVcIFLa6v_iVh2J3izLKUhcd7M0H9prfQR02p7-f8WESvWNlz8a24Rh7UrEdWlm01bZ1ksaAv-5cjczxLlDsP0JQNZi2GLWINaP6h5okTuU9yQERRcYa0sEeOVh4k7-60i3CwGB7SKzHLF4EjKWW9R4iCZCd70yI3AcEGSdjgl-ZQp2Zl3ZTI7wTPKkwrBtGpAgjWPo-ymgHIJWK6kYZhjIvSXLT38vUMFeVgP4HLwjfQz0XG58iEV_RbuB7FD6SPrEtT5N507xCVHFZmb6TcavDXQ3PWlqAxwnhDm5oXT_LNzX9DSahG7BMmR2zixa4XiynRlUNZtDAdvqwpHFViXOq3A46-geTRZGUpGK7jbEIpo00KCBhdng-dIssigiVqmLp2zaQvh8mZW4XagRPlPeDPNvTvhnZ9koSv8_rXADi3BUicL-bf1zOcAJvjknbLfvqwz952EIziS6UCYpF3GSMqWjB-gpnf1SC9LmH5sImDdZj3DBMMnKKkeNG6yWo9727iBVsdCfI71FXVmiHxUe2LDPuSTS8WgfXbzmsvEd65dmkkOpgJimyRyaQ=","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"ws_0996a9fa4f1eac02006a8fda14beb487d0a958ebc4160be49f","type":"web_search_call","status":"in_progress"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_0996a9fa4f1eac02006a8fda14beb487d0a958ebc4160be49f","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","item_id":"ws_0996a9fa4f1eac02006a8fda14beb487d0a958ebc4160be49f","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","item_id":"ws_0996a9fa4f1eac02006a8fda14beb487d0a958ebc4160be49f","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"ws_0996a9fa4f1eac02006a8fda14beb487d0a958ebc4160be49f","type":"web_search_call","status":"completed","action":{"type":"search","queries":["Atlantis + weather today"],"query":"Atlantis weather today"}},"output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0996a9fa4f1eac02006a8fda17ba5487d0aa00e8928f76f052","type":"function_call","status":"in_progress","arguments":"","call_id":"call_DEaAwUh96sgGW7uHc3W3jUAt","name":"get_weather"},"output_index":2,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"city\":\"Atlantis\"}","item_id":"fc_0996a9fa4f1eac02006a8fda17ba5487d0aa00e8928f76f052","obfuscation":"MgTtxq7dl1fFu","output_index":2,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Atlantis\"}","item_id":"fc_0996a9fa4f1eac02006a8fda17ba5487d0aa00e8928f76f052","output_index":2,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0996a9fa4f1eac02006a8fda17ba5487d0aa00e8928f76f052","type":"function_call","status":"completed","arguments":"{\"city\":\"Atlantis\"}","call_id":"call_DEaAwUh96sgGW7uHc3W3jUAt","name":"get_weather"},"output_index":2,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0996a9fa4f1eac02006a8fda12fc6c87d0b1544996cee68cbb","object":"response","created_at":1787812371,"status":"completed","background":false,"completed_at":1787812377,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0996a9fa4f1eac02006a8fda139bb087d0b4ddcd395bc907b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oZxp3Za_aBdHMNvPnqcxYyEVc8cWWFY8kVXqIRQm695rXqCZ4JqxKfx3xj8BKGo_p9GCPdItPDXQCxGRdU5ULzi4ZxPuZ6hDCmPEtU79MdSnfPAVb8fPOZtjt5ug8PUKqq4_GdL7ksEldcJcjBuOWwmODSczST3msenUSgl7iU_0hcgoyPDEWnLYw28Rycne0Rahzvklm3h8PponLbD31U7kKfQIW7Ww6yAJ60Y7B49OU3Ew81u_P3VW0k3GZ-Dy7s3CJ5b3iLvI8xi7PQCXwWiCWGyNZZN1J4tTlise2m7sbA5t9GzEfQ7uCxzuyZKECgv3I4KUTdq2YPfeR3uBOpcVHMxUUQoCW_hhiaQFS5RBAc7buaEVIINI6KgUxpGbO7W2hdZQLED96MsYkArkt1Rnj7veomYYK3QA5FtvAVWN4NgMrHz7vkbN9VXpXu3pZsV3RGzg7q_NTreCJGt7Dn5eE_WJZnggzfNLuGCIx3vlRMPd5Ux60IFJgO8MLET1zJFGk2Dlg_2krjJpq_zfetUksSJSQpL9stp4DdfPXAzDfPDCI20lDHgN5FdprFUCTnuuDkk3vxqt_QQn78zJAvCciPlQ-AUe3JNf3EBXZtvzUiJqu_Jd4m86POnvynhMme79oMmO69JLPySyKsNxjmF_vaYofqJp7mUKmKHhTI1ONfLAjgRgVTR8PfuW8JRSDh6LUtVhAMgkfDL2iaMZWhuX0ABcAxq0EQcD4B9fh9zFSdVgXYLiRQcSkV-RIn21U16b5wKaylC4c2saadibfSHd0A0smrZ3BSRqclONtcinHV-umiTEzokf7h2utRNKVnw-EeA4_JSvFq8UbK3ufpIHxS_NwwbV4J8SdZQXoGg3zmmAKrVf4FsKZsVmOicPZd8KoamMYy_CcWptxvchev_Ee2yQVEfTcxM6BPdif5-g20yKhaYgzYYXsrPn9shw4rKm1ZGugeQ37sJEsWYXWAozv71kyizX7HAT7V9EKScMV8O0hHYstI5xgwYAjCV2KlkwsK4Cc25e6kEqh-rdO4sHt_F9zOXSXFZDX73tUmN-qxMQ3m-dLCe-WtpS91JA43cQKqOT-FaiOkAYXt1sBVDNf6IE0an-W_-dPvecw27vVB0e6tG_ir3OW0l9fL-gtS-n_d72-7vk2PxtjYU6vOHAHk6nR-jUuViDnjXHqc2d4YVcy5LDO7V05uTyoRR9q3xXEbgD0A3TJ-aBPTmOz6_SQhDZoXykirxvorcs8gsryVmq70lsd0VrT3Ym4GL6RhxBLkciURgrTPYoSXSwY_6r7vuMAGDP2lJaomFWxsnEnpjnFWMxXJF5Rb8F-C4R2iJ9K0dnck7tohoQnUFl8ZYdLEElDLpqgtDvCw3T6IaV38GNSP7K8QroOEnnb-QBqTPUteKXmxwebqmU0s4AzE2c5WoVkCEhE2yWeFMbWiUPSW-w_coOA6FmTW17m6Kga-txKm3PjAZZ_ak-5yMy9RtJL3SqT2BmTmE9kLVcLv-NYqNU0iHxjJ7f7FDTLv-V1cioHsIym4R-ITZ-WZoXo8y9rFN4ltBhPFeWKJLWh9-FQ=","summary":[]},{"id":"ws_0996a9fa4f1eac02006a8fda14beb487d0a958ebc4160be49f","type":"web_search_call","status":"completed","action":{"type":"search","queries":["Atlantis + weather today"],"query":"Atlantis weather today"}},{"id":"fc_0996a9fa4f1eac02006a8fda17ba5487d0aa00e8928f76f052","type":"function_call","status":"completed","arguments":"{\"city\":\"Atlantis\"}","call_id":"call_DEaAwUh96sgGW7uHc3W3jUAt","name":"get_weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":1}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":8769,"input_tokens_details":{"cache_write_tokens":56,"cached_tokens":4508},"output_tokens":107,"output_tokens_details":{"reasoning_tokens":88},"total_tokens":8876},"user":null,"metadata":{}},"sequence_number":13} + + ' + - ' + + ' + status_code: 200 +- filename: t6 + request: + body: + input: + - content: Never mind the weather lookup -- just tell me one fun fact about + Atlantis instead. + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0996a9fa4f1eac02006a8fda12fc6c87d0b1544996cee68cbb + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + error: + code: null + message: No tool output found for function call call_DEaAwUh96sgGW7uHc3W3jUAt. + param: input + type: invalid_request_error + headers: + content-type: application/json + status_code: 400 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml new file mode 100644 index 00000000..cf2d633b --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-nonstreaming.yaml @@ -0,0 +1,243 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call set_temperature_unit to set my preferred unit to "fahrenheit" for + the rest of this conversation, and (3) search the web for the exact query + "Tokyo weather today".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817589 + error: null + id: resp_01a0423b-761a-7de2-9dda-f59ce8cfb860 + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user wants me to do three tasks in parallel in a single turn: + + 1. Call get_weather for "Tokyo" + + 2. Call set_temperature_unit with "fahrenheit" + + 3. Search the web for "Tokyo weather today" + + + I can use multiple tool calls in parallel. Let me make all three calls + now. + + ' + type: reasoning_text + encrypted_content: null + id: rs_83c80e0117ea3486 + status: null + summary: [] + type: reasoning + - arguments: '{"city": "Tokyo"}' + call_id: chatcmpl-tool-aef4fb79e54dcbef + id: fc_b4a7aefcc07205a9 + name: get_weather + status: completed + type: function_call + - call_id: chatcmpl-tool-8d012ccc3ffaf382 + id: ctc_96f3a7c0c9e73acc + input: fahrenheit + name: set_temperature_unit + status: completed + type: custom_tool_call + - action: + queries: + - Tokyo weather today + query: Tokyo weather today + sources: + - title: Tokyo, Tokyo, Japan Weather Forecast | AccuWeather + url: https://www.accuweather.com/en/jp/tokyo/226396/weather-forecast/226396 + - title: 10-Day Weather Forecast for Tokyo, Tokyo Prefecture, Japan - The + ... + url: https://weather.com/jp/tokyo-prefecture/city/tokyo/tenday + - title: Weather & Geography | Japan's Weather | Travel Japan | JNTO + url: https://www.japan.travel/en/weather/ + - title: Japan Meteorological Agency | Weather forecast + url: https://www.data.jma.go.jp/multi/yoho/yoho_detail.html?code=130010&lang=en + - title: Tokyo, Japan Hourly Weather Forecast | Weather Underground + url: https://www.wunderground.com/hourly/jp/tokyo + - title: Tokyo - BBC Weather + url: https://www.bbc.com/weather/1850147 + - title: Tokyo, Japan Weather Conditions | Weather Underground + url: https://www.wunderground.com/weather/jp/tokyo + - title: Tokyo, Japan 14 day weather forecast + url: https://www.timeanddate.com/weather/japan/tokyo/ext + - title: Tokyo, JP Weather Forecast, Conditions, and Maps – Yahoo Weather + url: https://weather.yahoo.com/jp/tokyo-prefecture/tokyo/ + - title: Tokyo, 13, JP 14 Days Weather - The Weather Network + url: https://www.theweathernetwork.com/en/city/jp/tokyo/tokyo/14-days + type: search + id: ws_85db965b56d59a82 + status: completed + type: web_search_call + previous_response_id: null + status: completed + usage: + input_tokens: 879 + input_tokens_details: + cached_tokens: 0 + output_tokens: 155 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 1034 + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: chatcmpl-tool-aef4fb79e54dcbef + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: chatcmpl-tool-8d012ccc3ffaf382 + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: Now report Tokyo's current temperature using the unit I just told + you to prefer. + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423b-761a-7de2-9dda-f59ce8cfb860 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + conversation_id: null + created_at: 1787817591 + error: null + id: resp_01a0423b-7b5c-7aa3-86bb-415984805e1b + incomplete_details: null + instructions: null + model: Qwen/Qwen3.5-35B-A3B-FP8 + object: response + output: + - content: + - text: 'The user just set their temperature unit preference to fahrenheit, + and now wants me to report Tokyo''s current temperature in that unit. + From the get_weather tool call, I can see that Tokyo''s current temperature + is 22°C (Celsius). I need to convert this to Fahrenheit. + + + The conversion formula is: F = (C × 9/5) + 32 + + + So for 22°C: + + F = (22 × 9/5) + 32 + + F = (22 × 1.8) + 32 + + F = 39.6 + 32 + + F = 71.6°F + + + So Tokyo''s current temperature is approximately 72°F (or 71.6°F if I + want to be more precise). + + ' + type: reasoning_text + encrypted_content: null + id: rs_87b128d4ea1f33a0 + status: null + summary: [] + type: reasoning + - content: + - annotations: [] + text: ' + + + Based on the weather data, Tokyo''s current temperature is approximately + **72°F** (71.6°F to be precise), with clear conditions.' + type: output_text + id: msg_85fb5c1465a64a5f + role: assistant + status: completed + type: message + previous_response_id: resp_01a0423b-761a-7de2-9dda-f59ce8cfb860 + status: completed + usage: + input_tokens: 4098 + input_tokens_details: + cached_tokens: 0 + output_tokens: 202 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 4300 + headers: + content-type: application/json + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml new file mode 100644 index 00000000..843b98a2 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-gateway-Qwen-Qwen3.5-35B-A3B-FP8-streaming.yaml @@ -0,0 +1,3191 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call set_temperature_unit to set my preferred unit to "fahrenheit" for + the rest of this conversation, and (3) search the web for the exact query + "Tokyo weather today".' + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817541,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-bdbf-78b1-903d-30fe7583a938","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817541,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-bdbf-78b1-903d-30fe7583a938","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"a0aef0827cd8123f","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"a0aef0827cd8123f","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + make","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + three","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":" + function","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + calls","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + in","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":",","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":" + all","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + in","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + a","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + single","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + turn","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":",","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + without","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + waiting","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + for","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":" + one","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":" + to","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + complete","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + before","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + starting","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + another","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":".","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":" + This","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + is","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + a","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + straightforward","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":" + request","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + -","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + I","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + need","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":" + to","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":" + make","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":" + three","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + parallel","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":" + calls","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":":","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":"1","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":".","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + get","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":"_weather","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":" + for","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":" + \"","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":"Tok","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":"yo","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":"\"","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":"\n","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":"2","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":".","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":" + set","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":"_temperature","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":"_unit","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":" + with","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":" + \"","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":"f","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":"ahrenheit","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":"\"","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":"\n","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":"3","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":".","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + web","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":"_search","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":" + for","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":" + \"","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":"Tok","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":"yo","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":0,"content_index":0,"delta":" + weather","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":0,"content_index":0,"delta":" + today","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":0,"content_index":0,"delta":"\"","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":0,"content_index":0,"delta":"I","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":81,"output_index":0,"content_index":0,"delta":"''ll","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":82,"output_index":0,"content_index":0,"delta":" + make","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":83,"output_index":0,"content_index":0,"delta":" + all","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":84,"output_index":0,"content_index":0,"delta":" + three","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":85,"output_index":0,"content_index":0,"delta":" + calls","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":86,"output_index":0,"content_index":0,"delta":" + now","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":87,"output_index":0,"content_index":0,"delta":" + using","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":88,"output_index":0,"content_index":0,"delta":" + the","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":89,"output_index":0,"content_index":0,"delta":" + appropriate","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":90,"output_index":0,"content_index":0,"delta":" + parameters","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":91,"output_index":0,"content_index":0,"delta":".","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":0,"content_index":0,"delta":"\n","item_id":"a0aef0827cd8123f"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":93,"output_index":0,"content_index":0,"item_id":"a0aef0827cd8123f","text":"The + user wants me to make three function calls in parallel, all in a single turn, + without waiting for one to complete before starting another. This is a straightforward + request - I need to make three parallel calls:\n\n1. get_weather for \"Tokyo\"\n2. + set_temperature_unit with \"fahrenheit\"\n3. web_search for \"Tokyo weather + today\"\n\nI''ll make all three calls now using the appropriate parameters.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":94,"output_index":0,"content_index":0,"item_id":"a0aef0827cd8123f","part":{"text":"The + user wants me to make three function calls in parallel, all in a single turn, + without waiting for one to complete before starting another. This is a straightforward + request - I need to make three parallel calls:\n\n1. get_weather for \"Tokyo\"\n2. + set_temperature_unit with \"fahrenheit\"\n3. web_search for \"Tokyo weather + today\"\n\nI''ll make all three calls now using the appropriate parameters.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":95,"output_index":0,"item":{"content":[{"text":"The + user wants me to make three function calls in parallel, all in a single turn, + without waiting for one to complete before starting another. This is a straightforward + request - I need to make three parallel calls:\n\n1. get_weather for \"Tokyo\"\n2. + set_temperature_unit with \"fahrenheit\"\n3. web_search for \"Tokyo weather + today\"\n\nI''ll make all three calls now using the appropriate parameters.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"a0aef0827cd8123f","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":96,"output_index":1,"item":{"arguments":"","call_id":"call_9ab2e998ab96b129","caller":null,"id":"a1e4af4d3ac9276b","name":"get_weather","namespace":null,"status":"in_progress","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":97,"output_index":1,"delta":"{\"city\": + \"","item_id":"a1e4af4d3ac9276b"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":98,"output_index":1,"delta":"Tok","item_id":"a1e4af4d3ac9276b"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":99,"output_index":1,"delta":"yo","item_id":"a1e4af4d3ac9276b"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","sequence_number":100,"output_index":1,"delta":"\"}","item_id":"a1e4af4d3ac9276b"} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","sequence_number":101,"output_index":1,"arguments":"{\"city\": + \"Tokyo\"}","item_id":"a1e4af4d3ac9276b","name":"get_weather"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":102,"output_index":1,"item":{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_9ab2e998ab96b129","caller":null,"id":"a1e4af4d3ac9276b","name":"get_weather","namespace":null,"status":"completed","type":"function_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":103,"output_index":2,"item":{"call_id":"call_888025bf9211e0e9","id":"ctc_01c46ddf8b54f237","input":"","name":"set_temperature_unit","status":"in_progress","type":"custom_tool_call"}} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","sequence_number":104,"output_index":2,"delta":"f","item_id":"ctc_01c46ddf8b54f237"} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","sequence_number":105,"output_index":2,"delta":"ahrenheit","item_id":"ctc_01c46ddf8b54f237"} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.done + + ' + - 'data: {"type":"response.custom_tool_call_input.done","sequence_number":106,"output_index":2,"input":"fahrenheit","item_id":"ctc_01c46ddf8b54f237"} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":107,"output_index":2,"item":{"call_id":"call_888025bf9211e0e9","id":"ctc_01c46ddf8b54f237","input":"fahrenheit","name":"set_temperature_unit","status":"completed","type":"custom_tool_call"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":108,"item":{"action":{"queries":["Tokyo + weather today"],"query":"Tokyo weather today","type":"search"},"id":"ws_b96fafd4f00652b2","status":"in_progress","type":"web_search_call"},"output_index":3} + + ' + - ' + + ' + - 'event: response.web_search_call.in_progress + + ' + - 'data: {"type":"response.web_search_call.in_progress","sequence_number":109,"item_id":"ws_b96fafd4f00652b2","output_index":3} + + ' + - ' + + ' + - 'event: response.web_search_call.searching + + ' + - 'data: {"type":"response.web_search_call.searching","sequence_number":110,"item_id":"ws_b96fafd4f00652b2","output_index":3} + + ' + - ' + + ' + - 'event: response.web_search_call.completed + + ' + - 'data: {"type":"response.web_search_call.completed","sequence_number":111,"item":{"action":{"queries":["Tokyo + weather today"],"query":"Tokyo weather today","sources":[{"title":"Tokyo, Tokyo, + Japan Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/jp/tokyo/226396/weather-forecast/226396"},{"title":"10-Day + Weather Forecast for Tokyo, Tokyo Prefecture, Japan - The ...","url":"https://weather.com/jp/tokyo-prefecture/city/tokyo/tenday"},{"title":"Weather + & Geography | Japan''s Weather | Travel Japan | JNTO","url":"https://www.japan.travel/en/weather/"},{"title":"Japan + Meteorological Agency | Weather forecast","url":"https://www.data.jma.go.jp/multi/yoho/yoho_detail.html?code=130010&lang=en"},{"title":"Tokyo, + Japan Hourly Weather Forecast | Weather Underground","url":"https://www.wunderground.com/hourly/jp/tokyo"},{"title":"Tokyo + - BBC Weather","url":"https://www.bbc.com/weather/1850147"},{"title":"Tokyo, + Japan Weather Conditions | Weather Underground","url":"https://www.wunderground.com/weather/jp/tokyo"},{"title":"Tokyo, + Japan 14 day weather forecast","url":"https://www.timeanddate.com/weather/japan/tokyo/ext"},{"title":"Tokyo, + JP Weather Forecast, Conditions, and Maps – Yahoo Weather","url":"https://weather.yahoo.com/jp/tokyo-prefecture/tokyo/"},{"title":"Tokyo, + 13, JP 14 Days Weather - The Weather Network","url":"https://www.theweathernetwork.com/en/city/jp/tokyo/tokyo/14-days"}],"type":"search"},"id":"ws_b96fafd4f00652b2","status":"completed","type":"web_search_call"},"item_id":"ws_b96fafd4f00652b2","output_index":3} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":112,"item":{"action":{"queries":["Tokyo + weather today"],"query":"Tokyo weather today","sources":[{"title":"Tokyo, Tokyo, + Japan Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/jp/tokyo/226396/weather-forecast/226396"},{"title":"10-Day + Weather Forecast for Tokyo, Tokyo Prefecture, Japan - The ...","url":"https://weather.com/jp/tokyo-prefecture/city/tokyo/tenday"},{"title":"Weather + & Geography | Japan''s Weather | Travel Japan | JNTO","url":"https://www.japan.travel/en/weather/"},{"title":"Japan + Meteorological Agency | Weather forecast","url":"https://www.data.jma.go.jp/multi/yoho/yoho_detail.html?code=130010&lang=en"},{"title":"Tokyo, + Japan Hourly Weather Forecast | Weather Underground","url":"https://www.wunderground.com/hourly/jp/tokyo"},{"title":"Tokyo + - BBC Weather","url":"https://www.bbc.com/weather/1850147"},{"title":"Tokyo, + Japan Weather Conditions | Weather Underground","url":"https://www.wunderground.com/weather/jp/tokyo"},{"title":"Tokyo, + Japan 14 day weather forecast","url":"https://www.timeanddate.com/weather/japan/tokyo/ext"},{"title":"Tokyo, + JP Weather Forecast, Conditions, and Maps – Yahoo Weather","url":"https://weather.yahoo.com/jp/tokyo-prefecture/tokyo/"},{"title":"Tokyo, + 13, JP 14 Days Weather - The Weather Network","url":"https://www.theweathernetwork.com/en/city/jp/tokyo/tokyo/14-days"}],"type":"search"},"id":"ws_b96fafd4f00652b2","status":"completed","type":"web_search_call"},"output_index":3} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":113,"response":{"conversation_id":null,"created_at":1787817542,"error":null,"id":"resp_01a0423a-bdbf-78b1-903d-30fe7583a938","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to make three function calls in parallel, all in a single turn, + without waiting for one to complete before starting another. This is a straightforward + request - I need to make three parallel calls:\n\n1. get_weather for \"Tokyo\"\n2. + set_temperature_unit with \"fahrenheit\"\n3. web_search for \"Tokyo weather + today\"\n\nI''ll make all three calls now using the appropriate parameters.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"a0aef0827cd8123f","status":null,"summary":[],"type":"reasoning"},{"arguments":"{\"city\": + \"Tokyo\"}","call_id":"call_9ab2e998ab96b129","id":"a1e4af4d3ac9276b","name":"get_weather","status":"completed","type":"function_call"},{"call_id":"call_888025bf9211e0e9","id":"ctc_01c46ddf8b54f237","input":"fahrenheit","name":"set_temperature_unit","status":"completed","type":"custom_tool_call"},{"action":{"queries":["Tokyo + weather today"],"query":"Tokyo weather today","sources":[{"title":"Tokyo, Tokyo, + Japan Weather Forecast | AccuWeather","url":"https://www.accuweather.com/en/jp/tokyo/226396/weather-forecast/226396"},{"title":"10-Day + Weather Forecast for Tokyo, Tokyo Prefecture, Japan - The ...","url":"https://weather.com/jp/tokyo-prefecture/city/tokyo/tenday"},{"title":"Weather + & Geography | Japan''s Weather | Travel Japan | JNTO","url":"https://www.japan.travel/en/weather/"},{"title":"Japan + Meteorological Agency | Weather forecast","url":"https://www.data.jma.go.jp/multi/yoho/yoho_detail.html?code=130010&lang=en"},{"title":"Tokyo, + Japan Hourly Weather Forecast | Weather Underground","url":"https://www.wunderground.com/hourly/jp/tokyo"},{"title":"Tokyo + - BBC Weather","url":"https://www.bbc.com/weather/1850147"},{"title":"Tokyo, + Japan Weather Conditions | Weather Underground","url":"https://www.wunderground.com/weather/jp/tokyo"},{"title":"Tokyo, + Japan 14 day weather forecast","url":"https://www.timeanddate.com/weather/japan/tokyo/ext"},{"title":"Tokyo, + JP Weather Forecast, Conditions, and Maps – Yahoo Weather","url":"https://weather.yahoo.com/jp/tokyo-prefecture/tokyo/"},{"title":"Tokyo, + 13, JP 14 Days Weather - The Weather Network","url":"https://www.theweathernetwork.com/en/city/jp/tokyo/tokyo/14-days"}],"type":"search"},"id":"ws_b96fafd4f00652b2","status":"completed","type":"web_search_call"}],"previous_response_id":null,"status":"completed","usage":{"input_tokens":879,"input_tokens_details":{"cached_tokens":0},"output_tokens":174,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":1053}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_9ab2e998ab96b129 + output: '{"city": "Tokyo", "temperature_c": 22, "condition": "Clear"}' + type: function_call_output + - call_id: call_888025bf9211e0e9 + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: Now report Tokyo's current temperature using the unit I just told + you to prefer. + role: user + type: message + max_output_tokens: 2048 + model: Qwen/Qwen3.5-35B-A3B-FP8 + parallel_tool_calls: true + previous_response_id: resp_01a0423a-bdbf-78b1-903d-30fe7583a938 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","sequence_number":0,"response":{"background":false,"created_at":1787817543,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-c54a-7d93-939e-0611d55beecd","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-bdbf-78b1-903d-30fe7583a938","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","sequence_number":1,"response":{"background":false,"created_at":1787817543,"ec_transfer_params":null,"frequency_penalty":0.0,"id":"resp_01a0423a-c54a-7d93-939e-0611d55beecd","incomplete_details":null,"input_messages":null,"instructions":null,"kv_transfer_params":null,"max_output_tokens":2048,"max_tool_calls":null,"metadata":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[],"output_messages":null,"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_01a0423a-bdbf-78b1-903d-30fe7583a938","prompt":null,"reasoning":null,"service_tier":"auto","status":"in_progress","temperature":1.0,"text":null,"tool_choice":"auto","tools":[{"allowed_callers":null,"defer_loading":null,"description":"Search + the public web for current information and return structured web and news results.","name":"web_search","output_schema":null,"parameters":{"anyOf":[{"required":["query"]},{"required":["queries"]}],"properties":{"count":{"description":"Maximum + results per section, from 1 to 100.","type":"integer"},"country":{"description":"Optional + ISO 3166-1 alpha-2 country code.","type":"string"},"exclude_domains":{"description":"Optional + domain blocklist.","items":{"type":"string"},"type":"array"},"freshness":{"description":"Optional + recency filter: day, week, month, year, or YYYY-MM-DDtoYYYY-MM-DD.","type":"string"},"include_domains":{"description":"Optional + strict allowlist of domains.","items":{"type":"string"},"type":"array"},"language":{"description":"Optional + BCP 47 language code.","type":"string"},"queries":{"description":"Multiple independent + search queries to run in parallel, instead of a single query.","items":{"type":"string"},"type":"array"},"query":{"description":"The + natural language web search query.","type":"string"}},"type":"object"},"strict":false,"type":"function"},{"allowed_callers":null,"defer_loading":null,"description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"additionalProperties":false,"properties":{"city":{"description":"City + name, e.g. Tokyo","type":"string"}},"required":["city"],"type":"object"},"strict":true,"type":"function"},{"description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","name":"set_temperature_unit","type":"custom"}],"top_logprobs":null,"top_p":0.95,"truncation":"disabled","usage":null,"user":null}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"content":null,"encrypted_content":null,"id":"8d933190acbbebc9","status":"in_progress","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.reasoning_part.added + + ' + - 'data: {"type":"response.reasoning_part.added","sequence_number":3,"output_index":0,"content_index":0,"item_id":"8d933190acbbebc9","part":{"text":"","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"The","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":5,"output_index":0,"content_index":0,"delta":" + user","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":6,"output_index":0,"content_index":0,"delta":" + wants","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":7,"output_index":0,"content_index":0,"delta":" + me","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":8,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":9,"output_index":0,"content_index":0,"delta":" + report","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":10,"output_index":0,"content_index":0,"delta":" + Tokyo","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":11,"output_index":0,"content_index":0,"delta":"''s","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":12,"output_index":0,"content_index":0,"delta":" + current","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":13,"output_index":0,"content_index":0,"delta":" + temperature","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":14,"output_index":0,"content_index":0,"delta":" + in","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":15,"output_index":0,"content_index":0,"delta":" + Fahrenheit","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":16,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":17,"output_index":0,"content_index":0,"delta":" + I","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":18,"output_index":0,"content_index":0,"delta":" + just","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":19,"output_index":0,"content_index":0,"delta":" + set","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":20,"output_index":0,"content_index":0,"delta":" + the","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":21,"output_index":0,"content_index":0,"delta":" + temperature","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":22,"output_index":0,"content_index":0,"delta":" + unit","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":23,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":24,"output_index":0,"content_index":0,"delta":" + f","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":25,"output_index":0,"content_index":0,"delta":"ahrenheit","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":26,"output_index":0,"content_index":0,"delta":",","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":27,"output_index":0,"content_index":0,"delta":" + and","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":28,"output_index":0,"content_index":0,"delta":" + I","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":29,"output_index":0,"content_index":0,"delta":" + have","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":30,"output_index":0,"content_index":0,"delta":" + the","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":31,"output_index":0,"content_index":0,"delta":" + weather","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":32,"output_index":0,"content_index":0,"delta":" + data","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":33,"output_index":0,"content_index":0,"delta":" + from","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":34,"output_index":0,"content_index":0,"delta":" + the","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":35,"output_index":0,"content_index":0,"delta":" + get","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":36,"output_index":0,"content_index":0,"delta":"_weather","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":37,"output_index":0,"content_index":0,"delta":" + call","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":38,"output_index":0,"content_index":0,"delta":" + which","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":39,"output_index":0,"content_index":0,"delta":" + shows","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":40,"output_index":0,"content_index":0,"delta":":","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":41,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":42,"output_index":0,"content_index":0,"delta":"-","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":43,"output_index":0,"content_index":0,"delta":" + temperature","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":44,"output_index":0,"content_index":0,"delta":"_c","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":45,"output_index":0,"content_index":0,"delta":":","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":46,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":47,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":48,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":49,"output_index":0,"content_index":0,"delta":" + (","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":50,"output_index":0,"content_index":0,"delta":"C","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":51,"output_index":0,"content_index":0,"delta":"elsius","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":52,"output_index":0,"content_index":0,"delta":")","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":53,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":54,"output_index":0,"content_index":0,"delta":"-","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":55,"output_index":0,"content_index":0,"delta":" + condition","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":56,"output_index":0,"content_index":0,"delta":":","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":57,"output_index":0,"content_index":0,"delta":" + \"","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":58,"output_index":0,"content_index":0,"delta":"Clear","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":59,"output_index":0,"content_index":0,"delta":"\"","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":60,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":61,"output_index":0,"content_index":0,"delta":"I","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":62,"output_index":0,"content_index":0,"delta":" + need","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":63,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":64,"output_index":0,"content_index":0,"delta":" + convert","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":65,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":66,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":67,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":68,"output_index":0,"content_index":0,"delta":"°C","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":69,"output_index":0,"content_index":0,"delta":" + to","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":70,"output_index":0,"content_index":0,"delta":" + Fahrenheit","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":71,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":72,"output_index":0,"content_index":0,"delta":" + The","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":73,"output_index":0,"content_index":0,"delta":" + formula","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":74,"output_index":0,"content_index":0,"delta":" + is","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":75,"output_index":0,"content_index":0,"delta":":","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":76,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":77,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":78,"output_index":0,"content_index":0,"delta":" + =","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":79,"output_index":0,"content_index":0,"delta":" + (","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":80,"output_index":0,"content_index":0,"delta":"°","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":81,"output_index":0,"content_index":0,"delta":"C","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":82,"output_index":0,"content_index":0,"delta":" + ×","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":83,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":84,"output_index":0,"content_index":0,"delta":"9","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":85,"output_index":0,"content_index":0,"delta":"/","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":86,"output_index":0,"content_index":0,"delta":"5","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":87,"output_index":0,"content_index":0,"delta":")","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":88,"output_index":0,"content_index":0,"delta":" + +","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":89,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":90,"output_index":0,"content_index":0,"delta":"3","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":91,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":92,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":93,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":94,"output_index":0,"content_index":0,"delta":" + =","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":95,"output_index":0,"content_index":0,"delta":" + (","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":96,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":97,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":98,"output_index":0,"content_index":0,"delta":" + ×","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":99,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":100,"output_index":0,"content_index":0,"delta":"9","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":101,"output_index":0,"content_index":0,"delta":"/","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":102,"output_index":0,"content_index":0,"delta":"5","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":103,"output_index":0,"content_index":0,"delta":")","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":104,"output_index":0,"content_index":0,"delta":" + +","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":105,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":106,"output_index":0,"content_index":0,"delta":"3","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":107,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":108,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":109,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":110,"output_index":0,"content_index":0,"delta":" + =","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":111,"output_index":0,"content_index":0,"delta":" + (","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":112,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":113,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":114,"output_index":0,"content_index":0,"delta":" + ×","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":115,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":116,"output_index":0,"content_index":0,"delta":"1","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":117,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":118,"output_index":0,"content_index":0,"delta":"8","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":119,"output_index":0,"content_index":0,"delta":")","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":120,"output_index":0,"content_index":0,"delta":" + +","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":121,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":122,"output_index":0,"content_index":0,"delta":"3","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":123,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":124,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":125,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":126,"output_index":0,"content_index":0,"delta":" + =","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":127,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":128,"output_index":0,"content_index":0,"delta":"3","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":129,"output_index":0,"content_index":0,"delta":"9","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":130,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":131,"output_index":0,"content_index":0,"delta":"6","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":132,"output_index":0,"content_index":0,"delta":" + +","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":133,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":134,"output_index":0,"content_index":0,"delta":"3","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":135,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":136,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":137,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":138,"output_index":0,"content_index":0,"delta":" + =","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":139,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":140,"output_index":0,"content_index":0,"delta":"7","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":141,"output_index":0,"content_index":0,"delta":"1","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":142,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":143,"output_index":0,"content_index":0,"delta":"6","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":144,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":145,"output_index":0,"content_index":0,"delta":"\n\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":146,"output_index":0,"content_index":0,"delta":"So","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":147,"output_index":0,"content_index":0,"delta":" + approximately","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":148,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":149,"output_index":0,"content_index":0,"delta":"7","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":150,"output_index":0,"content_index":0,"delta":"2","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":151,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":152,"output_index":0,"content_index":0,"delta":" + or","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":153,"output_index":0,"content_index":0,"delta":" + ","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":154,"output_index":0,"content_index":0,"delta":"7","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":155,"output_index":0,"content_index":0,"delta":"1","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":156,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":157,"output_index":0,"content_index":0,"delta":"6","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":158,"output_index":0,"content_index":0,"delta":"°F","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":159,"output_index":0,"content_index":0,"delta":".","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.delta + + ' + - 'data: {"type":"response.reasoning_text.delta","sequence_number":160,"output_index":0,"content_index":0,"delta":"\n","item_id":"8d933190acbbebc9"} + + ' + - ' + + ' + - 'event: response.reasoning_text.done + + ' + - 'data: {"type":"response.reasoning_text.done","sequence_number":161,"output_index":0,"content_index":0,"item_id":"8d933190acbbebc9","text":"The + user wants me to report Tokyo''s current temperature in Fahrenheit. I just set + the temperature unit to fahrenheit, and I have the weather data from the get_weather + call which shows:\n\n- temperature_c: 22 (Celsius)\n- condition: \"Clear\"\n\nI + need to convert 22°C to Fahrenheit. The formula is:\n°F = (°C × 9/5) + 32\n°F + = (22 × 9/5) + 32\n°F = (22 × 1.8) + 32\n°F = 39.6 + 32\n°F = 71.6°F\n\nSo approximately + 72°F or 71.6°F.\n"} + + ' + - ' + + ' + - 'event: response.reasoning_part.done + + ' + - 'data: {"type":"response.reasoning_part.done","sequence_number":162,"output_index":0,"content_index":0,"item_id":"8d933190acbbebc9","part":{"text":"The + user wants me to report Tokyo''s current temperature in Fahrenheit. I just set + the temperature unit to fahrenheit, and I have the weather data from the get_weather + call which shows:\n\n- temperature_c: 22 (Celsius)\n- condition: \"Clear\"\n\nI + need to convert 22°C to Fahrenheit. The formula is:\n°F = (°C × 9/5) + 32\n°F + = (22 × 9/5) + 32\n°F = (22 × 1.8) + 32\n°F = 39.6 + 32\n°F = 71.6°F\n\nSo approximately + 72°F or 71.6°F.\n","type":"reasoning_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":163,"output_index":0,"item":{"content":[{"text":"The + user wants me to report Tokyo''s current temperature in Fahrenheit. I just set + the temperature unit to fahrenheit, and I have the weather data from the get_weather + call which shows:\n\n- temperature_c: 22 (Celsius)\n- condition: \"Clear\"\n\nI + need to convert 22°C to Fahrenheit. The formula is:\n°F = (°C × 9/5) + 32\n°F + = (22 × 9/5) + 32\n°F = (22 × 1.8) + 32\n°F = 39.6 + 32\n°F = 71.6°F\n\nSo approximately + 72°F or 71.6°F.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8d933190acbbebc9","status":"completed","summary":[],"type":"reasoning"}} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","sequence_number":164,"output_index":1,"item":{"content":[],"id":"99ac35569ad5c7e4","phase":null,"role":"assistant","status":"in_progress","type":"message"}} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","sequence_number":165,"output_index":1,"content_index":0,"item_id":"99ac35569ad5c7e4","part":{"annotations":[],"logprobs":[],"text":"","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":166,"output_index":1,"content_index":0,"delta":"\n\nBased","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":167,"output_index":1,"content_index":0,"delta":" + on","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":168,"output_index":1,"content_index":0,"delta":" + the","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":169,"output_index":1,"content_index":0,"delta":" + weather","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":170,"output_index":1,"content_index":0,"delta":" + data","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":171,"output_index":1,"content_index":0,"delta":",","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":172,"output_index":1,"content_index":0,"delta":" + Tokyo","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":173,"output_index":1,"content_index":0,"delta":"''s","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":174,"output_index":1,"content_index":0,"delta":" + current","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":175,"output_index":1,"content_index":0,"delta":" + temperature","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":176,"output_index":1,"content_index":0,"delta":" + is","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":177,"output_index":1,"content_index":0,"delta":" + **","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":178,"output_index":1,"content_index":0,"delta":"7","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":179,"output_index":1,"content_index":0,"delta":"2","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":180,"output_index":1,"content_index":0,"delta":"°F","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":181,"output_index":1,"content_index":0,"delta":"**","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":182,"output_index":1,"content_index":0,"delta":" + (","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":183,"output_index":1,"content_index":0,"delta":"2","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":184,"output_index":1,"content_index":0,"delta":"2","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":185,"output_index":1,"content_index":0,"delta":"°C","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":186,"output_index":1,"content_index":0,"delta":").","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":187,"output_index":1,"content_index":0,"delta":" + The","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":188,"output_index":1,"content_index":0,"delta":" + conditions","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":189,"output_index":1,"content_index":0,"delta":" + are","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":190,"output_index":1,"content_index":0,"delta":" + clear","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","sequence_number":191,"output_index":1,"content_index":0,"delta":".","item_id":"99ac35569ad5c7e4","logprobs":[]} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","sequence_number":192,"output_index":1,"content_index":0,"item_id":"99ac35569ad5c7e4","logprobs":[],"text":"\n\nBased + on the weather data, Tokyo''s current temperature is **72°F** (22°C). The conditions + are clear."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","sequence_number":193,"output_index":1,"content_index":0,"item_id":"99ac35569ad5c7e4","part":{"annotations":[],"logprobs":null,"text":"\n\nBased + on the weather data, Tokyo''s current temperature is **72°F** (22°C). The conditions + are clear.","type":"output_text"}} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","sequence_number":194,"output_index":1,"item":{"content":[{"annotations":[],"logprobs":null,"text":"\n\nBased + on the weather data, Tokyo''s current temperature is **72°F** (22°C). The conditions + are clear.","type":"output_text"}],"id":"99ac35569ad5c7e4","phase":null,"role":"assistant","status":"completed","summary":[],"type":"message"}} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","sequence_number":195,"response":{"conversation_id":null,"created_at":1787817544,"error":null,"id":"resp_01a0423a-c54a-7d93-939e-0611d55beecd","incomplete_details":null,"instructions":null,"model":"Qwen/Qwen3.5-35B-A3B-FP8","object":"response","output":[{"content":[{"text":"The + user wants me to report Tokyo''s current temperature in Fahrenheit. I just set + the temperature unit to fahrenheit, and I have the weather data from the get_weather + call which shows:\n\n- temperature_c: 22 (Celsius)\n- condition: \"Clear\"\n\nI + need to convert 22°C to Fahrenheit. The formula is:\n°F = (°C × 9/5) + 32\n°F + = (22 × 9/5) + 32\n°F = (22 × 1.8) + 32\n°F = 39.6 + 32\n°F = 71.6°F\n\nSo approximately + 72°F or 71.6°F.\n","type":"reasoning_text"}],"encrypted_content":null,"id":"8d933190acbbebc9","status":null,"summary":[],"type":"reasoning"},{"content":[{"annotations":[],"text":"\n\nBased + on the weather data, Tokyo''s current temperature is **72°F** (22°C). The conditions + are clear.","type":"output_text"}],"id":"99ac35569ad5c7e4","role":"assistant","status":"completed","type":"message"}],"previous_response_id":"resp_01a0423a-bdbf-78b1-903d-30fe7583a938","status":"completed","usage":{"input_tokens":4098,"input_tokens_details":{"cached_tokens":0},"output_tokens":186,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":4284}}} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-nonstreaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-nonstreaming.yaml new file mode 100644 index 00000000..388d8e57 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-nonstreaming.yaml @@ -0,0 +1,311 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call set_temperature_unit to set my preferred unit to "fahrenheit" for + the rest of this conversation, and (3) search the web for the exact query + "Tokyo weather today".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812416 + created_at: 1787812413 + error: null + frequency_penalty: 0.0 + id: resp_0f1f74345fe40507006a8fda3d451887d0b8956953c8ade687 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pAv02WcUPdcnOyt57ieM3hDFivX_p5_iLRnmdUMlbQlk7bDdyM2uQj-7MeZRtcZv2NasG_zo8zfKp1hNqAy2ajyaFQL33y4Ulq5Tr5d-nUdfFm48dsidD3ASNMfBn_l1f5vfXVlfhtvgz9MmSB5-iueuPParWOiR6_hpOX670gVlrRMGhLHbsQvTii0OkbcOTZlESdW3IQRB6GnBmQzFkbmaLUUNTfNQrgfs7cAGAmeyZpRK81PGTyQ_vuz1gDP69hym4pgojuIT2i9GgdScA9DLv50-IrqSVsy92aj4NS6WAnsa-Y7NTaxtqBQ2uTjS7hdTjF5agyYMaufrvUsc9qpRHSqlE0I0LnDFm-e68STVI1-as0FYrRxxrJdLnGJJZEg541GQCcLT6g-dVBPyeqo7retFWISppa338VXHZPFD16wnwANf0STP6pLV80QG3JtoiKKvywmxaRglakGGzV9-XY46AFgSb7ZLsZ8tahPJHbORmXq3BSENS9YAhfsyPKjrG2qAx5pFyVXfTJv05UyNxWJv6HviA1RSFOnbQewvKToS2WbNwxxnYH49kI0bbvfLYRz40tfO0QdAhLmRcUnbEKqWrWKx6qlKCiNeputa-KN1DaIltMtgyVG-JOaUEbrsEOJOnsKuBH6D1L3zfbIG0JU0Js7gkWgjde70Anv3FEHYsUGYjuxGRg6lgun8qUYvKlHOqRYv6ak70PqO43X0ZX9S4c_vbGp7uXkD8x4DYcFX0EYxea7-r2mkoe0zYYUBGDi2vmXXKxKb42WWfREJJyT9ZkqZCdcaQ-e_2eOcsJ-7ZVY0etBM7xpRqzhrLn0JfcRQAU36MwBImHeqapemK8FC4wKzSH7EBANW0e4KoB9x1i_k7Ve-DbbiHgH6PRKh5q7BRZWla-wlZ5ySN-xvZ_UlfXv7QBd-4oC15XJWnEcLL4JbHDYMSNcrr1QogeN-NwbO6P0yFPaHTRffuKiVbmr6A6mHPE5g2LV5_Sj3_WzxOL-QECYiSZ-vTbOu5oeI0wwfBGnUqOZrjkbSunPvF9B1mYhDRBOlQZLPAy18vvpk5LAbrlZ2KvtxZmk46nppkbubZgPK7Lm544YkfFqGwqSKAe-cwzLvgPBxtl8xUIG2WyRWD6ZKM-TNYstodX6enAMYXxpHtxxpBoJJy7BD9Wc6uB25QZqyJoAaFiou0NV8nFT0gTAOlMfiiKb8BPE58528gTUkWm_5G4LHmQxtbm9KpTljaHIcjeCoiS-K_uo7ylcULWBYfSP1B9Tkza7jrvSU1d5yp5PwWb-AKsDw6Jfc3phzNnfilcpvEVSvalxTf4x2yEtwv-moSINrf_9-zcXOx9XiJHD1UzqkfRiok8fgiNCVniAzdCJJ7mPowdWgr5RpocGXq75yTE81aXbPGRdGYUiiZO4hn7F_-ujBUMJJHbdG3-5W4ZXMtot_YpEG97oEglVqlYiJvkIPKDz_j1oSPjTiZyPY5wGj6T7WAddBodSqz23XHK2HWEuA49F_u7WT35XFLm56FEHh43hqcWcZ8CwdVlREtBHGvN9Z5LvyETbPZxtYL5ksWM5mkjnpf_MC_H75wiLSr1gT24YXjpxsI7nbUz6TUro7h4VM3iH26yKqbPOrQbzrMS4nii0yorpWOHqfosqoTcj5_KrKS6U5I849c1Hlmte2Z9jSMdenYNISovDruQ6o8zMcs4RsvEEUshvVGfZo2s1gFQ72_DAIofhIe_GLOEzY8DM7jv5yyM0yHSYoABeTmjNZ_6tR3gt6zGun1l_fiN40A23XoPJpdE1vOTxEtBS_IWQyIteB2dI7VEcMoSKFjUu6gCOtnOUjTsOo3mJ3YJJnd0zxXJv6nZW8XHPa-slY1kraIQqiJBSOtzSLgOpsp338o= + id: rs_0f1f74345fe40507006a8fda3e1cf887d087bfe743d4ad9445 + summary: [] + type: reasoning + - call_id: call_YWuZGAEp7gU2o2QIOv2X2iOs + id: ctc_0f1f74345fe40507006a8fda3fc04487d0b6703adfd0053c19 + input: fahrenheit + name: set_temperature_unit + status: completed + type: custom_tool_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 4630 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 4587 + output_tokens: 121 + output_tokens_details: + reasoning_tokens: 105 + total_tokens: 4751 + user: null + headers: + content-type: application/json + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_YWuZGAEp7gU2o2QIOv2X2iOs + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: Now report Tokyo's current temperature using the unit I just told + you to prefer. + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0f1f74345fe40507006a8fda3d451887d0b8956953c8ade687 + store: true + stream: false + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + body: + background: false + billing: + payer: developer + completed_at: 1787812418 + created_at: 1787812417 + error: null + frequency_penalty: 0.0 + id: resp_0f1f74345fe40507006a8fda41347087d0affa1defbcd4cfd7 + incomplete_details: null + instructions: null + max_output_tokens: 2048 + max_tool_calls: null + metadata: {} + model: gpt-5.6-sol + moderation: null + object: response + output: + - content: [] + encrypted_content: gAAAAABqj9pC49T78Mi6IlQjjH8lHeRjpFaniA_dijFmJ-TLBCCa4GLI5-xjD8OG1agp_dGGH98O8Dro9Ln8pds7Ss2qHNLlOwb7Erpuw23QE7xjCOmhxSKdKtJLnw-50_61VJ_syXp38PnJyJ8lr6eE8coilD_CRb85ymFDBMQhNTo8xtaUgDvj7Gx-64YU9Zll0PVctIlOqGYaFqx28K9K1l-9YVXmo354RTMlaAoaN5MDkF9x-gutS0sTK8lV4Nqyh6YzCXsTnigN71emUacMKoTfIP0VfMdgcQYfg5IMw3HFrXk4-9IwIphTIJPJvNp6XaZHbkWlrWhPiKPLMBtOJ1wbiQRbEJkJ6v1KoV8HJlzP0qYfRjNlaS-K6kERWcsowwZG_iGMKYeGUNYqdbrk1U_LvTS4cyUT4VDjSjqJq4WVRGgjiI1g_KMRU75dHao7Y-yh8v9DRftsX4nej8MQqUKuGoX2rL78NZD3XyNwJvEtvwFLUEoagdbMkPyK79W3OBehOVNVsIzkFBTvvirG3Wwz_uaSp9VzU38CH8OHFuu8YM5wEuBBVhJFhUT0YyG7itq4fA9UfFsnV2AhO2LZTW1wkcn1Rb3egwRRGj0AE5RBE1OZKyZ9H1tghA0wJHdoxj6RX4fxa2AxRjEyS5iQaCiOIXnXJ2jmRtkx-l_wN5SXJjnUyjAJKOZV6kSkMDAAKlLBoZ7OCRCxKxN-U5MpYMtPq5KkLAUokF8iv8Ki1_VNjd5SXq7BWjDYcUZDmfXW3DvIU9_5uUMYgMZ133NAfdvPj2KwKJdzmjSzQZnMNzyGDSWZzaaS2O5BIjSEZ7SySHsFoBd1uNkRncNiu-U4xQaSS7nJKj9kA7DTbXhUFSVngFk0YmuIKA0YllzbK14vyUotEf4bNJU0CXwSyF2xIbxxYQwIchXFzz_W6Z6zwKCP-7AACCuulWEyBbiWqOluhVcq0UFelUeR7WLVKau1Xu-wgEOUHtjyZmWSiFl9i-94Fw7j87luRDdW1IQspRrRpV68e-FyPx7Tf3smiCETawKdXVtjAzrAmPOLINJ7d_z2WNX1koAlHmN3wvReFX73HV7dY-KdZNjt2AlvTEMTvrT3PoMRvXSFqJEzUCscrG-apdK31WOXuAFP2E7Ix2zUAIzApOIMwCg7_WSt8if7muezFUumqT4UoSDeYOSkvD0Q0GBlMLp3tnYjKGzCsO8xXpeySljcZG9dD5ZjbNMm4n3KVD7lAjJexfWRQrPegLvmL3vtPk5zflKAB3lekiCfIefaSLuw + id: rs_0f1f74345fe40507006a8fda4253fc87d094ae91d58de66fe8 + summary: [] + type: reasoning + - arguments: '{"city":"Tokyo"}' + call_id: call_Fgg2Mr93T0kRHW2ZIlSg1l34 + id: fc_0f1f74345fe40507006a8fda429e8887d0854d97a6d8e882b2 + name: get_weather + status: completed + type: function_call + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: resp_0f1f74345fe40507006a8fda3d451887d0b8956953c8ade687 + prompt_cache_key: null + prompt_cache_retention: 24h + reasoning: + context: all_turns + effort: medium + mode: standard + summary: null + safety_identifier: null + service_tier: default + status: completed + store: true + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: + - description: Get the current weather for a given city. + name: get_weather + output_schema: null + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - search_content_types: + - text + search_context_size: medium + type: web_search_preview + user_location: + city: null + country: US + region: null + timezone: null + type: approximate + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + format: + type: text + name: set_temperature_unit + type: custom + top_logprobs: 0 + top_p: 0.98 + truncation: disabled + usage: + input_tokens: 4796 + input_tokens_details: + cache_write_tokens: 166 + cached_tokens: 4587 + output_tokens: 40 + output_tokens_details: + reasoning_tokens: 20 + total_tokens: 4836 + user: null + headers: + content-type: application/json + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-streaming.yaml b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-streaming.yaml new file mode 100644 index 00000000..6cb291be --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/parallel-mixed-openai-reference-gpt-5.6-streaming.yaml @@ -0,0 +1,345 @@ +turns: +- filename: t1 + request: + body: + input: 'Do all three of these right now, in parallel, in this single turn -- + do not wait for one before starting another: (1) call get_weather for "Tokyo", + (2) call set_temperature_unit to set my preferred unit to "fahrenheit" for + the rest of this conversation, and (3) search the web for the exact query + "Tokyo weather today".' + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000","object":"response","created_at":1787812347,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000","object":"response","created_at":1787812347,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0ab8f408745e612d006a8fd9fb891c87d0944ab30b02cc4c2e","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n7-6edxsm1PM457GAgGIvFuAAbc6-XDZ0n-3hw7dCBCgMc1XBbmGNkUBSjgOvBufvSiGqsBsOr83B3Pa1i1JkFShSUGC5aGSoPgzIwQZhttzMHCm5Am9tIzJsdoneDmZUZ9IHTYBYCC7Ni_Aa7ufIOw0Bj11eaDH4ZYluc561ovNEiZJLYGsdi99K2snVIQUC7lUqk2JdlJNwFAjnb7pVUnsSYEm1o40oHpkMq_OHS6nBnNUlveUP2dLre8wRf_2Y2wiCfhKvX2LBHAuW116Qz2AIwBt0vk9s6PWUcVGOY5TV66hWTssG0HLzHqi1uNU5zSG4AtdToVzVvrjpS17ATDbEdHCNlOPpKkosvT4DoIHlqnYHU8iAUtxQOsHame-xMkeZIKX66b6ruyH21Ht_CBs_enEESiCUrimREZ1oWZUL-dmsVFDz70jKC-RHbnos-Dic44zDxJYsem9z0_usBRaVmrPNVY4FPyV0hQiVCSNiqTllXcg4_s0Al-L4Wfsy1KCtGz8HzzhQ40KNoXVkkd4n7IPNf-Ink2zDT8NYSwMnXd3Fs20JMGQoMoDsEFJwlBkdApWcdvPmGv7PyJSnw3rLkoK4e7PTpxsGFvI5ulnuNQX8yHk5dLsnWGFTwsc6kcC507ex-nx0Rd_5Dx9ufbd7OhmaheaVo9t_denf7IK4FUJVRVho-fzQSibkKkAMuY8w2IM4Uoxu1VvxhfzBOhaUIvcdIjNmQMSmDldXZG-Tcjx9ZT8JhvzjGQGyhdq4JZCQ8S1RoFguENc7GUqhrBYTdhCqBGgu7-G003imJzfCqYZWq4-NZUlmIH_xhVqL5w_5cLz_5xsmB7Y5zUYF0e0i7jHU-kadVRnfyoapDEm0HAJ4-WRGv1hSu5tFoky9IdVIs0l5S6m_f08Pz1u2NTFNcfVuekIBrdOOodjfLOp8Xs3Wvd3UlI5Hug_qFFRg3AFOP8iQvMtt5Ykury0S7LA9N9sEEoI_iDTS010An5UFaIbm5Hvpm0WhHHd6yqHK0dnvb-F6qwMq8EH_Kf-zR4aZD0dCdbhwPUDvNzW-i_qPWMf8ZlD9P3kqcgeEmQr1X7hQs0uvHolIrEZ9WhHOcyAYKFsV3pAH5kwzGyu7wOuOM50MhYSlT5OIpRc9kWo8u3aMPatI6Rgw7PzF6IdviLg==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0ab8f408745e612d006a8fd9fb891c87d0944ab30b02cc4c2e","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n9Fn4MObHIsPybAQKVF_nUkEKYNnVA1RGnHJ3t-hAW5KtLkYA8fwr1SrYfPP-XHKtdTyeOmHiGAMsqrNpsBRgMjOQeI-zdUK4epUBeQE0ujFLl7rGrabggipm21TjOI8nSp8fxvx-TX5AQywT8-2OMyNyZ9zAf4YkHRteiABYxgDTY3iPMsiWcXmO0yUaVveiUvaOg2qhA6NEvD1r7OQY_cU2qIF0-6rjnqkBWAjrmIG5EPTYZ8dluF_ujnbq6if9IfhkD4C8BVSP2oX3ybXfMVoaaXL5kcz065176ITS0RCiKxAgEiR8kZRM9OrwPuY-oU0Halc5h5KxkRyLv8JQ3w1dSrJSa5x1PtrXvLTELLEFf1brEezgWLTgUr3QWpODKDyKvrs4w5__0tTLEnNv-uGxyrAvnmFPNET4gbCvt-rXCg9-08PgohDdhYlaxdlS6cCSwiE6L_Vtf27AgJmPy4wEAO-9sOGbDk2JK9bu1gX2vNjBNYgIXgnBKUw8UnVVVEqmGei7uz5FTTgZqe51y93IQvckybk4B6CAuz7PvzIPn_Uk6CFUGDyKxzK3Ja1jddKcOxlJ_ET28WJKqi1Lkx-dW3MfhqgD92voH0UDVrMQVTrKA7U8XzPoXrBLz-CfV4a8qRvyBMPLHDZOB7Q6zsa4GFoouKWWHhssyuKF6w9SYmzfkmdrtdZqPqn5BXWY5RpOJ8ALyrkEk7pOfkFN67wCm7hV8U2tblIbmdlOHpWoc7d9zcek9-kp89rkA3pcnWklqqhFzvobGBWCSGnjcsWOv2z-XMGUPEu334zwu8zBEEzOF8VrB-h4ANVfo82xmzcOKgK4FXHkrneEWorJo96T60n1MYEYaBrViWSOjyL3f6LrIMKdJ_d3VVuz6yP199qsdwGREBpzsj81H6ErMRB6p027SjN36NdJCGanSt09jknr4hEKjQ9Qa54js2Vllc8JjPiET1611NXa39IJO6VhkUlYeJoZt1VLvGURT9TLmR5deRrjFvQ1aBpG8YvpiXmZF-AW9O7nDWE-msB2xqSFp76Or9UFITUUz7lKjuZnHbKA8vUGM6pG7Dm9ILfAHIw9HLSWUd4JEMXUb8C-mj9-1bc8hFaJDcj8DixKsAuT4q7_F6BUxwlmNTbFuI2zxyqeHtOlOIU5w-0bdM5x9PDtEgR8SKQxdv39ha2oyKFzIRc-ULqQtEIC2RMl7LahgoFaEM9qk0Va3lKIeTVPf4TncKzWbZ6ha3Z0Oh1oEo4OIZfs-_QbLhqT-5OoI_HDxWD6CqZMXiIJ5luXEtBxDJcIMLdhlDkc1JxixIxPqBxxzsP0cwhxIonIOsgSCAU9Pqzoch4Ip-4tsQpXYBL5Ia59EctS7x6oUCI0gg2SsAsWKVeDxrdYjy05bxM-4LWNZc7s85I_AGIE1NgzOliwNLcLqFRr6o8S3XH3CUqf0UfgogniwOFalgUmkLn2Pv7Ang4PQoVZ-gQg4dFP8pF0vW8GRzZMKJDsptHZyE7zTrSYAxGyiGFVI2o9626gc4vW8aGDGHnWH4jCCmQ-Eaa4i4b79qYYUcBo7SwQ1zoMXamTkKbAa9b-qwU7iSGZzPQ_KghAtjBqIk6lSvU0H6WyCghQlselVOMNqxgRFArwVzqCHDx5GQDty8t_3E9FjDNU0aLRx11r2BqKLv-4zSDZP4LyhsMKvxQ5tWfwcmbc7FU72ChDQhsBk20b8EXU5hSvyIlkGy35H3Bp5ThhJDGiPBetxRbfSC4OA8wn9lfV2vgTIWZnwAPVXdKA9VZMMTt2nk-AqtklELWZzuWtpPD87a7TvHFOJFTRhycCAoJB-FyliNcFaSTPxrg2ntSffO4BRo5c7li1bnepk-cNv0NaVHw==","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","type":"custom_tool_call","status":"in_progress","call_id":"call_94UWTasyNHYhCm4wmJqsDH0G","input":"","name":"set_temperature_unit"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","delta":"fahren","item_id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","obfuscation":"jLzx5ngZVy","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","delta":"heit","item_id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","obfuscation":"UYgYZ3md5jC6","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.delta + + ' + - 'data: {"type":"response.custom_tool_call_input.delta","delta":"\n","item_id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","obfuscation":"jhaIyW5pCPhbgej","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.custom_tool_call_input.done + + ' + - 'data: {"type":"response.custom_tool_call_input.done","input":"fahrenheit\n","item_id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","type":"custom_tool_call","status":"completed","call_id":"call_94UWTasyNHYhCm4wmJqsDH0G","input":"fahrenheit\n","name":"set_temperature_unit"},"output_index":1,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000","object":"response","created_at":1787812347,"status":"completed","background":false,"completed_at":1787812349,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0ab8f408745e612d006a8fd9fb891c87d0944ab30b02cc4c2e","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n9R2Dz4kavjkD521jrfFyCxHJJL_LRkQ_6EuOVNI1Zq6gM5yb-YE6SHT1AEpDAj8axA6BM3TnUroJogpAkANRhkmMMd9ufh8Jqn17cpHFVscug90fuNN8w5DSyxWyAd4EzfRpBC8nN1OBWhCOInx_zQwSd8EYl4-Qs3k-0OgAbgY3Y2TrINv2ss2MgEcC7noj3MaV6LlzlhTXTC1DXfV6TSeoNqsoGQJ169X0MP4ZRdok8pnE3hgPRVrx93Z8CwEu9gm9AjWrjZB2OKEVtnbsOpkxBsJaQpTlN2vv5zXZ-PrYF51OExD76tK4vJ-qt07FqOGQxEmrAX2twrn_7QeOW2DFimWkA6EPV8LEWGVNKGe_wYWzsm6aBo8d81VYiQewiwhnW9n1BpPB7re1gIJaPvld9Sh1r_6-t-3zwMC20emHE-Gzp5MWgE1qu8UhwHRHrm94PJEr2XHHJgEDSXayDJLuGV8w2q4Dx21-N4X43sXcDTmQ7-fGehoVcGkMVRYy_tZBtHZ4yh6DGKAT7HLzESL29XCkWGY6CHt1Rc20OM7jCoRKsSBEv5MEA-RTy4Mflh2VsjDcP3_kNrtLM6vj5SVfUVftvkTuEm1bM90dfevLf06eMmvNK7myEfUNV_BSfocEz_EMoAR94Cwf0l-NvcSMvAmEuZyIOheyAfBGGeCiEQZneWp6qzSX7hr1nhHz7G7I_TjsBdC8KgxRP7Mh15hTEICp59s5cKXnWDA98_Klkr6XLpi62KjCIXxfB0P1KTO1J-c0Q8LiiMt0h-RFOTdoFhWn1KOndKh_7l7GZdGq8HSBsaSERboYk4zGx8OcdCRY9klU5vcl0ebVGMwqtaO4xQa7W0Q8sFLcTaJOz2Y0NsZBB-r2a0kLyfIe5sGfMqy7VWDMEkxn24HMZp4RTGNPia-ybOrrXpSxMi8ym_QHE2oSSPtJRgaIhalEXQI56AG2a1PRqru5XNU0i5Hh5mYKe2Sqy16rtpDAs8O12ZMm3FvE8niI5ygteSvlb_sn4ACcvJblXG0yW6Urc35_1B_JMNeXXe_SNcAO2q7wM1V8DLE1FKVcDdRIvaYMEsYWTl-JFacoiRAiJhIrhkITBNKI2VHc2mOX-EkTC-J1WAgJcURPaT2705xL2nwQDArMeTISC0xXlEKkQsmMbdiooCKxBE5bFzSvx7oTLzFqVrsB3PIIMnUnV6mmEGqt867jOA15of8jF5xsZzA96Ce8FBxAwr6cVeKZ24PwIEkZdsK8ZygPmxUVoEx92ZjLuJ6y6pglg7NlEilwovfmh_v8A2S7GEEKckuNEVBL1jwnrMsf-SVj8cFUvWdutQ9TMDc0pgWgzXf4fK33LMG-kcPIHOg4OQflOU_PQYeLM7vb2IdUPdPtsKeh2E1h86W45nq6mDd3FehE-Zubg4oW5pVbO_k6k4NPHWplj-2Rg7lS2_63ZpVsYLkZwc3Vgdwq5oPu4Olp4vtMeoLijUpjOMHe34NIF0edF3XHsrl2GhmJtOX0uJf4ilLK_Jl1UGOhwi_XhiRofDaWMrEq4eXAR15HoO6hasi_VzfZ-DvEKo_2-f1TLrlSWhnliKxi10c1_J3r9utNum9oW7uFhUgxJHpF1vFWO01xWXfZI94sMrsqFACsnbbbVU55hd-mfZs53bq1I_70I0ScG_zrgc1VbFOWerObWOoGljK211DT-qgkEmC8bgdesUQoeFoRoK1Olp5drn2pv08P2pJlX0ShH96cNtHE4PXTKhFoCZn2-e9yuXi266Fs4vJalS-ZtyYg-DSM7PZMlYnGmmT211s6TqgJQ5HRRH0w2uovVwJlccqHYXh0tlt-zMyOAF7pV-s6PG5XbDtavpIPkiQ3tbaLZM8sLpg==","summary":[]},{"id":"ctc_0ab8f408745e612d006a8fd9fd005c87d08cb6de5a5f0ae9c7","type":"custom_tool_call","status":"completed","call_id":"call_94UWTasyNHYhCm4wmJqsDH0G","input":"fahrenheit\n","name":"set_temperature_unit"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":4630,"input_tokens_details":{"cache_write_tokens":4587,"cached_tokens":0},"output_tokens":115,"output_tokens_details":{"reasoning_tokens":98},"total_tokens":4745},"user":null,"metadata":{}},"sequence_number":10} + + ' + - ' + + ' + status_code: 200 +- filename: t2 + request: + body: + input: + - call_id: call_94UWTasyNHYhCm4wmJqsDH0G + output: '{"status": "ok", "unit": "fahrenheit"}' + type: custom_tool_call_output + - content: Now report Tokyo's current temperature using the unit I just told + you to prefer. + role: user + type: message + max_output_tokens: 2048 + model: gpt-5.6 + parallel_tool_calls: true + previous_response_id: resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000 + store: true + stream: true + tool_choice: auto + tools: + - type: web_search_preview + - description: Get the current weather for a given city. + name: get_weather + parameters: + additionalProperties: false + properties: + city: + description: City name, e.g. Tokyo + type: string + required: + - city + type: object + strict: true + type: function + - description: Set the user's preferred temperature unit. This changes how temperatures + should be reported for the rest of this conversation. Call with the raw + unit as plain text input, e.g. fahrenheit -- not JSON. + name: set_temperature_unit + type: custom + headers: + accept: '*/*' + authorization: Bearer *** + content-type: application/json + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} + response: + headers: + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0ab8f408745e612d006a8fd9fda03487d0854930e3c92e5497","object":"response","created_at":1787812349,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0ab8f408745e612d006a8fd9fda03487d0854930e3c92e5497","object":"response","created_at":1787812349,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"rs_0ab8f408745e612d006a8fd9ff9c6c87d09fdf156428c3bbeb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n_FHAdwOE4f7y76cwhcLph08SV2ZMIOl5zIVaqUeSAa9p3Rz1Lnf9mAyKwhpKsYzTIwHi-jwzxcFkwhFK_zg79N_1Z8uXxjtFlZ_o3KTOgyyX59oUtfnX8Kn08qd7e-rfhJxfCLqtwYf6VS1N1tThZhWcL6JdHvIJXu1gJEZHdq8fsyRVvouHnC6YZidOJ-vIdDW5fuGLfPPm2T2HOwS7TH8jsPGa8PvbL-e7qtCdTehjfnpHS2kitDGOqmhAzyq2aO4QjZ-yAiKKSTF_Io75uq-aKkiWsFCWat6KCMdHmM1cf5rSYKHMINAafsa_AmRjMziAzoX0fbutMFo2vos2Nv1jGjRCuikxAyfhmWAuvB20HuV85hbBQU1zBBZNQeJYEo9xA-0eZ9-JY_mm8AC2_b5EywkOKBjTNOiJsc9Jyj7SrYAVmsRP1SySgRz1_hJlMj3Bch2B1SuPHYH_FunxXa1d4JQABpHeNyTh5VCsOOn5fyOgtgMi-7mzyfMPeIrir1LBR34ur7f35gAcGGCoYktiLSbF0TaN1mZjb6YpIBWd1swJwW7D5oRujbWZE-16SUG-hEr4Es99gqRwjfXmJCfnmsCnCyUu3VbNSA3fOLRmyy0VQYrH7Ysre2cScQ4zzc5VFlaYNC2cswsBfPZ2uFa3Cv9tbMZsmnYbpyqVMOHAXWRFOsTkzygvE5NMt07ywkUgHJlF-CQ293AooM3zzH51PYlP5Obum1v0JYvKWtVAap8Aozgr1HXDE7phYxKn_Sxx-xEkdnGA_Jk2R4UFBbvOhyif4on1Yfj2HQayimuxvE9PBkbW1QLE6iDyVi2rgEtInmNN4IrL6Hzqf1WVBkTvUss4YKn_nvQoKri_eDPCLWGqSZpNy746KjGnuwAwMGa658fagks6_FR9O7lyjL7HK5PNnZPjLV1gkjj5mcpchjTahYABF24xdA7D8a9gRGOGBD9e5AdSYla90qOxwJKAJ9QJQJYehkEp9DKpEdi8fKfqptPbLIoNPOtyoQxdD1r6qEmVEJii6HgYHcS52ouNUN_h0lqWjO6AzKoT0dyj717tgkdkTyUN2dU6kNWj0mUcmEDCzGv5-LpPgGzOKvoH3PuZGZylYqOBF9B6yMmISolMp1yqk4l9fOz_Rg2r36LjWtT4pJoXnchUQXy7LVg==","summary":[]},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"rs_0ab8f408745e612d006a8fd9ff9c6c87d09fdf156428c3bbeb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9n_X5gk5UO9topTbM2ZiOdYXoN-rvlNr2zN7KVGRroxTjb4VlD-SPyaxmcUbNO22uZwsQY1tnubs4HHwcftWTTOmHEYRgE5DWKwNAnqBOrnoxkMIboVUwYPfH_Rmnrc6gHVJPEGgcFFGvUUj-hoycjMdhdHYG9Iaj7I-f71rdJAJAf4gOcBJkcJZvIzOobLBcaUrSWSHaD6bdBxv6flG7hl0xFWVAaB2eSzG39qPDTBG1Y3LBESld80L4InJtU6pSz1J8RKH0_OAMq76hk4ee3A03luUdgXWSL8eUGO4XIOOYJKRPyxvnnG-XxTg4bFSpW8G9_JMG-9M-GnLkqsedQWuwNyfjXCBys3BJe-Qb7wCh8PgCrePTX4v7SKDswVPpCaQwfm6HJvo4FQkcB4t6D-0J1ey8ZOYDwIm2XxcmCI9Gez6ue-36s3-VIq8MtUBdGEPK1ScNILwMTOVpRtiQ2RZMwh0T8d5SOM1jg5ChMj5902tCiXVJX3hwvzFqEQpDLqR84PJ0s0DCKQmMJnYgTVzsn3f-53PgwpUGj9nfIAODAqUMTjWQ_OBNfjw6pyFaD_jbkuKvl2SBTUmolTXax4RAIl_OqGeHDrYfDcTChtwag9MTxYUmX-lqmvZJ7YVe6HCNAxO4Hyf4iWSo7VrSyb4IzAtkAVZ__ROOPoKCUYmHZikRjEvVtpJONGkMRl6UBsdwAJUDMCs-CeeKrIoAlagU4_s-1LQuOx4-rVYV2XiAD2VH_zalkewkWQwlpeH-zpAJpjYXy7xP_p_DtO1RGaanb5phfM2uUEx46Wnaxws-Tu_uXiCH9ly6MML-cOaoIFPZxRzp7dtCksmaTt-_VPgBZLRLYlaZEMRy0zLjPxriktRKEMluooWPPu15BO2HtrrUTq8NkBl3FDLc6FOTfLnLSoh21wWzrEbId3Uf56zr6OJgESupbId-8dBbJwa6CakMNgziAPVDm0qib060PRmXbJ1TsmInTr5MABEFgKwO2AYrkElbzeFItJM-IjIwpHFjZLzx-5garcFUggKw8FSzmD1zd7gsISgftqZ9BnKaatRSPYKwPLftFd9jaY8-qWH2aGM3PznpbOfyyCvgJnzJaEuqE3hV2bGr2Mk38IVWJBUb9ibkuYA5uUkPBb5uBux69yVuoYonh7xWUvO-OlJFtFWMAybyzqHiyr4jiXt6JUanmG2zs-vDARQVFAnzpT9W1Tf5Xumi0jat_Cu6eMsXA9hSnbklIvZGVMxyVulo0=","summary":[]},"output_index":0,"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","type":"function_call","status":"in_progress","arguments":"","call_id":"call_siGKLNszmRQBvQ5pvqiY5t0I","name":"get_weather"},"output_index":1,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","obfuscation":"SZYBwtClQJ1WjZ","output_index":1,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"city","item_id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","obfuscation":"Wtbqj2TnjmY4","output_index":1,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","obfuscation":"J1h0yLKdJTf7U","output_index":1,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"Tokyo","item_id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","obfuscation":"KXf73ORTJg5","output_index":1,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.function_call_arguments.delta + + ' + - 'data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","obfuscation":"K2q4lPz3rTq56K","output_index":1,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.function_call_arguments.done + + ' + - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"city\":\"Tokyo\"}","item_id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","output_index":1,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_siGKLNszmRQBvQ5pvqiY5t0I","name":"get_weather"},"output_index":1,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0ab8f408745e612d006a8fd9fda03487d0854930e3c92e5497","object":"response","created_at":1787812349,"status":"completed","background":false,"completed_at":1787812352,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":2048,"max_tool_calls":null,"model":"gpt-5.6-sol","moderation":null,"output":[{"id":"rs_0ab8f408745e612d006a8fd9ff9c6c87d09fdf156428c3bbeb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqj9oAw8AR7g0xlNGzXv__j0MmPAy6C4u1YVyKeEP4SU2CQDO42Qtlo5Ybs4QKAps4l83ZFd1MtFJoYXmaQ46GYRGG990PG90zPXNDLWWqBl0UqIbd6HLTTiXjaw-Sd4Zz-ooajfQaOrkQdo-AMuD2syVuUfb0w7utQ95Kr2iuHGGSqGLcBQIOltX19zzkZLF-8fO0yA3qBVHfWFMF7yhezpTXo-mmIL82ohsHenX5kUc0hQ099b540FCVtV2OzihtK5ANQxM6Zs-6MDM_tr9Wu65j4JShLKsM1EXvseB9CqmuUI7YuBX9kQQteCXwTzt44PlbAnYn_CB2cC7eBC_qJgeZ6hToaLOVjpziEsVzy5YLnMUGxqkccTHr-FInIq4eTX2LFIbno-KKFxCWqu0bBYYlSSYdCVWsJvXRlajT-emJkCKpz_la48Jhl3PDOelrJbn4I6cmPYn3TFsxmzI1Z_1XcMyQCDq64954aMbeMa2a-7D2gcb38WbZeRlhrCdeYCaN1-NblJq0fBYjmWdYgs5oDPKar6OQz4rTkOGmWEvUJA7D1ShXVjcxBnJGm6WobPBx4rHP2bNIWCEElcQVrRDZUpGJy5eJ--4cj8t3N65y4rfl7HwvHe9X8s0PVlQMFyqbgFbPu1Iepdc7VHhSe6xSYp3l3XFj4axEpx8t3bKrKXUCThGGUsqpgBZK4yr4h8wfIIDKVqADUmM8PPbVRux5-1CATmbJLLUklYb5oY8iexCJOq38yP8VhfIRemr7nfzhAgoIq5UUbASTK-CHg_N8gAj6D3teyPG5FM_x1V_MggbVhV-92Zeb28_oxKF5XgakrVjTKIiY0Q-Z3jKrQdqXHozIwzVmoswCUzP74P2qWBzeTOafQXYKIT4FxI6L6aVx4gbBnJ5Ce2tpFtHmtXdUtxKx1yelT2WtYHvJnz8HF1DOchyg1jqvZ-AJjRuVV1FcUxrm0Ekl-nBmzq-szdeHy-THX6R004KkL7M2ALi_2Ij3H3XRMSHACqGKMPqMWn8-cpvFIgJ71SX84rv5sn2IZoCuLDAgeciDEIHJ70nQOGJoGh_tIz8AXTo_7f5AFvJoPxFLIHrsbJrMv16DxsNat2LhIwDQzP7XOhvlX4sgWxHtpBoDOUJ1AZjC0bd_uXUA1q6pAr_jFJqgyepZm0Mm2cWWFVqa5cAugq6RVnrNy2KB39CUJW8Y0p3hnaiE0ppLaiwhX4p1ukaWxSUqI9dbEjLurkVlS0VmmkMpWJ3Nylk=","summary":[]},{"id":"fc_0ab8f408745e612d006a8fd9ffdba487d0872fc0216a4af722","type":"function_call","status":"completed","arguments":"{\"city\":\"Tokyo\"}","call_id":"call_siGKLNszmRQBvQ5pvqiY5t0I","name":"get_weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":"resp_0ab8f408745e612d006a8fd9faf14887d0b11fd2fc878de000","prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Get + the current weather for a given city.","name":"get_weather","output_schema":null,"parameters":{"type":"object","properties":{"city":{"type":"string","description":"City + name, e.g. Tokyo"}},"required":["city"],"additionalProperties":false},"strict":true},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}},{"type":"custom","description":"Set + the user''s preferred temperature unit. This changes how temperatures should + be reported for the rest of this conversation. Call with the raw unit as plain + text input, e.g. fahrenheit -- not JSON.","format":{"type":"text"},"name":"set_temperature_unit"}],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":4790,"input_tokens_details":{"cache_write_tokens":160,"cached_tokens":4587},"output_tokens":35,"output_tokens_details":{"reasoning_tokens":15},"total_tokens":4825},"user":null,"metadata":{}},"sequence_number":12} + + ' + - ' + + ' + status_code: 200 diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tool_outputs.py b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tool_outputs.py new file mode 100644 index 00000000..c3a206bf --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tool_outputs.py @@ -0,0 +1,38 @@ +"""Fake client-tool implementations for parallel-tool-call cassette recording. + +Loaded by record_cassette.py's --tool-outputs when given a *.py file. Each +function name here must match a tool name declared in one of this directory's +tools-*.json files (the request-side declarations, which stay JSON and +unchanged). For every pending call in a turn, the recorder parses the model's +actual `arguments` JSON string into keyword arguments and calls the matching +function; the JSON-serialized return value becomes that call's +function_call_output. Returning None omits the call's output entirely, +letting a cassette test a provider's behavior when the client leaves a +specific pending call unresolved. + +Sentinel argument values below are used consistently across every cassette +scenario, so the same functions serve success, explicit-failure, and +omission cases without colliding: real city/ticker values always succeed; +"London" / "FAIL" always produce an explicit error output; "Atlantis" / +"OMIT" are always omitted entirely. +""" + + +def get_weather(city: str): + if city == "London": + return {"error": "weather service unavailable: upstream timeout"} + if city == "Atlantis": + return None + return {"city": city, "temperature_c": 22, "condition": "Clear"} + + +def get_stock_price(ticker: str): + if ticker == "FAIL": + return {"error": "stock service unavailable: rate limited"} + if ticker == "OMIT": + return None + return {"ticker": ticker, "price": 231.45, "currency": "USD"} + + +def set_temperature_unit(unit: str = "fahrenheit"): + return {"status": "ok", "unit": unit} diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-builtin-only.json b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-builtin-only.json new file mode 100644 index 00000000..62316c64 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-builtin-only.json @@ -0,0 +1,12 @@ +[ + { + "type": "web_search_preview" + }, + { + "type": "mcp", + "server_label": "gitmcp_tiktoken", + "server_url": "https://gitmcp.io/openai/tiktoken", + "allowed_tools": ["search_tiktoken_documentation"], + "require_approval": "never" + } +] diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-client-only.json b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-client-only.json new file mode 100644 index 00000000..d15fcb33 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-client-only.json @@ -0,0 +1,41 @@ +[ + { + "type": "function", + "name": "get_weather", + "description": "Get the current weather for a given city.", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "City name, e.g. Paris" + } + }, + "required": ["city"], + "additionalProperties": false + }, + "strict": true + }, + { + "type": "function", + "name": "get_stock_price", + "description": "Get the current stock price for a given ticker symbol.", + "parameters": { + "type": "object", + "properties": { + "ticker": { + "type": "string", + "description": "Stock ticker symbol, e.g. AAPL" + } + }, + "required": ["ticker"], + "additionalProperties": false + }, + "strict": true + }, + { + "type": "custom", + "name": "set_temperature_unit", + "description": "Set the user's preferred temperature unit. This changes how temperatures should be reported for the rest of this conversation. Call with the raw unit as plain text input, e.g. fahrenheit -- not JSON." + } +] diff --git a/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-mixed.json b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-mixed.json new file mode 100644 index 00000000..4c426fe2 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/parallel_tool_calls/tools-mixed.json @@ -0,0 +1,27 @@ +[ + { + "type": "web_search_preview" + }, + { + "type": "function", + "name": "get_weather", + "description": "Get the current weather for a given city.", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "City name, e.g. Tokyo" + } + }, + "required": ["city"], + "additionalProperties": false + }, + "strict": true + }, + { + "type": "custom", + "name": "set_temperature_unit", + "description": "Set the user's preferred temperature unit. This changes how temperatures should be reported for the rest of this conversation. Call with the raw unit as plain text input, e.g. fahrenheit -- not JSON." + } +] diff --git a/crates/agentic-server-core/tests/cassettes/record_cassette.py b/crates/agentic-server-core/tests/cassettes/record_cassette.py index ff00d80c..51076d9c 100644 --- a/crates/agentic-server-core/tests/cassettes/record_cassette.py +++ b/crates/agentic-server-core/tests/cassettes/record_cassette.py @@ -34,6 +34,7 @@ import base64 import hashlib +import importlib.util import json import logging import os @@ -44,6 +45,7 @@ import sys import threading import time +import types from contextlib import asynccontextmanager from pathlib import Path from typing import Any, AsyncGenerator @@ -252,9 +254,10 @@ async def _stream() -> AsyncGenerator[str, None]: # ── proxy lifecycle ─────────────────────────────────────────────────────────── -def _start_proxy(output_file: Path, target_host: str, port: int) -> uvicorn.Server: +def _start_proxy(output_file: Path, target_host: str, port: int, append: bool = False) -> uvicorn.Server: output_file.parent.mkdir(parents=True, exist_ok=True) - output_file.write_text("", encoding="utf-8") + if not append or not output_file.exists(): + output_file.write_text("", encoding="utf-8") proxy_app.state.output_file = output_file proxy_app.state.target_host = target_host @@ -302,6 +305,14 @@ def _send_streaming(client: httpx.Client, body: dict, proxy_url: str) -> dict | with client.stream( "POST", f"{proxy_url}/v1/responses", json=body, timeout=300 ) as resp: + if resp.status_code != 200: + # Drain the body fully before raising: the recording proxy is an + # async generator that only finishes writing this turn once its + # response is fully consumed. Raising immediately (before reading) + # aborts the connection and can tear the proxy's generator down + # before it appends the turn, silently losing this turn's error + # response from the cassette entirely. + resp.read() resp.raise_for_status() for line in resp.iter_lines(): if not line: @@ -646,11 +657,15 @@ def _load_response_input(path: str | None) -> str | list | None: return value -def _inject_tools(body: dict, tools: list | None, tool_choice: Any) -> None: +def _inject_tools( + body: dict, tools: list | None, tool_choice: Any, parallel_tool_calls: bool | None = None +) -> None: if tools is not None: body["tools"] = tools if tool_choice is not None: body["tool_choice"] = tool_choice + if parallel_tool_calls is not None: + body["parallel_tool_calls"] = parallel_tool_calls def _extract_tool_calls(response_data: dict | None) -> list[dict]: @@ -667,14 +682,26 @@ def _extract_tool_calls(response_data: dict | None) -> list[dict]: def _build_tool_output_input( tool_calls: list[dict], - tool_outputs: dict[str, str], + tool_outputs: "dict[str, str] | types.ModuleType", user_prompt: str | None, ) -> list[dict]: """Build tool output items followed by an optional user message. Args: tool_calls: function_call or custom_tool_call items from the previous response. - tool_outputs: mapping of tool name -> fake JSON output string. + tool_outputs: either + - a dict mapping tool name -> fake JSON output string (loaded from a + --tool-outputs *.json* file), matched by name only; or + - a Python module (loaded from a --tool-outputs *.py* file) whose + functions are named after each tool. Each pending call invokes the + matching function with its actual parsed `arguments` as keyword + arguments -- naturally handling whatever argument types the model + used (string, number, ...) -- and the JSON-serialized return value + becomes the output. A function returning `None` omits that call's + output item entirely, which is how a cassette deliberately tests a + provider's behavior when the client leaves one specific pending + call unresolved (e.g. one of two parallel calls to the same tool + with different arguments) while resolving its sibling(s). user_prompt: the next user message (None for tool-output-only turns). Returns: @@ -684,9 +711,22 @@ def _build_tool_output_input( for call in tool_calls: call_id = call.get("call_id", "") name = call.get("name", "") - output = tool_outputs.get( - name, json.dumps({"result": f"mock output for {name}"}) - ) + if isinstance(tool_outputs, types.ModuleType): + fn = getattr(tool_outputs, name, None) + if fn is None: + continue + try: + kwargs = json.loads(call.get("arguments") or "{}") + except json.JSONDecodeError: + kwargs = {} + result = fn(**kwargs) + if result is None: + continue + output = result if isinstance(result, str) else json.dumps(result) + else: + if name not in tool_outputs: + continue + output = tool_outputs[name] input_items.append( { "type": ( @@ -929,6 +969,7 @@ def run_responses( tool_outputs: dict[str, str] | None = None, max_output_tokens: int | None = None, preset_input: str | list | None = None, + parallel_tool_calls: bool | None = None, ) -> None: response_ids: dict[int, str] = {} responses: dict[int, dict] = {} @@ -977,7 +1018,7 @@ def run_responses( body["max_output_tokens"] = max_output_tokens if previous_response_id and store: body["previous_response_id"] = previous_response_id - _inject_tools(body, tools, tool_choice) + _inject_tools(body, tools, tool_choice, parallel_tool_calls) response_data = _send( client, body, @@ -1026,7 +1067,7 @@ def run_responses( } if max_output_tokens is not None: body["max_output_tokens"] = max_output_tokens - _inject_tools(body, tools, tool_choice) + _inject_tools(body, tools, tool_choice, parallel_tool_calls) _send( client, body, @@ -1136,15 +1177,23 @@ def run_responses( default=None, help='tool_choice value: "auto", "none", "required", or JSON e.g. \'{"type":"function","name":"foo"}\'.', ) +@click.option( + "--parallel-tool-calls", + "parallel_tool_calls_raw", + type=click.Choice(["true", "false"]), + default=None, + help="parallel_tool_calls value to send on Responses requests (omit to use the API default).", +) @click.option( "--tool-outputs", "tool_outputs_file", metavar="FILE", default=None, type=click.Path(exists=True), - help="Path to a JSON file mapping tool names to fake output strings. " - "When provided, matching function_call_output or custom_tool_call_output items are injected " - "between turns (required for OpenAI Responses API).", + help="Path to a *.json file mapping tool names to fake output strings, or a *.py file defining " + "one function per tool name (called with the model's actual parsed arguments; returning None " + "omits that call's output). When provided, matching function_call_output or " + "custom_tool_call_output items are injected between turns (required for OpenAI Responses API).", ) @click.option( "--input-file", @@ -1158,6 +1207,14 @@ def run_responses( show_default=True, help="max_output_tokens for Responses requests. Use 0 to omit the field.", ) +@click.option( + "--append", + is_flag=True, + default=False, + help="Append turns to an existing --output file instead of truncating it first. Lets multiple " + "independent invocations (e.g. separate conversation branches that each end in a provider error) " + "accumulate into one cassette. HTTP --mode responses only.", +) def main( turns: int, output: str, @@ -1174,9 +1231,11 @@ def main( gateway_url: str | None, tools_file: str | None, tool_choice_raw: str | None, + parallel_tool_calls_raw: str | None, tool_outputs_file: str | None, input_file: str | None, max_output_tokens: int, + append: bool, ) -> None: """Interactive multi-turn cassette recorder (proxy embedded).""" if branch_turn_number and not branch_from: @@ -1224,13 +1283,26 @@ def main( else: tool_choice = stripped - tool_outputs: dict[str, str] | None = None + parallel_tool_calls: bool | None = None + if parallel_tool_calls_raw is not None: + parallel_tool_calls = parallel_tool_calls_raw == "true" + + tool_outputs: "dict[str, str] | types.ModuleType | None" = None if tool_outputs_file: - with open(tool_outputs_file, encoding="utf-8") as f: - tool_outputs = json.load(f) - if not isinstance(tool_outputs, dict): - raise click.UsageError("--tool-outputs file must contain a JSON object (name -> output string).") - click.echo(f"Tool outputs: {list(tool_outputs.keys())}") + if tool_outputs_file.endswith(".py"): + spec = importlib.util.spec_from_file_location("cassette_tool_outputs", tool_outputs_file) + if spec is None or spec.loader is None: + raise click.UsageError(f"--tool-outputs could not load Python module: {tool_outputs_file}") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + tool_outputs = module + click.echo(f"Tool outputs: python functions from {tool_outputs_file}") + else: + with open(tool_outputs_file, encoding="utf-8") as f: + tool_outputs = json.load(f) + if not isinstance(tool_outputs, dict): + raise click.UsageError("--tool-outputs JSON file must contain an object (name -> output string).") + click.echo(f"Tool outputs: {list(tool_outputs.keys())}") if gateway_url: target = gateway_url.rstrip("/") @@ -1286,10 +1358,11 @@ def main( tool_outputs, response_max_output_tokens, preset_input, + parallel_tool_calls, ) else: click.echo(f"Proxy: {proxy_url} (requests go through here for recording)") - server = _start_proxy(output_file, target, proxy_port) + server = _start_proxy(output_file, target, proxy_port, append=append) click.echo(f"Proxy ready on {proxy_url}\n") try: @@ -1318,6 +1391,7 @@ def main( tool_outputs, response_max_output_tokens, preset_input, + parallel_tool_calls, ) elif mode == "messages": run_messages( diff --git a/crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh b/crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh new file mode 100755 index 00000000..d59d0c82 --- /dev/null +++ b/crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh @@ -0,0 +1,259 @@ +#!/usr/bin/env bash +# Records parallel-tool-call behavior for gateway-owned built-in tools +# (web_search_preview, mcp) mixed with client-owned function tools, per +# https://github.com/vllm-project/agentic-api/issues/181. +# +# Four files, each streaming + non-streaming, organized by theme. Each file's +# tool declarations live in a matching tools-*.json (request-shape, never +# changes at runtime): +# +# parallel-builtin-only (tools-builtin-only.json: web_search_preview + mcp) +# Turn 1: two parallel web_search_preview calls, each batching two +# different queries together (multi-query batching + parallel +# dispatch, tested together). +# Turn 2: two parallel calls to the same MCP tool, two different queries +# (mirrors turn 1's batching test for the MCP tool type). +# Turn 3: web_search_preview + a remote MCP tool call, mixed built-in types. +# +# parallel-mixed (tools-mixed.json: web_search_preview + get_weather + set_temperature_unit) +# Success path only. Turn 1: get_weather + set_temperature_unit + +# web_search, 3-way parallel. Turn 2: follow-up depending on +# set_temperature_unit's effect. +# +# parallel-client (tools-client-only.json: get_weather + get_stock_price + set_temperature_unit) +# Success path, pure client-owned tools -- both function and custom. +# Turn 1: get_weather(Tokyo) + get_stock_price(AAPL) + set_temperature_unit +# (custom, freeform), 3-way parallel -- request. +# Turn 2: all three resolved successfully -- follow-up combining results. +# Turn 3: get_weather(Tokyo) + get_weather(Paris) -- same tool called +# twice in parallel with different arguments -- request. +# Turn 4: both resolved successfully -- follow-up combining results. +# +# parallel-failures (tools-mixed.json, reused: web_search_preview + get_weather) +# Exactly two failure modes -- an explicit error message, and a fully +# omitted output -- plus a mixed (built-in + client) variant of the +# omission. Each is its own independent two-turn conversation, recorded +# as a separate leg appended into the same file (via record_cassette.py's +# --append), because an omission turn may legitimately end in a provider +# error (as OpenAI does), and a turn that errors cannot be recovered from +# to continue the same conversation further -- so no leg can assume an +# earlier one's conversation state survived. +# Leg 1 (turns 1-2): get_weather(London) + get_weather(Tokyo), parallel +# -- London resolved as an explicit error, Tokyo succeeds -- tests +# that a failing call doesn't affect its concurrently-resolved +# sibling. +# Leg 2 (turns 3-4): get_weather(Tokyo) + get_weather(Atlantis), +# parallel -- Tokyo resolved, Atlantis's output omitted entirely -- +# tests whether the provider rejects the turn or just complains about +# the specific missing call_id. +# Leg 3 (turns 5-6): web_search_preview + get_weather(Atlantis), mixed +# parallel (web_search is already resolved server-side) -- +# Atlantis's output omitted entirely -- mixed built-in-resolved + +# client-left-dangling omission. +# +# Fake client-tool outputs are computed by real Python functions in +# tool_outputs.py (loaded via record_cassette.py's --tool-outputs), not +# static JSON -- see that file for the sentinel argument values ("London" +# always produces an explicit error output; "Atlantis" is always omitted) +# used consistently across every turn above. +# +# Every request explicitly sends parallel_tool_calls=true so the recorded +# cassettes reflect the value the gateway would send once it stops forcing +# parallel_tool_calls=false upstream (see request_response.rs). +# +# Usage from the repository root: +# +# # OpenAI reference only (default) +# OPENAI_API_KEY=sk-... \ +# bash crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh +# +# # Gateway only, against a locally running agentic-server + vLLM +# PARALLEL_RECORD_SET=gateway GATEWAY_URL=http://localhost:9000 GATEWAY_MODEL=Qwen/Qwen3.5-35B-A3B-FP8 \ +# bash crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh +# +# # Both +# PARALLEL_RECORD_SET=all OPENAI_API_KEY=sk-... \ +# bash crates/agentic-server-core/tests/cassettes/record_parallel_tool_call_cassettes.sh + +set -uo pipefail + +SCRIPTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BASE_DIR="$SCRIPTS_DIR/parallel_tool_calls" +TOOL_OUTPUTS="$BASE_DIR/tool_outputs.py" +PARALLEL_RECORD_SET="${PARALLEL_RECORD_SET:-openai}" +OPENAI_MODEL_NAME="${OPENAI_MODEL:-gpt-5.6}" +GATEWAY_URL="${GATEWAY_URL:-http://localhost:9000}" +GATEWAY_MODEL="${GATEWAY_MODEL:-Qwen/Qwen3.5-35B-A3B-FP8}" + +green() { printf '\033[32m%s\033[0m\n' "$*"; } +bold() { printf '\033[1m%s\033[0m\n' "$*"; } +red() { printf '\033[31m%s\033[0m\n' "$*"; } + +case "$PARALLEL_RECORD_SET" in + openai|gateway|all) ;; + *) + echo "ERROR: PARALLEL_RECORD_SET must be openai, gateway, or all" >&2 + exit 1 + ;; +esac + +if [[ "$PARALLEL_RECORD_SET" == "openai" || "$PARALLEL_RECORD_SET" == "all" ]]; then + if [[ -z "${OPENAI_API_KEY:-}" ]]; then + echo "ERROR: OPENAI_API_KEY must be set for PARALLEL_RECORD_SET=$PARALLEL_RECORD_SET" >&2 + exit 1 + fi +fi + + +BUILTIN_TURN1_PROMPT='Do two separate web_search calls in parallel, in this single turn -- do not wait for one to finish before starting the other. The first web_search call must batch two exact queries together: "potato nutrition facts" and "tomato nutrition facts". The second web_search call must batch two different exact queries together: "cucumber nutrition facts" and "carrot nutrition facts". Issue both calls now, then summarize each of the four results in one sentence.' +BUILTIN_TURN2_PROMPT='Call gitmcp_tiktoken__search_tiktoken_documentation in parallel for two separate exact queries -- do not wait for one to finish before starting the other: (1) {"query":"encoding"} and (2) {"query":"tokenizer"}. Issue both calls now in this single turn, then summarize each result in one sentence.' +BUILTIN_TURN3_PROMPT='Do both of these right now, in parallel, in this single turn -- do not wait for one to finish before starting the other: (1) search the web for the exact query "latest vLLM release notes", and (2) call gitmcp_tiktoken__search_tiktoken_documentation with {"query":"encoding"}. Do not call any other tool.' + +MIXED_TURN1_PROMPT='Do all three of these right now, in parallel, in this single turn -- do not wait for one before starting another: (1) call get_weather for "Tokyo", (2) call set_temperature_unit to set my preferred unit to "fahrenheit" for the rest of this conversation, and (3) search the web for the exact query "Tokyo weather today".' +MIXED_TURN2_PROMPT="Now report Tokyo's current temperature using the unit I just told you to prefer." + +CLIENT_TURN1_PROMPT='Do all three of these right now, in parallel, in this single turn -- do not wait for one before starting another: (1) call get_weather for "Tokyo", (2) call get_stock_price for "AAPL", and (3) call set_temperature_unit to set my preferred unit to "fahrenheit" for the rest of this conversation.' +CLIENT_TURN2_PROMPT="What did you find for the weather and the stock price, and what temperature unit did you just set?" +CLIENT_TURN3_PROMPT='Do both of these right now, in parallel, in this single turn -- do not wait for one before starting another: (1) call get_weather for "Tokyo", and (2) call get_weather for "Paris".' +CLIENT_TURN4_PROMPT="What's the weather in each of those two cities?" + +FAILURES_LEG1_TURN1_PROMPT='Do both of these right now, in parallel, in this single turn -- do not wait for one before starting another: (1) call get_weather for "London", and (2) call get_weather for "Tokyo".' +FAILURES_LEG1_TURN2_PROMPT="What did you find for each of those two cities?" +FAILURES_LEG2_TURN1_PROMPT='Do both of these right now, in parallel, in this single turn -- do not wait for one before starting another: (1) call get_weather for "Tokyo", and (2) call get_weather for "Atlantis".' +FAILURES_LEG2_TURN2_PROMPT="What's the weather in Tokyo?" +FAILURES_LEG3_TURN1_PROMPT='Do both of these right now, in parallel, in this single turn -- do not wait for one before starting another: (1) search the web for the exact query "Atlantis weather today", and (2) call get_weather for "Atlantis".' +FAILURES_LEG3_TURN2_PROMPT="Never mind the weather lookup -- just tell me one fun fact about Atlantis instead." + + +# Records an N-turn conversation. `prompts` is a single newline-separated +# string (one line per turn). A turn that legitimately produces a provider +# error (e.g. an omission turn) is still valuable recorded data, so this +# never aborts the script -- record_cassette.py's own exit status is just +# logged, and the proxy has already written every turn -- including an error +# response -- to the output file before any client-side exception could +# propagate. Returns 1 only if literally nothing was recorded. +record_case() { + local endpoint_flag="$1" endpoint="$2" model="$3" turns="$4" + local prompts="$5" tools_file="$6" stream_flag="$7" output="$8" + local temporary_output + temporary_output="$(mktemp "$BASE_DIR/.parallel-cassette.XXXXXX")" + + printf '%s\n' "$prompts" \ + | python "$SCRIPTS_DIR/record_cassette.py" \ + --mode responses \ + --turns "$turns" \ + "$stream_flag" \ + --model "$model" \ + "$endpoint_flag" "$endpoint" \ + --tools "$tools_file" \ + --tool-choice auto \ + --parallel-tool-calls true \ + --tool-outputs "$TOOL_OUTPUTS" \ + --max-output-tokens 2048 \ + --output "$temporary_output" + + if [[ ! -s "$temporary_output" ]]; then + rm -f -- "$temporary_output" + red "✗ no response was recorded at all for $output" + return 1 + fi + + mv -- "$temporary_output" "$output" + green "✓ recorded -> $output" + return 0 +} + +# Records parallel-failures' three independent legs, each a fresh two-turn +# conversation appended into the same file with --append (see the header +# comment above for why they can't be one continuous conversation). +record_failures_case() { + local endpoint_flag="$1" endpoint="$2" model="$3" tools_file="$4" stream_flag="$5" output="$6" + local temporary_output + temporary_output="$(mktemp -u "$BASE_DIR/.parallel-cassette.XXXXXX")" + + local leg + for leg in \ + "$FAILURES_LEG1_TURN1_PROMPT|$FAILURES_LEG1_TURN2_PROMPT" \ + "$FAILURES_LEG2_TURN1_PROMPT|$FAILURES_LEG2_TURN2_PROMPT" \ + "$FAILURES_LEG3_TURN1_PROMPT|$FAILURES_LEG3_TURN2_PROMPT" + do + local turn1="${leg%%|*}" turn2="${leg##*|}" + local append_flag=() + [[ -e "$temporary_output" ]] && append_flag=(--append) + printf '%s\n%s\n' "$turn1" "$turn2" \ + | python "$SCRIPTS_DIR/record_cassette.py" \ + --mode responses \ + --turns 2 \ + "$stream_flag" \ + --model "$model" \ + "$endpoint_flag" "$endpoint" \ + --tools "$tools_file" \ + --tool-choice auto \ + --parallel-tool-calls true \ + --tool-outputs "$TOOL_OUTPUTS" \ + --max-output-tokens 2048 \ + --output "$temporary_output" \ + "${append_flag[@]}" + done + + if [[ ! -s "$temporary_output" ]]; then + rm -f -- "$temporary_output" + red "✗ no response was recorded at all for $output" + return 1 + fi + + mv -- "$temporary_output" "$output" + green "✓ recorded -> $output" + return 0 +} + +record_provider_suite() { + local provider_label="$1" endpoint_flag="$2" endpoint="$3" model="$4" output_suffix="$5" + local model_slug + model_slug="$(echo "$model" | tr '/: ' '---')" + + bold "═══ $provider_label ($endpoint) — model: $model ═══" + + for stream_flag in --stream --no-stream; do + local stream_label="streaming" + [[ "$stream_flag" == "--no-stream" ]] && stream_label="nonstreaming" + + bold "parallel-builtin-only ($stream_label)" + record_case "$endpoint_flag" "$endpoint" "$model" 3 \ + "$(printf '%s\n%s\n%s' "$BUILTIN_TURN1_PROMPT" "$BUILTIN_TURN2_PROMPT" "$BUILTIN_TURN3_PROMPT")" \ + "$BASE_DIR/tools-builtin-only.json" "$stream_flag" \ + "$BASE_DIR/parallel-builtin-only-${output_suffix}-${model_slug}-${stream_label}.yaml" + + # bold "parallel-mixed ($stream_label)" + # record_case "$endpoint_flag" "$endpoint" "$model" 2 \ + # "$(printf '%s\n%s' "$MIXED_TURN1_PROMPT" "$MIXED_TURN2_PROMPT")" \ + # "$BASE_DIR/tools-mixed.json" "$stream_flag" \ + # "$BASE_DIR/parallel-mixed-${output_suffix}-${model_slug}-${stream_label}.yaml" + + # bold "parallel-client ($stream_label)" + # record_case "$endpoint_flag" "$endpoint" "$model" 4 \ + # "$(printf '%s\n%s\n%s\n%s' "$CLIENT_TURN1_PROMPT" "$CLIENT_TURN2_PROMPT" "$CLIENT_TURN3_PROMPT" "$CLIENT_TURN4_PROMPT")" \ + # "$BASE_DIR/tools-client-only.json" "$stream_flag" \ + # "$BASE_DIR/parallel-client-${output_suffix}-${model_slug}-${stream_label}.yaml" + + # bold "parallel-failures ($stream_label)" + # record_failures_case "$endpoint_flag" "$endpoint" "$model" \ + # "$BASE_DIR/tools-mixed.json" "$stream_flag" \ + # "$BASE_DIR/parallel-failures-${output_suffix}-${model_slug}-${stream_label}.yaml" + done +} + +mkdir -p "$BASE_DIR" + +if [[ "$PARALLEL_RECORD_SET" == "openai" || "$PARALLEL_RECORD_SET" == "all" ]]; then + record_provider_suite "OpenAI" --openai "https://api.openai.com" "$OPENAI_MODEL_NAME" "openai-reference" +fi + +if [[ "$PARALLEL_RECORD_SET" == "gateway" || "$PARALLEL_RECORD_SET" == "all" ]]; then + record_provider_suite "Gateway" --gateway "$GATEWAY_URL" "$GATEWAY_MODEL" "gateway" +fi + +echo +green "════════════════════════════════════════════════════════════════" +green "Parallel-tool-call cassettes recorded -> $BASE_DIR" +green "════════════════════════════════════════════════════════════════" diff --git a/crates/agentic-server-core/tests/custom_tool_test.rs b/crates/agentic-server-core/tests/custom_tool_test.rs index beb1708a..cd1a3c63 100644 --- a/crates/agentic-server-core/tests/custom_tool_test.rs +++ b/crates/agentic-server-core/tests/custom_tool_test.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use agentic_core::executor::accumulator::ResponseAccumulator; -use agentic_core::tool::{GatewayExecutors, ToolRegistry, ToolType}; +use agentic_core::tool::{GatewayExecutors, ToolOwnership, ToolRegistry, ToolType}; use agentic_core::types::event::MessageStatus; use agentic_core::types::io::{CustomToolCall, OutputItem}; use agentic_core::types::tools::ResponsesTool; @@ -228,7 +228,7 @@ async fn custom_tool_type_normalizes_for_the_model_but_remains_client_owned() { let entry = registry.lookup("agentic_raw_echo").expect("custom entry"); assert_eq!(entry.tool_type, ToolType::Custom); assert!(!entry.tool_type.is_gateway_owned()); - assert!(entry.handler.is_none()); + assert!(matches!(entry.ownership, ToolOwnership::Client)); let normalized = tools[0].to_function_tools(); assert_eq!(normalized.len(), 1); diff --git a/crates/agentic-server-core/tests/mcp_tool_test.rs b/crates/agentic-server-core/tests/mcp_tool_test.rs index 1126559a..9f75a9dc 100644 --- a/crates/agentic-server-core/tests/mcp_tool_test.rs +++ b/crates/agentic-server-core/tests/mcp_tool_test.rs @@ -1,5 +1,5 @@ use agentic_core::executor::accumulator::ResponseAccumulator; -use agentic_core::tool::{GatewayExecutors, ToolRegistry, ToolType}; +use agentic_core::tool::{GatewayExecutors, ToolOwnership, ToolRegistry, ToolType}; use agentic_core::types::io::output::McpListTools; use agentic_core::types::io::{McpCall, OutputItem}; use agentic_core::types::tools::ResponsesTool; @@ -92,7 +92,7 @@ async fn read_mcp_resource_function_is_client_owned() { let entry = registry.lookup("read_mcp_resource").expect("function registry entry"); assert_eq!(entry.tool_type, ToolType::Function); - assert!(entry.handler.is_none()); + assert!(matches!(entry.ownership, ToolOwnership::Client)); } fn assert_matching_native_mcp_requests( diff --git a/crates/agentic-server-core/tests/parallel_tool_calls_test.rs b/crates/agentic-server-core/tests/parallel_tool_calls_test.rs new file mode 100644 index 00000000..26e9c7b2 --- /dev/null +++ b/crates/agentic-server-core/tests/parallel_tool_calls_test.rs @@ -0,0 +1,263 @@ +use serde_json::{Value, json}; + +mod support; + +const CASSETTE_DIR: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/cassettes/parallel_tool_calls"); +const GATEWAY_MODEL_SLUG: &str = "Qwen-Qwen3.5-35B-A3B-FP8"; +const OPENAI_MODEL_SLUG: &str = "gpt-5.6"; + +#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] +struct ToolCallContract { + call_type: String, + name: String, + input: String, +} + +fn load_builtin_pair(streaming: bool) -> (support::Cassette, support::Cassette) { + let mode = if streaming { "streaming" } else { "nonstreaming" }; + let openai = support::load_cassette(&format!( + "{CASSETTE_DIR}/parallel-builtin-only-openai-reference-{OPENAI_MODEL_SLUG}-{mode}.yaml" + )); + let gateway = support::load_cassette(&format!( + "{CASSETTE_DIR}/parallel-builtin-only-gateway-{GATEWAY_MODEL_SLUG}-{mode}.yaml" + )); + (openai, gateway) +} + +fn terminal_response(turn: &support::Turn) -> Value { + if let Some(body) = &turn.response.body { + return body.clone(); + } + + support::recorded_named_sse_events(turn) + .into_iter() + .find(|event| event["type"] == "response.completed") + .and_then(|event| event.get("response").cloned()) + .expect("streaming turn should contain response.completed") +} + +fn terminal_output(turn: &support::Turn) -> Vec { + let response = terminal_response(turn); + assert_eq!(response["status"], "completed"); + response["output"] + .as_array() + .expect("completed response should contain output") + .clone() +} + +fn assert_request_contract(openai: &support::Cassette, gateway: &support::Cassette, streaming: bool) { + assert_eq!(openai.turns.len(), 3); + assert_eq!(gateway.turns.len(), openai.turns.len()); + + for (turn_index, (expected, actual)) in openai.turns.iter().zip(&gateway.turns).enumerate() { + let expected = &expected.request; + let actual = &actual.request; + + assert_eq!(expected.path, "/v1/responses"); + assert_eq!(actual.path, expected.path); + assert_eq!(expected.body.input, actual.body.input, "turn {} input", turn_index + 1); + assert_eq!(expected.body.tools, actual.body.tools, "turn {} tools", turn_index + 1); + assert_eq!(expected.body.tool_choice, actual.body.tool_choice); + assert_eq!(expected.body.max_output_tokens, actual.body.max_output_tokens); + assert_eq!(expected.body.store, actual.body.store); + assert_eq!(expected.body.stream, streaming); + assert_eq!(actual.body.stream, streaming); + assert_eq!(expected.body.parallel_tool_calls, Some(true)); + assert_eq!(actual.body.parallel_tool_calls, Some(true)); + } +} + +fn assert_previous_response_chain(cassette: &support::Cassette) { + let response_ids = cassette + .turns + .iter() + .map(|turn| { + terminal_response(turn)["id"] + .as_str() + .expect("completed response should have an ID") + .to_owned() + }) + .collect::>(); + + for (turn_index, turn) in cassette.turns.iter().enumerate() { + let expected = turn_index.checked_sub(1).map(|index| response_ids[index].as_str()); + assert_eq!( + turn.request.body.previous_response_id.as_deref(), + expected, + "turn {} should continue the immediately preceding response", + turn_index + 1 + ); + } +} + +fn canonical_json(raw: &str) -> String { + serde_json::from_str::(raw).map_or_else( + |_| raw.trim().to_owned(), + |value| serde_json::to_string(&value).expect("JSON value should serialize"), + ) +} + +fn tool_call_contract(item: &Value) -> Option { + match item["type"].as_str()? { + "web_search_call" => { + assert_eq!(item["status"], "completed"); + Some(ToolCallContract { + call_type: "web_search_call".to_owned(), + name: item["action"]["type"].as_str().unwrap_or_default().to_owned(), + // Search sources are provider-specific. The requested query batch is + // the stable execution contract. + input: serde_json::to_string(&item["action"]["queries"]).expect("web-search queries should serialize"), + }) + } + "mcp_call" => { + assert_eq!(item["status"], "completed"); + assert!(item["error"].is_null()); + assert!(item["output"].as_str().is_some_and(|output| !output.is_empty())); + Some(ToolCallContract { + call_type: "mcp_call".to_owned(), + name: format!( + "{}/{}", + item["server_label"].as_str().unwrap_or_default(), + item["name"].as_str().unwrap_or_default() + ), + input: canonical_json(item["arguments"].as_str().unwrap_or_default()), + }) + } + _ => None, + } +} + +fn tool_call_contracts(output: &[Value]) -> Vec { + let mut calls = output.iter().filter_map(tool_call_contract).collect::>(); + calls.sort(); + calls +} + +fn public_output_types(output: &[Value]) -> Vec<&str> { + output + .iter() + .filter_map(|item| item["type"].as_str()) + .filter(|item_type| *item_type != "reasoning") + .collect() +} + +fn mcp_list_tools_contract(item: &Value) -> Value { + let tools = item["tools"] + .as_array() + .expect("mcp_list_tools should contain tools") + .iter() + .map(|tool| { + json!({ + "name": tool["name"], + "description": tool["description"], + "input_schema": tool["input_schema"], + "annotations": tool["annotations"], + }) + }) + .collect::>(); + + json!({ + "server_label": item["server_label"], + "tools": tools, + }) +} + +fn sole_mcp_list_tools(cassette: &support::Cassette) -> Value { + let discovered = cassette + .turns + .iter() + .enumerate() + .flat_map(|(turn_index, turn)| { + terminal_output(turn) + .into_iter() + .filter(|item| item["type"] == "mcp_list_tools") + .map(move |item| (turn_index, item)) + }) + .collect::>(); + + assert_eq!( + discovered.len(), + 1, + "MCP discovery must be emitted once for the whole stored response chain" + ); + assert_eq!(discovered[0].0, 0, "MCP discovery belongs to the first turn only"); + mcp_list_tools_contract(&discovered[0].1) +} + +fn assert_streaming_lifecycle(turn: &support::Turn, output: &[Value]) { + let events = support::recorded_named_sse_events(turn); + let sequence_numbers = events + .iter() + .map(|event| event["sequence_number"].as_u64().expect("SSE event sequence number")) + .collect::>(); + assert!( + sequence_numbers.windows(2).all(|pair| pair[1] == pair[0] + 1), + "SSE sequence numbers should be contiguous" + ); + + for (output_type, completed_event) in [ + ("mcp_list_tools", "response.mcp_list_tools.completed"), + ("mcp_call", "response.mcp_call.completed"), + ("web_search_call", "response.web_search_call.completed"), + ] { + let output_count = output.iter().filter(|item| item["type"] == output_type).count(); + let completed_count = events.iter().filter(|event| event["type"] == completed_event).count(); + let done_count = events + .iter() + .filter(|event| event["type"] == "response.output_item.done" && event["item"]["type"] == output_type) + .count(); + assert_eq!(completed_count, output_count, "{output_type} completed lifecycle count"); + assert_eq!(done_count, output_count, "{output_type} output-item lifecycle count"); + } +} + +#[test] +fn multi_turn_parallel_builtin_calls_match_openai_reference() { + let expected_types = [ + vec!["mcp_list_tools", "web_search_call", "web_search_call", "message"], + vec!["mcp_call", "mcp_call", "message"], + vec!["web_search_call", "mcp_call", "message"], + ]; + + for streaming in [false, true] { + let (openai, gateway) = load_builtin_pair(streaming); + assert_request_contract(&openai, &gateway, streaming); + assert_previous_response_chain(&openai); + assert_previous_response_chain(&gateway); + + for (turn_index, ((expected_turn, actual_turn), expected_types)) in + openai.turns.iter().zip(&gateway.turns).zip(&expected_types).enumerate() + { + let expected_output = terminal_output(expected_turn); + let actual_output = terminal_output(actual_turn); + assert_eq!(public_output_types(&expected_output), *expected_types); + assert_eq!( + public_output_types(&actual_output), + *expected_types, + "gateway turn {} public output types", + turn_index + 1 + ); + + let expected_calls = tool_call_contracts(&expected_output); + let actual_calls = tool_call_contracts(&actual_output); + assert_eq!(expected_calls.len(), 2, "reference turn {} call count", turn_index + 1); + assert_eq!( + actual_calls, + expected_calls, + "gateway turn {} tool calls should match the OpenAI contract", + turn_index + 1 + ); + + if streaming { + assert_streaming_lifecycle(expected_turn, &expected_output); + assert_streaming_lifecycle(actual_turn, &actual_output); + } + } + + assert_eq!( + sole_mcp_list_tools(&gateway), + sole_mcp_list_tools(&openai), + "gateway MCP discovery should match OpenAI and should not repeat on later turns" + ); + } +} diff --git a/crates/agentic-server-core/tests/support/mod.rs b/crates/agentic-server-core/tests/support/mod.rs index 0885f2c9..ca1f1e3f 100644 --- a/crates/agentic-server-core/tests/support/mod.rs +++ b/crates/agentic-server-core/tests/support/mod.rs @@ -58,6 +58,10 @@ pub struct TurnBody { pub tool_choice: Option, #[serde(default)] pub max_output_tokens: Option, + #[serde(default)] + pub parallel_tool_calls: Option, + #[serde(default)] + pub previous_response_id: Option, } fn default_true() -> bool { diff --git a/crates/agentic-server-core/tests/tool_normalization_test.rs b/crates/agentic-server-core/tests/tool_normalization_test.rs index 5cf035c9..c11095fd 100644 --- a/crates/agentic-server-core/tests/tool_normalization_test.rs +++ b/crates/agentic-server-core/tests/tool_normalization_test.rs @@ -490,5 +490,10 @@ fn web_search_preview_normalizes_to_gateway_function() { assert_eq!(tools.len(), 1); assert_eq!(tools[0].get("type").and_then(Value::as_str), Some("function")); assert_eq!(tools[0].get("name").and_then(Value::as_str), Some("web_search")); - assert_eq!(tools[0]["parameters"]["required"], serde_json::json!(["query"])); + assert!(tools[0]["parameters"]["properties"]["query"].is_object()); + assert!(tools[0]["parameters"]["properties"]["queries"].is_object()); + assert_eq!( + tools[0]["parameters"]["anyOf"], + serde_json::json!([{"required": ["query"]}, {"required": ["queries"]}]) + ); } diff --git a/crates/agentic-server-core/tests/web_search_tool_test.rs b/crates/agentic-server-core/tests/web_search_tool_test.rs index ee1f7c97..5f02b154 100644 --- a/crates/agentic-server-core/tests/web_search_tool_test.rs +++ b/crates/agentic-server-core/tests/web_search_tool_test.rs @@ -7,7 +7,9 @@ use std::time::Duration; use agentic_core::executor::{ConversationHandler, ExecuteRequest, ExecutionContext, ResponseHandler}; use agentic_core::storage::{ConversationStore, ResponseStore}; use agentic_core::tool::{GatewayExecutor, WebSearchHandler}; -use agentic_core::types::io::{OutputItem, ResponsesInput, ToolChoice}; +use agentic_core::types::io::{ + FunctionToolResultMessage, InputItem, OutputItem, ResponsesInput, ToolCallOutput, ToolChoice, +}; use agentic_core::types::request_response::RequestPayload; use agentic_core::types::tools::ResponsesTool; use axum::extract::State; @@ -437,7 +439,7 @@ async fn web_search_handler_gets_query_params_from_you_and_formats_results() { let output_json: serde_json::Value = serde_json::from_str(&output.output).unwrap(); assert_eq!(output_json["query"], "rust async"); assert_eq!(output_json["results"]["web"][0]["url"], "https://example.com/rust"); - assert_eq!(output_json["metadata"]["search_uuid"], "search_123"); + assert_eq!(output_json["metadata"][0]["search_uuid"], "search_123"); } #[tokio::test] @@ -1083,6 +1085,22 @@ async fn execute_runs_web_search_and_sends_tool_output_back_to_model() { let second_input = request_bodies[1]["input"] .as_array() .expect("second request input array"); + assert_eq!( + second_input + .iter() + .filter(|item| item["type"] == "function_call" && item["call_id"] == "call_search") + .count(), + 1, + "persisted web_search function call must not be duplicated by its public output item" + ); + assert_eq!( + second_input + .iter() + .filter(|item| item["type"] == "function_call_output" && item["call_id"] == "call_search") + .count(), + 1, + "persisted web_search result must not be duplicated by its public output item" + ); let tool_output = second_input .iter() .find(|item| item["type"] == "function_call_output") @@ -1164,6 +1182,29 @@ async fn execute_relaxes_forced_tool_choice_after_web_search_result() { assert!(request_bodies[1].get("tool_choice").is_none()); } +fn base_payload(input: ResponsesInput) -> RequestPayload { + RequestPayload { + model: "test-model".to_owned(), + input, + instructions: None, + previous_response_id: None, + conversation_id: None, + tools: None, + tool_choice: None, + stream: false, + store: true, + include: None, + temperature: None, + top_p: None, + max_output_tokens: Some(1024), + truncation: None, + metadata: None, + parallel_tool_calls: None, + cache_salt: None, + context_management: None, + } +} + #[tokio::test] async fn execute_returns_mixed_client_tool_calls_without_followup_model_request() { let (you_url, mut captured_you, _you_handle) = spawn_mock_you().await; @@ -1184,24 +1225,8 @@ async fn execute_returns_mixed_client_tool_calls_without_followup_model_request( })) .unwrap(); let payload = RequestPayload { - model: "test-model".to_owned(), - input: ResponsesInput::Text("look up rust async and weather".to_owned()), - instructions: None, - previous_response_id: None, - conversation_id: None, tools: Some(vec![web_search, client_function]), - tool_choice: None, - stream: false, - store: true, - include: None, - temperature: None, - top_p: None, - max_output_tokens: Some(1024), - truncation: None, - metadata: None, - parallel_tool_calls: None, - cache_salt: None, - context_management: None, + ..base_payload(ResponsesInput::Text("look up rust async and weather".to_owned())) }; let result = ExecuteRequest::new(payload, Arc::clone(&exec_ctx)).run().await.unwrap(); @@ -1233,24 +1258,13 @@ async fn execute_returns_mixed_client_tool_calls_without_followup_model_request( assert_eq!(function_names, ["get_weather"]); let continuation_payload = RequestPayload { - model: "test-model".to_owned(), - input: ResponsesInput::Text("continue".to_owned()), - instructions: None, previous_response_id: Some(response.id), - conversation_id: None, - tools: None, - tool_choice: None, - stream: false, - store: true, - include: None, - temperature: None, - top_p: None, - max_output_tokens: Some(1024), - truncation: None, - metadata: None, - parallel_tool_calls: None, - cache_salt: None, - context_management: None, + ..base_payload(ResponsesInput::Items(vec![InputItem::FunctionCallOutput( + FunctionToolResultMessage { + call_id: "call_weather".to_owned(), + output: ToolCallOutput::Text("{\"city\":\"San Francisco\",\"temperature_c\":18}".to_owned()), + }, + )])) }; let continuation = ExecuteRequest::new(continuation_payload, exec_ctx).run().await.unwrap(); assert!(matches!(continuation, Either::Left(_))); diff --git a/crates/agentic-server/src/agentic_harness.rs b/crates/agentic-server/src/agentic_harness.rs index 0b210d83..156b658d 100644 --- a/crates/agentic-server/src/agentic_harness.rs +++ b/crates/agentic-server/src/agentic_harness.rs @@ -41,9 +41,7 @@ pub fn prepare_codex_home( {"effort": "high", "description": "Deep reasoning"} ], "supports_reasoning_summaries": true, - // The gateway accepts parallel_tool_calls=true but serializes tool calls - // upstream (#190, #197), so do not advertise parallel execution to Codex. - "supports_parallel_tool_calls": false, + "supports_parallel_tool_calls": true, // apply_patch_tool_type is intentionally omitted: Codex only supports // "freeform", which the gateway cannot normalize while preserving // constrained decoding. Codex falls back to editing via the shell tool. diff --git a/crates/agentic-server/src/config_file.rs b/crates/agentic-server/src/config_file.rs index 43e189f4..30f13650 100644 --- a/crates/agentic-server/src/config_file.rs +++ b/crates/agentic-server/src/config_file.rs @@ -35,6 +35,19 @@ impl McpFileConfig { } } +#[derive(Debug, Default, Deserialize, Serialize)] +#[serde(default, deny_unknown_fields)] +pub(crate) struct ToolsFileConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub max_concurrent_gateway_calls: Option, +} + +impl ToolsFileConfig { + fn is_empty(&self) -> bool { + self.max_concurrent_gateway_calls.is_none() + } +} + #[derive(Debug, Default, Deserialize, Serialize)] #[serde(default, deny_unknown_fields)] pub(crate) struct MessagesGatewayFileConfig { @@ -59,6 +72,8 @@ pub(crate) struct FileConfig { pub web_search: WebSearchFileConfig, #[serde(skip_serializing_if = "McpFileConfig::is_empty")] pub mcp: McpFileConfig, + #[serde(skip_serializing_if = "ToolsFileConfig::is_empty")] + pub tools: ToolsFileConfig, #[serde(skip_serializing_if = "MessagesGatewayFileConfig::is_empty")] pub messages_gateway: MessagesGatewayFileConfig, #[serde(skip_serializing_if = "HashMap::is_empty")] diff --git a/crates/agentic-server/src/main.rs b/crates/agentic-server/src/main.rs index 60a245ee..4e236723 100644 --- a/crates/agentic-server/src/main.rs +++ b/crates/agentic-server/src/main.rs @@ -5,12 +5,12 @@ use clap::{Args, Parser, Subcommand}; use agentic_core::DatabaseBackend; use agentic_core::config::{ - Config, DEFAULT_POSTGRES_ACQUIRE_TIMEOUT_SECONDS, DEFAULT_POSTGRES_IDLE_TIMEOUT_SECONDS, - DEFAULT_POSTGRES_LOCK_TIMEOUT_SECONDS, DEFAULT_POSTGRES_MAX_CONNECTIONS, DEFAULT_POSTGRES_MAX_LIFETIME_SECONDS, - DEFAULT_POSTGRES_MIGRATION_TIMEOUT_SECONDS, DEFAULT_POSTGRES_STATEMENT_TIMEOUT_SECONDS, - DEFAULT_SQLITE_JOURNAL_SIZE_LIMIT_BYTES, DEFAULT_SQLITE_MAX_CONNECTIONS, DEFAULT_SQLITE_MMAP_SIZE_BYTES, - PostgresConfig, SqliteConfig, SqliteTempStore, ToolRuntimeConfig, WebSearchProviderConfig, default_database_url, - ensure_agentic_api_home, normalize_base_url, + Config, DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS, DEFAULT_POSTGRES_ACQUIRE_TIMEOUT_SECONDS, + DEFAULT_POSTGRES_IDLE_TIMEOUT_SECONDS, DEFAULT_POSTGRES_LOCK_TIMEOUT_SECONDS, DEFAULT_POSTGRES_MAX_CONNECTIONS, + DEFAULT_POSTGRES_MAX_LIFETIME_SECONDS, DEFAULT_POSTGRES_MIGRATION_TIMEOUT_SECONDS, + DEFAULT_POSTGRES_STATEMENT_TIMEOUT_SECONDS, DEFAULT_SQLITE_JOURNAL_SIZE_LIMIT_BYTES, + DEFAULT_SQLITE_MAX_CONNECTIONS, DEFAULT_SQLITE_MMAP_SIZE_BYTES, PostgresConfig, SqliteConfig, SqliteTempStore, + ToolRuntimeConfig, WebSearchProviderConfig, default_database_url, ensure_agentic_api_home, normalize_base_url, }; use agentic_core::error::Error; use agentic_server::auth::OidcConfig; @@ -18,7 +18,7 @@ use agentic_server::auth::OidcConfig; mod config_file; mod server; -use config_file::{FileConfig, McpFileConfig, MessagesGatewayFileConfig, WebSearchFileConfig}; +use config_file::{FileConfig, McpFileConfig, MessagesGatewayFileConfig, ToolsFileConfig, WebSearchFileConfig}; #[derive(Args, Clone)] struct CommonArgs { @@ -245,6 +245,14 @@ fn build_config(llm_api_base: String, common: &CommonArgs, file: &FileConfig) -> let web_search_base_url = environment_value("YOU_API_BASE_URL").or_else(|| file.web_search.base_url.clone()); let mcp_allowed_hosts = environment_value("AGENTIC_MCP_ALLOWED_HOSTS") .map_or_else(|| file.mcp.allowed_hosts.clone(), |value| parse_comma_separated(&value)); + let max_concurrent_gateway_calls_default = file + .tools + .max_concurrent_gateway_calls + .unwrap_or_else(|| u32::try_from(DEFAULT_MAX_CONCURRENT_GATEWAY_CALLS).unwrap_or(u32::MAX)); + let max_concurrent_gateway_calls = parse_env_u32( + "AGENTIC_MAX_CONCURRENT_GATEWAY_CALLS", + max_concurrent_gateway_calls_default, + )?; Ok(Config { llm_api_base, openai_api_key: common.openai_api_key.clone(), @@ -262,6 +270,7 @@ fn build_config(llm_api_base: String, common: &CommonArgs, file: &FileConfig) -> mcp_servers: file.mcp_servers.clone(), mcp_allowed_hosts, messages_gateway_tool_aliases: file.messages_gateway.tool_aliases.clone(), + max_concurrent_gateway_calls: max_concurrent_gateway_calls as usize, }, }) } @@ -277,6 +286,10 @@ fn generated_file_config(llm_api_base: String) -> FileConfig { allowed_hosts: environment_value("AGENTIC_MCP_ALLOWED_HOSTS") .map_or_else(Vec::new, |value| parse_comma_separated(&value)), }, + tools: ToolsFileConfig { + max_concurrent_gateway_calls: environment_value("AGENTIC_MAX_CONCURRENT_GATEWAY_CALLS") + .and_then(|value| value.parse().ok()), + }, messages_gateway: MessagesGatewayFileConfig { tool_aliases: environment_value("MESSAGES_GATEWAY_TOOL_ALIASES"), }, diff --git a/crates/agentic-server/src/server.rs b/crates/agentic-server/src/server.rs index b3d5c110..8b5960a9 100644 --- a/crates/agentic-server/src/server.rs +++ b/crates/agentic-server/src/server.rs @@ -61,7 +61,6 @@ async fn serve_gateway( let websocket_tracker = state.websocket_tracker.clone(); let router = build_router_with_auth(state, &server_config, authenticator); let listener = TcpListener::bind(&addr).await?; - warn!("parallel tool calls are not supported; requests are serialized by the gateway"); info!("gateway listening on {addr}"); axum::serve(listener, router) .with_graceful_shutdown(async move { diff --git a/crates/agentic-server/tests/responses_test.rs b/crates/agentic-server/tests/responses_test.rs index e79108e4..188002a4 100644 --- a/crates/agentic-server/tests/responses_test.rs +++ b/crates/agentic-server/tests/responses_test.rs @@ -486,6 +486,34 @@ async fn test_gateway_normalization_preserves_parallel_tool_calls() { assert_eq!(requests[0]["parallel_tool_calls"], false); } +#[tokio::test] +async fn test_gateway_normalization_allows_parallel_tool_calls_true() { + // Arrange + let (llm_url, requests, _h1) = spawn_mock_vllm_json_capture().await; + let (gw_url, _h2) = spawn_gateway(test_state(&test_config(&llm_url))).await; + + // Act + let resp = reqwest::Client::new() + .post(format!("{gw_url}/v1/responses")) + .json(&serde_json::json!({ + "model": "test", + "input": [{"type": "message", "role": "user", "content": "hi"}], + "tools": [{"type": "web_search_preview"}], + "parallel_tool_calls": true, + "store": false, + "stream": false + })) + .send() + .await + .unwrap(); + + // Assert + assert_eq!(resp.status(), 200); + let requests = requests.lock().await; + assert_eq!(requests.len(), 1); + assert_eq!(requests[0]["parallel_tool_calls"], true); +} + #[tokio::test] async fn test_store_false_proxies_large_json_body_to_vllm() { // Arrange diff --git a/docs/design/codex-integration.md b/docs/design/codex-integration.md index 5f13bcee..46836f67 100644 --- a/docs/design/codex-integration.md +++ b/docs/design/codex-integration.md @@ -133,11 +133,11 @@ Responses tool shapes and execution semantics, so it can be always on. | Shape | Behavior | |-------|----------| -| `function` | Client-owned by default. Preserve declaration and return matching calls to the client unless configured as gateway-owned. | +| `function` | Client-owned. Preserve the declaration and return matching calls to the client. | | `namespace` | Client-owned Codex grouping for function tools. Flatten members only for upstream requests, then restore returned calls. | | `custom` | Client-owned freeform tool. Preserve its opaque format and forward it natively. | -| `web_search_preview` | Gateway-owned when configured; normalized to the gateway web-search function tool. | -| `mcp` | Gateway-owned. Normalize MCP declarations to model-visible function tools, execute calls with request-scoped MCP handlers, and expose public `mcp_call` items. Streaming emits `response.output_item.added`, `response.mcp_call.in_progress`, `response.mcp_call_arguments.delta`/`.done`, `response.mcp_call.completed` or `.failed`, and `response.output_item.done`. | +| `web_search_preview` | Gateway-owned and normalized to the web-search function tool. Without a usable provider, execution produces a failed tool result instead of changing ownership. | +| `mcp` | Gateway-owned. Normalize discovered MCP tools to model-visible function tools, execute calls with request-scoped MCP bindings, and expose public `mcp_call` items. Streaming emits `response.output_item.added`, `response.mcp_call.in_progress`, `response.mcp_call_arguments.delta`/`.done`, `response.mcp_call.completed` or `.failed`, and `response.output_item.done`. | | `file_search`, `code_interpreter` | Accepted by the typed request parser but skipped during upstream normalization because no gateway handler is registered yet. | | Unknown tool | Recognized and skipped on the typed path; opaque fields are not preserved or executed. Eligible raw-proxy requests remain byte-transparent. | @@ -167,6 +167,12 @@ On a turn that returns client-owned tool calls, storage keeps the assistant call the matching tool output item, and `previous_response_id` rebuilds the full sequence while preserving effective tool metadata from the previous response unless the client explicitly overrides it. +Gateway-owned web-search and MCP public output items are not reconstructed as model input during continuation. Their +internal `function_call` and matching `function_call_output` records are persisted as the canonical model-visible pair. +MCP list-tools output is different: it rehydrates as an internal `InputItem::McpListTools` record so the request-scoped +registry can avoid repeating that server label's public discovery lifecycle. `ResponsesInput::model_input()` removes +the record before the request is sent to vLLM. + --- ## Manual Custom Tool Test diff --git a/docs/design/mcp-gateway-integration.md b/docs/design/mcp-gateway-integration.md index ade164ac..958195f0 100644 --- a/docs/design/mcp-gateway-integration.md +++ b/docs/design/mcp-gateway-integration.md @@ -63,6 +63,10 @@ The gateway exposes discovery through the `mcp_list_tools` lifecycle before any the corresponding output-item and `response.mcp_list_tools.*` events. A discovery failure produces a failed `mcp_list_tools` item with its error and does not register tools from that server. +Within a stored response or conversation chain, that public list-tools lifecycle is emitted once per server label. +Discovery may still be needed to rebuild executable handlers for a later request; public emission is a separate +decision based on continuation history. + ## Components ### `McpClient` @@ -174,6 +178,29 @@ the original identity so public output uses: } ``` +The registry also owns list-tools lifecycle state. Current and historical records +are grouped as `HashMap>`, keyed by `server_label`. +Registry construction inserts the current discovery record first, rehydrated +`InputItem::McpListTools` records are appended only to labels present in the current +registry, and entries with more than one record are treated as already listed. +`mcp_list_tool_items()` exposes the remaining one-record entries directly to blocking +output assembly and `emit_mcp_discovery_lifecycle()`. Streaming clears the map after +round zero, so the lifecycle cannot repeat in later inference rounds. + +This metadata follows the normal history pipeline rather than a side channel: + +```text +stored OutputItem::McpListTools + -> InOutItem::into_input_items + -> InputItem::McpListTools in enriched continuation history + -> ToolRegistry lifecycle cache + -> ResponsesInput::model_input removes it before vLLM +``` + +Stored public `mcp_call` items are not reconstructed as model input. The +model-visible `function_call` and matching `function_call_output` pair is +persisted separately and remains the canonical continuation source. + ## Turn execution The gateway's existing tool loop handles MCP tools together with other gateway-executed built-in tools: @@ -181,9 +208,10 @@ The gateway's existing tool loop handles MCP tools together with other gateway-e ```text build request-scoped registry -> discover MCP tools + -> suppress an already-recorded list-tools lifecycle by server label -> normalize request for upstream inference -> receive internal function call - -> registry dispatches to McpHandler + -> GatewayRound resolves the registry binding -> McpClient tools/call -> append function call output for the next upstream round -> expose public mcp_call item/events to the Responses client diff --git a/docs/design/tool-framework.md b/docs/design/tool-framework.md index 5c6c8bbc..19ea07cf 100644 --- a/docs/design/tool-framework.md +++ b/docs/design/tool-framework.md @@ -6,8 +6,8 @@ > **As-built note.** This document began as a proposal and now reflects what > shipped. The framework landed across several PRs and diverged from the > original sketch in a few deliberate ways — most notably the `ToolHandler` -> trait split, a two-layer dispatch model, a trimmed `LoopDecision`, and a new -> `CodexNamespace` tool type. Those changes are called out inline and mapped to +> trait split, explicit ownership plus round execution, a trimmed `LoopDecision`, +> and a new `CodexNamespace` tool type. Those changes are called out inline and mapped to > their PRs in [Implementation Status](#implementation-status). Sections that > capture rationale (Principles, Alternatives Considered, Design Decisions) are > preserved as-designed; the type/trait definitions below match the shipped code. @@ -16,18 +16,18 @@ ## Problem -Clients send heterogeneous tool types (`function`, `namespace`, `mcp`, `web_search`, `file_search`, `code_interpreter`). vLLM only speaks function calling — it produces `function_call` output items regardless of tool origin. The gateway must bridge both directions: normalize inbound tools for inference, and route outbound calls to their correct executors. +Clients send heterogeneous tool types (`function`, `custom`, `namespace`, `mcp`, `web_search`, `file_search`, `code_interpreter`). vLLM only speaks function calling — it produces `function_call` output items regardless of tool origin. The gateway must bridge both directions: normalize supported inbound tools for inference, and route outbound calls to their correct owners. -Today `ResponsesTool = FunctionTool`. This design replaces that with a type-aware framework that handles the full tool lifecycle for any tool type through a single pipeline. +The original implementation used `ResponsesTool = FunctionTool`. The shipped type-aware framework handles the lifecycle through one pipeline while retaining public tool identity outside the model-facing representation. --- ## Principles 1. **One pipeline, many types.** The tool lifecycle is the same for all types. What varies is the behavior at each stage. -2. **vLLM is function-only.** Every tool type normalizes to `type: "function"` before inference. Permanent constraint. +2. **vLLM is function-only.** Model-visible declarations normalize to `type: "function"` before inference. Types without a model-facing implementation are omitted; public tool identity is restored after inference. 3. **Routing by registry, not heuristics.** After inference, `function_call` items are looked up in a request-scoped registry that maps names back to origin type and config. -4. **Ownership decides execution.** Each `ToolType` is gateway-owned or client-owned (`ToolType::is_gateway_owned()`). Client-owned types (`function`, `codex namespace`) are never gateway-executed — the response returns `status: "requires_action"` and the client resolves them. Gateway-owned types (`web_search`, `mcp`, `file_search`, `code_interpreter`) are executed server-side *when a handler is registered*; today only `web_search` ships a handler (see [Implementation Status](#implementation-status)). A gateway-owned type with no handler is preserved, not executed. +4. **Ownership decides execution.** Each registry entry has explicit `ToolOwnership`; `ToolType::is_gateway_owned()` supplies the declaration-level default. Client-owned types (`function`, `custom`, `codex namespace`) are never gateway-executed — their calls are returned for the client to resolve. Gateway-owned types (`web_search`, `mcp`, `file_search`, `code_interpreter`) are handled by the gateway. Web search and MCP ship executable bindings; a gateway-owned entry without an implementation produces an error tool result for the next inference round rather than silently dropping the call. 5. **Additive.** New tool types implement a trait and register. The executor loop doesn't change. --- @@ -40,8 +40,8 @@ graph TD REQ["Client Request
tools: mixed types"] PARSE["Parse + Validate
per-type schemas"] DISC["Discover
MCP: tools/list"] - NORM["Normalize
all → type: function"] - REG["Build Registry
name → type + config"] + NORM["Normalize supported tools
→ type: function"] + REG["Build Registry
name → ownership + binding"] end subgraph "Inference" @@ -49,9 +49,9 @@ graph TD end subgraph "Execution Phase (per iteration)" - ROUTE["Route — classify_round
registry lookup per call"] - EXEC_GW["Gateway Execute — registry.dispatch
mcp / web / file / code"] - PASS["Passthrough → requires_action
function / codex namespace"] + ROUTE["Route by ToolOwnership
registry lookup per call"] + EXEC_GW["GatewayRound
bounded concurrent execution"] + PASS["Return unresolved call
function / custom / namespace"] LOOP["Inject Results
re-enter inference"] end @@ -84,11 +84,11 @@ Every request with tools passes through 7 stages. Stages 1–4 run once at reque |---|-------|---------------------|-------------------------| | 1 | **Parse** | Deserialize `tools[]`, classify by `type` | Validate required fields per type | | 2 | **Discover** | Iterate handlers, collect discovered tools | MCP: `tools/list`. Others: no-op | -| 3 | **Normalize** | Flatten all into `Vec` for vLLM | MCP: schema → parameters. WebSearch: synthetic def | -| 4 | **Register** | Build `HashMap` | Each handler declares ownership of its tool names | +| 3 | **Normalize** | Convert supported model-visible declarations into `Vec` for vLLM | MCP: schema → parameters. Web search: synthetic definition. Unsupported types: omit | +| 4 | **Register** | Build `HashMap` | Store explicit ownership and an optional `GatewayBinding` | | 5 | **Route** | Lookup `function_call.name` in registry | Determine: gateway-execute or client-passthrough | -| 6 | **Execute** | Parallel execution with timeout + error isolation | MCP: JSON-RPC. WebSearch: HTTP API. Function: skip | -| 7 | **Emit** | Forward type-specific SSE events to client | MCP: 7 events. WebSearch: 2 events. Function: 0 | +| 6 | **Execute** | Bounded concurrency, per-call timeout, same-tool safety, error isolation | MCP: JSON-RPC. WebSearch: HTTP API. Client-owned: skip | +| 7 | **Emit** | Project internal calls into type-specific output items and SSE lifecycles | MCP and web search use gateway-generated events; client tools retain their public call shape | Stages 1–4 produce two artifacts: - **Normalized tools** — `Vec` forwarded to vLLM @@ -104,6 +104,7 @@ Stages 1–4 produce two artifacts: #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ToolType { Function, + Custom, CodexNamespace, // added by codex integration (#84): a namespaced group of // client-owned function tools (e.g. `mcp__shell.run`). Mcp, @@ -114,8 +115,8 @@ pub enum ToolType { } impl ToolType { - /// Gateway-owned types are executed server-side; everything else - /// (`Function`, `CodexNamespace`) is client-owned and handed back. + /// Gateway-owned types are handled server-side; everything else + /// (`Function`, `Custom`, `CodexNamespace`) is client-owned and handed back. pub const fn is_gateway_owned(self) -> bool { /* ... */ } } ``` @@ -123,8 +124,8 @@ impl ToolType { > **Drift from proposal:** `CodexNamespace` did not exist in the original > sketch. Codex declares tools grouped under a namespace whose members are > client-owned; they flatten to model-visible names for inference and restore -> to `{namespace, name}` on the way out. `is_gateway_owned()` is the single -> predicate the dispatch layer uses to split gateway vs. client calls. +> to `{namespace, name}` on the way out. `is_gateway_owned()` initializes entry +> ownership; routing uses the explicit `ToolOwnership` stored on that entry. ### Request-Side Tool Param @@ -159,8 +160,12 @@ pub enum ResponsesTool { #[serde(rename = "namespace")] Namespace(CodexNamespaceToolParam), - // Forward-compat catch-all: unrecognized `type` deserializes here rather - // than erroring, so a new upstream tool type is preserved, not rejected. + // Client-owned freeform tool; normalized internally and restored on output. + #[serde(rename = "custom")] + Custom(CustomToolParam), + + // Forward-compat catch-all: the typed path recognizes and skips unknown + // declarations rather than attempting to execute them. #[serde(rename = "unknown", other)] Unknown, } @@ -168,22 +173,23 @@ pub enum ResponsesTool { `#[serde(tag = "type")]` makes this wire-compatible with existing `{"type":"function",...}` requests. `#[non_exhaustive]` + the `Unknown` catch-all -means an unrecognized tool type is preserved rather than failing the request -(consistent with the roadmap's "unknown shapes are preserved, never executed"). -The `web_search` aliases accept the dated OpenAI variants. +means an unrecognized tool type does not fail typed deserialization and is never +executed. Eligible raw-proxy requests remain byte-transparent; the typed path omits +unknown declarations. The `web_search` aliases accept the dated OpenAI variants. ### Tool Registry ```rust pub struct ToolEntry { pub tool_type: ToolType, - pub config: Value, // serialised server-level tool param - pub server_label: Option, // MCP: which server this tool belongs to - pub handler: Option>, // the executor for gateway-owned tools + pub config: Value, // serialised server-level tool param + pub server_label: Option, // MCP: which server this tool belongs to + pub ownership: ToolOwnership, } pub struct ToolRegistry { entries: HashMap, + mcp_list_tools_items: HashMap>, } impl ToolRegistry { @@ -191,18 +197,19 @@ impl ToolRegistry { pub fn gateway_owned<'a>(&self, calls: &'a [FunctionToolCall]) -> Vec<&'a FunctionToolCall>; pub fn client_owned<'a>(&self, calls: &'a [FunctionToolCall]) -> Vec<&'a FunctionToolCall>; - /// Per-call dispatch: resolve the handler for one call and execute it. - /// Returns `None` when the tool has no registered handler. + /// Per-call dispatch retained for the Messages executor. pub async fn dispatch(&self, call: &FunctionToolCall) -> Option; + + pub(crate) fn mcp_list_tool_items(&self) -> impl Iterator; } ``` -> **Drift from proposal:** the executor now lives on the `ToolEntry` as -> `handler: Option>`, and per-call routing is a method -> on the registry — `dispatch()` — rather than free-standing `dispatch_tools` -> logic. The registry owns "resolve one call to its executor and run it"; the -> multi-turn loop (below) owns "how many rounds." See -> [Dispatch: two layers](#dispatch-two-layers). +> **Drift from proposal:** ownership is explicit on every entry. A gateway entry +> contains `Gateway(Option)`; the binding combines its executor +> and same-tool concurrency policy, while `None` represents a gateway-owned type +> without an implementation. Responses resolves bindings inside `GatewayRound`; +> `ToolRegistry::dispatch` remains the per-call path used by Messages. The registry +> also caches MCP list-tools history for lifecycle suppression. ### Loop Decision @@ -210,14 +217,14 @@ impl ToolRegistry { #[derive(Debug)] #[non_exhaustive] pub enum LoopDecision { - /// Gateway tools were dispatched this round; loop again with their outputs - /// appended to the conversation. + /// Gateway-owned calls were resolved this round; loop again with their + /// outputs appended to the conversation. Continue, /// No gateway work remains — the turn is final and the loop terminates. Done, - /// One or more calls are client-owned (plain `function` or Codex + /// One or more calls are client-owned (`function`, `custom`, or Codex /// `namespace` tools); hand the turn back to the caller to execute. RequiresClientAction, @@ -245,39 +252,48 @@ fn classify_round( > output lives on the payload, not the decision. `RequiresAction` was renamed > `RequiresClientAction` to name *who* acts. -### Dispatch: two layers +### Routing and orchestration layers -The original sketch had a single `dispatch_tools`. As built, dispatch is two -composable layers with a clean seam: +The original sketch had a single `dispatch_tools`. As built, registry ownership, +round execution, and loop control have separate responsibilities: ```mermaid graph LR - subgraph L2["Layer 2 — multi-turn orchestration (executor/gateway.rs, #83)"] + subgraph L2["Multi-round orchestration (executor/engine.rs, #83)"] CR["classify_round → LoopDecision"] LOOP["run_until_gateway_tools_complete
loops until Done / RequiresClientAction / Incomplete"] end - subgraph L1["Layer 1 — per-call dispatch (tool/registry.rs, #82)"] - DISP["ToolRegistry::dispatch(call)
resolve handler → execute → GatewayDispatchResult"] + subgraph ROUND["Responses round execution (executor/gateway.rs, #181)"] + EXEC["GatewayRound::execute
bounded fan-out + ordered results"] + end + subgraph L1["Request-scoped routing (tool/registry.rs + tool/ownership.rs)"] + DISP["ToolEntry::ownership
Client or Gateway(binding)"] end + LOOP --> EXEC --> DISP LOOP --> CR - LOOP -->|"for each gateway-owned call this round"| DISP style L2 fill:#2a4a8a,color:#e0e0e0 + style ROUND fill:#2a4a8a,color:#e0e0e0 style L1 fill:#1a5c2a,color:#e0e0e0 style CR fill:#2a4a8a,color:#e0e0e0 style LOOP fill:#2a4a8a,color:#e0e0e0 + style EXEC fill:#2a4a8a,color:#e0e0e0 style DISP fill:#1a5c2a,color:#e0e0e0 ``` -- **Layer 1 — per-call (`ToolRegistry::dispatch`, #82):** resolves one - `function_call` to its `handler` and runs it. Knows nothing about rounds. -- **Layer 2 — multi-turn (`classify_round` + the loop, #83):** decides whether +- **Routing (`ToolRegistry` + `ToolOwnership`):** maps each model-visible name + to client ownership or an optional gateway binding. It also retains effective + declaration metadata and MCP list-tools history for the request. +- **Round execution (`GatewayRound`):** resolves all gateway-owned calls, executes + them through the configured sliding window and per-binding same-tool policy, + and collects results in model call order. +- **Multi-round orchestration (`classify_round` + the loop):** decides whether the turn continues, is done, hands back to the client, or exhausts the round - budget. Calls Layer 1 for each gateway-owned call, then re-infers. + budget, then re-infers when gateway results require another round. -This split is what lets Codex's client-owned path and gateway execution share -one loop vocabulary instead of forking. It is the subject of a proposed -layering ADR (see [Future Work](#future-work)). +`ToolRegistry::dispatch` is still used by the Messages path; Responses resolves +the same binding directly so `GatewayRound` can apply concurrency, timeout, and +public-lifecycle hooks together. --- @@ -285,8 +301,9 @@ layering ADR (see [Future Work](#future-work)). The proposal had one fat `ToolHandler` trait carrying `execute()`. As built the trait is **split in two**, because `execute()` only applies to gateway-owned -tools — a `function` or `codex namespace` handler has no server-side execution, -so putting `execute()` on the shared trait would be a lie for those types. +tools — a `function`, `custom`, or Codex namespace handler has no server-side +execution, so putting `execute()` on the shared trait would be a lie for those +types. ```rust // Every tool type implements this — parse/validate/normalize only. @@ -307,37 +324,48 @@ pub trait GatewayExecutor: ToolHandler + 'static { arguments: &str, config: &Value, ) -> Pin> + Send + '_>>; + + fn supports_parallel_execution(&self) -> bool { false } + fn started_output(&self, call: &FunctionToolCall) -> Option { None } + fn public_output( + &self, + call: &FunctionToolCall, + output: &ToolOutput, + status: GatewayCallStatus, + ) -> Option { None } } ``` Adding a gateway tool type = implement both traits + register. A client-owned -type (like `CodexNamespace`) implements only `ToolHandler`. No changes to the -executor loop, accumulator, or streaming path. +type (like `CodexNamespace`) implements only `ToolHandler`. Registration wraps a +gateway executor in `GatewayBinding`, including a same-tool semaphore when the +handler does not opt into parallel execution. Lifecycle shaping remains handler-owned +through `started_output` and `public_output`. > **Drift from proposal:** (1) trait split `ToolHandler` / `GatewayExecutor`; > (2) `Pin>` instead of `#[async_trait]`, for `dyn` > compatibility behind `Arc`; (3) `discover()` and the `event_prefix()` / -> `output_item_type()` convenience hooks did not ship on the trait — SSE -> emission is handled in the gateway layer keyed on `tool_type`, and MCP +> `output_item_type()` convenience hooks did not ship on the trait. SSE MCP > discovery lives in the MCP handler rather than a generic trait method. +> Lifecycle sequencing is handled by the gateway layer, while the handler shapes +> its started and completed public output items. --- ## Per-Type Behavior -| Stage | `function` | `codex namespace` | `mcp` | `web_search` | `file_search` | `code_interpreter` | -|-------|-----------|-------------------|-------|-------------|--------------|-------------------| -| Validate | name required | member names required | server_url required | (none) | vector_store_ids required | (none) | -| Discover | no-op | no-op | `tools/list` on server | no-op | no-op | no-op | -| Normalize | passthrough | flatten members → `FunctionTool` (`ns__member`) | McpToolDef → FunctionTool | synthetic `web_search(query)` | synthetic `file_search(query)` | synthetic `code_interpreter(code)` | -| Route | → client | → client (restore `{ns, name}`) | → gateway | → gateway | → gateway | → gateway | -| Execute | N/A | N/A | JSON-RPC `tools/call` | HTTP search API | vector store query | sandboxed container | -| SSE events | `function_call_arguments.*` | `function_call_arguments.*` | `mcp_call.*` | `web_search_call.*` (2) | `file_search_call.*` | `code_interpreter_call.*` | -| Response status | `requires_action` | `requires_action` | `completed` | `completed` | `completed` | `completed` | +| Stage | `function` | `custom` | `codex namespace` | `mcp` | `web_search` | `file_search` | `code_interpreter` | +|-------|------------|----------|-------------------|-------|--------------|---------------|--------------------| +| Validate | name required | name and supported format | member names required | server identity, policy, and allowed tools | typed configuration | vector_store_ids required | typed configuration | +| Discover | no-op | no-op | no-op | `tools/list` on server | no-op | no-op | no-op | +| Normalize | passthrough | freeform input → function parameter | flatten members → `FunctionTool` | discovered schema → `FunctionTool` | synthetic `web_search(query)` | omitted (not implemented) | omitted (not implemented) | +| Route | → client | → client (restore custom shape) | → client (restore `{namespace, name}`) | → gateway binding | → gateway binding | → gateway without binding | → gateway without binding | +| Execute | N/A | N/A | N/A | JSON-RPC `tools/call` | HTTP search API | error tool result if called | error tool result if called | +| SSE events | upstream function-call lifecycle | restored custom-call lifecycle | restored namespace call lifecycle | gateway-generated `mcp_call.*` | gateway-generated `web_search_call.*` | none | none | +| Call handling | returned to client | returned to client | returned to client | gateway executes | gateway executes | error tool result (no handler yet) | error tool result (no handler yet) | -`codex namespace` and `web_search` are the two ends actually shipping today -(`#84` and `#85`); `mcp` is in review (`#89`); `file_search` / `code_interpreter` -are declared `ToolType`s without handlers yet. +`codex namespace`, `web_search`, and `mcp` ship today; `file_search` / +`code_interpreter` are declared gateway-owned `ToolType`s without executors yet. --- @@ -364,55 +392,54 @@ Request: **Iteration 2:** Model calls `query_papers("topic=RLHF")` → gateway executes via JSON-RPC → loop back -**Iteration 3:** Model calls `run_shell("python import.py")` → registry lookup → `Function` → **client-owned** → response returns `status: "requires_action"` +**Iteration 3:** Model calls `run_shell("python import.py")` → registry lookup → `Function` → **client-owned** → response returns the unresolved function call Client executes locally, submits `function_call_output`, inference continues. > Note: a mixed turn (a gateway *and* a client call in the same model output) > does not need an extra iteration. The gateway call executes and its output is -> recorded, and because a client-owned call is present the turn still returns -> `requires_action` in that same round — see the `classify_round` precedence +> recorded, and because a client-owned call is present the turn returns that +> unresolved call in the same round — see the `classify_round` precedence > under [Loop Decision](#loop-decision). --- ## Implementation Status -The proposal's PR plan (A–E) shipped, reorganized around the merged registry -and the two-layer dispatch model. Actual PRs: +The proposal's PR plan (A–E) shipped, reorganized around the merged registry, +explicit ownership, Responses round execution, and loop control. Actual PRs: | Area | PR(s) | Status | |------|-------|--------| | Tool types + registry + `ToolHandler` trait + `FunctionHandler` + normalize | **#80** | ✅ merged | -| Handler-in-`ToolEntry` + per-call `ToolRegistry::dispatch()` (MCP gateway design) | **#82** | ✅ merged | +| Explicit `ToolOwnership`/`GatewayBinding` in `ToolEntry` + registry routing | **#82**, current gateway-round work | ✅ merged | | `web_search` gateway tool (first `GatewayExecutor`) | **#85** | ✅ merged | | Codex integration → `CodexNamespace` client-owned type + flatten/restore | **#84** | ✅ merged | | Codex namespace invariant tightening (collision reject) | **#91** | ✅ merged | -| Multi-turn loop: `classify_round` + `LoopDecision` (Layer 2) | **#83** | 🔄 in review | -| Remote MCP gateway (`read_resource`, `tools/call`) | **#89** | 🔄 in review | +| Bounded parallel Responses gateway rounds + per-handler same-tool safety | **#181** | ✅ implemented | +| Multi-turn loop: `classify_round` + `LoopDecision` | **#83** | ✅ implemented | +| Remote MCP gateway (`read_resource`, `tools/call`) | **#89** | ✅ implemented | | `file_search`, `code_interpreter` handlers | — | declared `ToolType`, no handler yet | -The trait split, `Pin` async, `CodexNamespace`, the two-layer dispatch, and -the four-variant `LoopDecision` are the substantive divergences from this doc's -original sketch — each is annotated inline above. +The trait split, `Pin` async, `CodexNamespace`, explicit ownership and round +execution, and the four-variant `LoopDecision` are the substantive divergences +from this doc's original sketch — each is annotated inline above. ## Future Work -- **Layering ADR.** Promote the two-layer dispatch (per-call `registry.dispatch` - + multi-turn `LoopDecision`) from an implementation detail to a recorded - decision, so later APIs (Messages, Interactions) reuse the same loop instead - of forking. Gated on #83 landing so the ADR describes shipped code. +- **Layering ADR.** Record the relationship between request-scoped ownership, + Responses `GatewayRound`, the Messages per-call dispatch path, and multi-round + `LoopDecision`, so later APIs reuse the same primitives instead of forking. - **`GatewayAccumulator` (streaming).** Today the "hide gateway-owned calls, emit the synthetic public frame" logic exists twice — once for blocking (`public_output_items`) and once for streaming (`emit_gateway_*_events`). A `GatewayAccumulator` stage (Raw → Gateway → Public, mirroring `ResponseAccumulator`) would classify once and let both paths consume it. - Concrete once #89 lands the second gateway frame type. -- **Per-tool-type execution config.** `GATEWAY_TOOL_TIMEOUT` and the concurrency - window are file-private consts today. When tool types with materially - different latency profiles land (an MCP resource fetch vs. a web search), the - existing `execute_gateway_call_with_timeout(timeout)` seam makes promoting - them to per-type config additive. +- **Per-tool-type execution config.** The process-wide concurrency window is + configurable through `tools.max_concurrent_gateway_calls`, while + `GATEWAY_TOOL_TIMEOUT` remains a shared 60-second per-call constant. Tool types + with materially different latency profiles may eventually need individual + timeout policies. - **`file_search` / `code_interpreter` handlers.** Both are declared `ToolType`s awaiting `GatewayExecutor` impls. @@ -425,26 +452,27 @@ original sketch — each is annotated inline above. | D1 | Registry-based routing | Name prefixes leak implementation into the model's tool namespace. Registry is invisible to inference. | | D2 | Request-scoped registry | Different requests may target different MCP servers. Global state would require sync and conflict resolution. | | D3 | `function` never gateway-executed | Matches OpenAI spec. Enables agent clients (Codex, etc.) that own their tool implementations. "No client delegation" means the gateway doesn't punt *its* work — not that function tools can't exist. | -| D4 | Mixed turns resolved by `classify_round` precedence, not a `ContinuePartial` variant | The proposal added `ContinuePartial` for turns with both gateway and client calls. As built, `classify_round` gives client-owned calls precedence: the gateway calls still execute and their outputs are recorded, and the turn returns `RequiresClientAction` in one round. Fewer variants, no payloads on the decision, same behavior. | -| D5 | MCP transport | The proposal called for a stateless client (fresh connection per request). #89 introduces a connection pool keyed on `server_url`; see that PR for the current stance. | +| D4 | Mixed turns resolved by `classify_round` precedence, not a `ContinuePartial` variant | The proposal added `ContinuePartial` for turns with both gateway and client calls. As built, `classify_round` gives client-owned calls precedence: gateway calls still execute and their outputs are recorded, and the internal decision returns `RequiresClientAction` in one round. Fewer variants, no payloads on the decision, same behavior. | +| D5 | MCP transport | The proposal called for a stateless client (fresh connection per request). The shipped MCP integration pools clients and discovered handlers for configured servers rather than reconnecting on every call. | | D6 | `ResponsesTool` uses `#[serde(tag = "type")]` | Wire-compatible with existing `{"type":"function",...}` — no client migration needed. | -| D7 | `ToolHandler` split into `ToolHandler` + `GatewayExecutor` | `execute()` only applies to gateway-owned types; keeping it on the shared trait would force `function`/`codex namespace` handlers to implement a method they can never honor. The `GatewayExecutor: ToolHandler` supertrait keeps the contract honest and is `dyn`-stored as `Arc`. | +| D7 | `ToolHandler` split into `ToolHandler` + `GatewayExecutor` | `execute()` only applies to gateway-owned types; keeping it on the shared trait would force `function`/`custom`/Codex namespace handlers to implement a method they can never honor. The `GatewayExecutor: ToolHandler` supertrait keeps the contract honest and is `dyn`-stored as `Arc`. | +| D8 | Parallelism is bounded globally and constrained per tool name | `GatewayRound` uses a configurable sliding window. A handler's conservative default serializes calls to that same model-visible name, while different tools can still overlap; handlers such as MCP and web search explicitly opt into same-tool overlap. | --- ## Alternatives Considered for `function` Tool Handling -Decision D3 (`function` is never gateway-executed, returns `requires_action`) is the most debatable choice. Here are the alternatives we evaluated: +Decision D3 (`function` is never gateway-executed and is returned for client execution) is the most debatable choice. Here are the alternatives we evaluated: | # | Alternative | Behavior | Why rejected | |---|-------------|----------|--------------| | A | **Reject function tools entirely** | Validate at parse time — if `type: "function"` is present, return 400. Force clients to back all tools with MCP servers. | Breaks OpenAI spec compatibility. Prevents agent clients (Codex, Claude Code) from using their natural pattern. Unnecessarily opinionated. | | B | **Ignore + warn** | Accept `function` tools, normalize to vLLM, but if model calls one: drop the call silently, log a warning, and continue inference without it. | Silent data loss. Model asked for a tool result and gets nothing — produces hallucinated or degraded responses. Violates least-surprise. | -| C | **Search MCP servers for matching name** | When model calls a `function` tool, check if any registered MCP server happens to expose a tool with that name. If found, execute via MCP. If not, fall back to `requires_action`. | Spooky action at a distance. Client declares `type: "function"` expecting to own execution, but gateway silently intercepts it if an MCP server has a name collision. Also adds latency (extra `tools/list` queries). | -| D | **Gateway-execute all (require registered executor)** | Every `function` tool must have a backing executor configured in gateway config. No `requires_action` at all. | Requires operators to pre-configure every tool. Impossible for dynamic agent clients that generate tool definitions at runtime. Breaks the most common agentic pattern. | +| C | **Search MCP servers for matching name** | When model calls a `function` tool, check if any registered MCP server happens to expose a tool with that name. If found, execute via MCP. If not, return it for client execution. | Spooky action at a distance. Client declares `type: "function"` expecting to own execution, but gateway silently intercepts it if an MCP server has a name collision. Also adds latency (extra `tools/list` queries). | +| D | **Gateway-execute all (require registered executor)** | Every `function` tool must have a backing executor configured in gateway config. No client handoff at all. | Requires operators to pre-configure every tool. Impossible for dynamic agent clients that generate tool definitions at runtime. Breaks the most common agentic pattern. | | E | **Configurable per-request** | Add a field like `function_execution: "client" \| "gateway"` to let the client choose. | Over-engineering for MVP. Adds complexity to every code path. If a real use case emerges, we can add it later without breaking the default. | -**Chosen: passthrough with `requires_action`** — matches OpenAI spec exactly, zero surprise for clients, and cleanly separates "tools the gateway owns" from "tools the client owns" based solely on the `type` field the client already provides. +**Chosen: return client-owned calls unchanged** — preserves OpenAI-compatible function-call behavior, avoids surprise for clients, and cleanly separates tools the gateway owns from tools the client owns based on the declared type and registry ownership. --- @@ -455,7 +483,7 @@ Several of these were resolved as the framework shipped; resolutions noted. | # | Question | Resolution | |---|----------|-----------| | Q1 | What if a discovered/namespaced tool name collides with another declared tool? | **Partially resolved (#91):** a Codex-namespace member that would flatten onto an already-declared name is a hard `ToolError` at registry-build time (`resolve_namespace_members`). Plain duplicate `function` names (and duplicate namespace *members*) remain last-write-wins with a `warn!` log — not a hard error. Tightening the plain-duplicate case is open. | -| Q2 | How does a mixed gateway+client turn look to the streaming client? | **Resolved (#83):** gateway tool events stream in real time during the round; the turn then ends `requires_action` in that same round (client-owned precedence in `classify_round`). No `ContinuePartial`. | +| Q2 | How does a mixed gateway+client turn look to the streaming client? | **Resolved (#83):** gateway tool events stream in output order during the round; the response returns the unresolved client-owned calls in that same round (`RequiresClientAction` precedence in `classify_round`). No `ContinuePartial`. | | Q3 | Should `tool_choice: {function: {name: "x"}}` work for discovered/namespaced tools? | **Resolved (#84/#91):** yes. vLLM sees all normalized functions; a forced namespaced name resolves through the namespace map. `tool_choice` names are validated as non-empty. | | Q4 | Should `prepare_tools` be a Praxis filter or part of `execute_loop`? | **As built:** part of the core loop (`run_until_gateway_tools_complete`), not a per-stage Praxis filter. Praxis wraps the whole loop (ADR-03). | -| Q5 | Should the two-layer dispatch model be recorded as an ADR? | **Open** — proposed, gated on #83. See [Future Work](#future-work). | +| Q5 | Should the routing, round-execution, and loop-control layers be recorded as an ADR? | **Open.** The implementation has shipped; the standalone architecture decision is still worth recording. See [Future Work](#future-work). | diff --git a/docs/guides/harness-cli-testing.md b/docs/guides/harness-cli-testing.md index ff7bbe07..e2282807 100644 --- a/docs/guides/harness-cli-testing.md +++ b/docs/guides/harness-cli-testing.md @@ -127,7 +127,8 @@ curl -s -w '\nHTTP %{http_code}\n' -H 'content-type: application/json' http://12 | Gateway build | Result | |---|---| | Before PR #197 | `HTTP 400` — `invalid tool config: parallel_tool_calls must be false when using built-in tools` | -| PR #197 or later | `HTTP 200`, `"status": "completed"`; the gateway forwards `parallel_tool_calls: false` upstream and serializes tool calls | +| PR #197 through pre-#181 | `HTTP 200`, `"status": "completed"`; the gateway forwarded `parallel_tool_calls: false` upstream regardless of the request, serializing tool calls | +| #181 or later | `HTTP 200`, `"status": "completed"`; the gateway forwards `parallel_tool_calls: true` upstream as requested, then executes emitted gateway-owned calls through its configured concurrency window and per-handler same-tool safety policy | Also run the mixed shape (a `function` tool plus a built-in such as `code_interpreter`) with `parallel_tool_calls: true`; it must return `HTTP 200` as well. Unit coverage lives in @@ -209,8 +210,7 @@ kubectl --namespace agentic-api logs deploy/agentic-api --all-pods --since=10m | Match the log level rather than the word `error`: Codex closes its WebSocket without a closing handshake when `exec` finishes, which the gateway logs as a `WARN ... WebSocket protocol error: Connection reset without closing -handshake` line per run. That line and the startup `WARN ... parallel tool calls are not supported` notice are -expected; anything at `ERROR` level is not. +handshake` line per run. That line is expected; anything at `ERROR` level is not. ## Troubleshooting From 8ab1dc75a33a8147e48e5e2ad6a8c90e900da037 Mon Sep 17 00:00:00 2001 From: maral Date: Thu, 27 Aug 2026 21:28:18 +0800 Subject: [PATCH 2/2] fix tests Signed-off-by: maral --- .../src/executor/compaction.rs | 3 +-- .../agentic-server-core/src/executor/engine.rs | 17 +++++++++++------ .../agentic-server-core/src/executor/gateway.rs | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/crates/agentic-server-core/src/executor/compaction.rs b/crates/agentic-server-core/src/executor/compaction.rs index 39b8b421..a87382f7 100644 --- a/crates/agentic-server-core/src/executor/compaction.rs +++ b/crates/agentic-server-core/src/executor/compaction.rs @@ -95,8 +95,7 @@ fn item_has_meaningful_context(item: &InputItem) -> bool { || reasoning.encrypted_content.as_ref().is_some_and(value_has_content) } InputItem::Compaction(compaction) => !compaction.encrypted_content.trim().is_empty(), - InputItem::McpListTools(_) => false, - InputItem::CompactionTrigger | InputItem::Unknown => false, + InputItem::McpListTools(_) | InputItem::CompactionTrigger | InputItem::Unknown => false, } } diff --git a/crates/agentic-server-core/src/executor/engine.rs b/crates/agentic-server-core/src/executor/engine.rs index 182e7dd5..8ea529f9 100644 --- a/crates/agentic-server-core/src/executor/engine.rs +++ b/crates/agentic-server-core/src/executor/engine.rs @@ -159,6 +159,16 @@ async fn run_until_gateway_tools_complete( run_gateway_tool_loop(ctx, exec_ctx, auth, stream_upstream, stream).await } +async fn build_tool_registry(ctx: &mut RequestContext, exec_ctx: &ExecutionContext) -> ExecutorResult { + let mut executors = exec_ctx.gateway_executors.request_scoped(); + let mut registry: ToolRegistry = match ctx.enriched_request.tools.as_mut() { + Some(tools) => ToolRegistry::build_with_handlers(tools, &mut executors).await?, + None => ToolRegistry::default(), + }; + registry.cache_listed_mcp_tools(&ctx.enriched_request.input); + Ok(registry) +} + async fn run_gateway_tool_loop( mut ctx: RequestContext, exec_ctx: &ExecutionContext, @@ -166,12 +176,7 @@ async fn run_gateway_tool_loop( stream_upstream: bool, mut stream: Option<(&mut GatewayStreamAccumulator, &mpsc::UnboundedSender)>, ) -> ExecutorResult<(ResponsePayload, RequestContext)> { - let mut executors = exec_ctx.gateway_executors.request_scoped(); - let mut registry: ToolRegistry = match ctx.enriched_request.tools.as_mut() { - Some(tools) => ToolRegistry::build_with_handlers(tools, &mut executors).await?, - None => ToolRegistry::default(), - }; - registry.cache_listed_mcp_tools(&ctx.enriched_request.input); + let mut registry = build_tool_registry(&mut ctx, exec_ctx).await?; let mut combined_output: Vec = registry .mcp_list_tool_items() .map(mcp::handler::list_tools_output_item) diff --git a/crates/agentic-server-core/src/executor/gateway.rs b/crates/agentic-server-core/src/executor/gateway.rs index 246e0f93..eadd1d18 100644 --- a/crates/agentic-server-core/src/executor/gateway.rs +++ b/crates/agentic-server-core/src/executor/gateway.rs @@ -546,7 +546,7 @@ pub(super) fn append_input_item(input: &mut ResponsesInput, item: InputItem) { } pub(super) fn append_output_items_to_input(input: &mut ResponsesInput, output_items: &[OutputItem]) { - for input_item in output_items.iter().flat_map(OutputItem::to_input_item) { + for input_item in output_items.iter().filter_map(OutputItem::to_input_item) { append_input_item(input, input_item); } }