From dd35fbc2f4ca94dd4ff564a74ae2fb888bf64d8f Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 28 Oct 2026 14:52:22 -0500 Subject: [PATCH] feat(ai): Responses routes for OpenRouter, DigitalOcean and Venice (#59991) --- packages/ai/README.md | 6 +- packages/ai/package.json | 3 + packages/ai/src/providers/digitalocean.ts | 36 ++++++-- .../src/providers/digitalocean/responses.ts | 4 + packages/ai/src/providers/openrouter.ts | 45 ++++++---- .../ai/src/providers/openrouter/responses.ts | 4 + packages/ai/src/providers/venice.ts | 67 +++++++++----- packages/ai/src/providers/venice/responses.ts | 4 + .../calls-a-freeform-text-tool.json | 35 ++++++++ .../continues-a-tool-call.json | 53 +++++++++++ .../digitalocean-responses/streams-text.json | 35 ++++++++ .../calls-a-freeform-text-tool.json | 35 ++++++++ .../continues-a-tool-call.json | 53 +++++++++++ .../openrouter-responses/streams-text.json | 35 ++++++++ .../calls-a-freeform-text-tool.json | 35 ++++++++ .../continues-a-tool-call.json | 53 +++++++++++ .../venice-responses/streams-text.json | 35 ++++++++ packages/ai/test/provider-package.test.ts | 31 +++++++ .../ai/test/provider/freeform-tools.test.ts | 5 ++ .../responses-routes.recorded.test.ts | 90 +++++++++++++++++++ packages/core/src/provider.ts | 3 + packages/core/src/variant.ts | 3 + 22 files changed, 623 insertions(+), 47 deletions(-) create mode 100644 packages/ai/src/providers/digitalocean/responses.ts create mode 100644 packages/ai/src/providers/openrouter/responses.ts create mode 100644 packages/ai/src/providers/venice/responses.ts create mode 100644 packages/ai/test/fixtures/recordings/digitalocean-responses/calls-a-freeform-text-tool.json create mode 100644 packages/ai/test/fixtures/recordings/digitalocean-responses/continues-a-tool-call.json create mode 100644 packages/ai/test/fixtures/recordings/digitalocean-responses/streams-text.json create mode 100644 packages/ai/test/fixtures/recordings/openrouter-responses/calls-a-freeform-text-tool.json create mode 100644 packages/ai/test/fixtures/recordings/openrouter-responses/continues-a-tool-call.json create mode 100644 packages/ai/test/fixtures/recordings/openrouter-responses/streams-text.json create mode 100644 packages/ai/test/fixtures/recordings/venice-responses/calls-a-freeform-text-tool.json create mode 100644 packages/ai/test/fixtures/recordings/venice-responses/continues-a-tool-call.json create mode 100644 packages/ai/test/fixtures/recordings/venice-responses/streams-text.json create mode 100644 packages/ai/test/provider/responses-routes.recorded.test.ts diff --git a/packages/ai/README.md b/packages/ai/README.md index f7ae791fa028..3277fa73f7b0 100644 --- a/packages/ai/README.md +++ b/packages/ai/README.md @@ -206,7 +206,7 @@ const everything = AIClient.layerWith(logged) // or AI.make({ layer: logged }) ## Venice AI `Venice` provides native Chat Completions with streaming tools and reasoning. `model` and `chat` -select the same API; credentials default to `VENICE_API_KEY`. +select the same API, and `responses` selects its Responses API; credentials default to `VENICE_API_KEY`. ```ts import { LLM } from "@opencode/ai/effect" @@ -235,8 +235,8 @@ signatures, including per-tool signatures. Venice's encrypted scalar trailers ar reasoning but retained in provider metadata for replay. Cache affinity uses `promptCacheKey`, and cache-write usage reads Venice's `cache_creation_input_tokens` field. -The native package entrypoint is `@opencode/ai/providers/venice`. Image generation, embeddings, Responses, and -client-side E2EE are not implemented by this provider. +The native package entrypoints are `@opencode/ai/providers/venice` and `@opencode/ai/providers/venice/responses`. +Image generation, embeddings, and client-side E2EE are not implemented by this provider. ## Decisions diff --git a/packages/ai/package.json b/packages/ai/package.json index 63815a853648..d3576be7acd2 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -57,6 +57,7 @@ "./providers/digitalocean": "./src/providers/digitalocean.ts", "./providers/digitalocean/decisions": "./src/providers/digitalocean/decisions.ts", "./providers/digitalocean/images": "./src/providers/digitalocean/images.ts", + "./providers/digitalocean/responses": "./src/providers/digitalocean/responses.ts", "./providers/elevenlabs": "./src/providers/elevenlabs.ts", "./providers/fal": "./src/providers/fal.ts", "./providers/fireworks": "./src/providers/fireworks.ts", @@ -100,6 +101,7 @@ "./providers/openrouter": "./src/providers/openrouter.ts", "./providers/openrouter/decisions": "./src/providers/openrouter/decisions.ts", "./providers/openrouter/images": "./src/providers/openrouter/images.ts", + "./providers/openrouter/responses": "./src/providers/openrouter/responses.ts", "./providers/replicate": "./src/providers/replicate.ts", "./providers/runway": "./src/providers/runway.ts", "./providers/stability": "./src/providers/stability.ts", @@ -107,6 +109,7 @@ "./providers/typesafe-ai": "./src/providers/typesafe-ai.ts", "./providers/typesafe-ai/decisions": "./src/providers/typesafe-ai/decisions.ts", "./providers/venice": "./src/providers/venice.ts", + "./providers/venice/responses": "./src/providers/venice/responses.ts", "./providers/vercel-ai-gateway": "./src/providers/vercel-ai-gateway.ts", "./providers/vercel-ai-gateway/chat": "./src/providers/vercel-ai-gateway/chat.ts", "./providers/vercel-ai-gateway/decisions": "./src/providers/vercel-ai-gateway/decisions.ts", diff --git a/packages/ai/src/providers/digitalocean.ts b/packages/ai/src/providers/digitalocean.ts index 91f2bd24bca4..5905a28bb0ac 100644 --- a/packages/ai/src/providers/digitalocean.ts +++ b/packages/ai/src/providers/digitalocean.ts @@ -1,6 +1,7 @@ import type { ProviderPackage } from "../provider-package.js" import { OpenAIChat } from "../protocols/openai-chat.js" import { OpenAIImages } from "../protocols/openai-images.js" +import { OpenResponses } from "../protocols/open-responses.js" import { SystemOne } from "../protocols/system-one.js" import { cacheControl } from "../protocols/utils/cache.js" import { AuthOptions, type ProviderAuthOption } from "../route/auth-options.js" @@ -10,6 +11,7 @@ import { MediaRoute } from "../route/media.js" import { Protocol } from "../route/protocol.js" import { ProviderID, type ModelID, type ProviderOptions } from "../schema/index.js" import type { OpenAIProviderOptionsInput } from "./openai-options.js" +import type { OpenResponsesProviderOptionsInput } from "./open-responses-options.js" export const id = ProviderID.make("digitalocean") const baseURL = "https://inference.do-ai.run/v1" @@ -17,10 +19,11 @@ const baseURL = "https://inference.do-ai.run/v1" export type Config = Omit & ProviderAuthOption<"optional"> & { readonly baseURL?: string - readonly providerOptions?: OpenAIProviderOptionsInput + readonly providerOptions?: OpenAIProviderOptionsInput | OpenResponsesProviderOptionsInput } -export type Settings = ProviderPackage.Settings & OpenAIProviderOptionsInput & { readonly apiKey?: string } +export type Settings = ProviderPackage.Settings & + Options & { readonly apiKey?: string } export const protocol = Protocol.make({ id: "digitalocean-chat", @@ -40,16 +43,24 @@ export const route = Route.make({ framing: OpenAIChat.framing, }) -export const routes = [route] +const responsesRoute = Route.make({ + id: "digitalocean-responses", + provider: id, + providerMetadataKey: "digitalocean", + protocol: OpenResponses.protocol, + endpoint: Endpoint.path("/responses", { baseURL }), + transport: OpenResponses.httpTransport, + defaults: { providerOptions: { store: false, include: ["reasoning.encrypted_content"] } }, +}) + +export const routes = [route, responsesRoute] export const configure = (input: Config = {}) => { const { apiKey: _apiKey, auth: _auth, baseURL: endpoint, ...defaults } = input const auth = AuthOptions.bearer(input, ["DIGITALOCEAN_ACCESS_TOKEN", "DIGITALOCEAN_API_KEY", "DO_INFERENCE_API_KEY"]) - const configured = route.with({ - ...defaults, - endpoint: { baseURL: endpoint ?? baseURL }, - auth, - }) + const options = { ...defaults, endpoint: { baseURL: endpoint ?? baseURL }, auth } + const configured = route.with(options) + const configuredResponses = responsesRoute.with(options) const decisionRoute = SystemOne.route.with({ provider: id, providerMetadataKey: "digitalocean", @@ -73,6 +84,8 @@ export const configure = (input: Config = {}) => { supportsPromptCacheKey: true, }, }), + responses: (modelID: string | ModelID) => + configuredResponses.model({ id: modelID }), image, decision, configure, @@ -82,9 +95,14 @@ export const configure = (input: Config = {}) => { export const provider = configure() export const decision = provider.decision export const image = provider.image +export const responses = provider.responses export const model: ProviderPackage.Model = (modelID, settings) => configure(config(settings)).model(modelID) +export const responsesModel: ProviderPackage.Model< + Settings, + OpenResponsesProviderOptionsInput +> = (modelID, settings) => configure(config(settings)).responses(modelID) export const imageModel = (modelID: string, settings?: Settings) => { const input = config(settings) return configure(input).image(modelID, input.providerOptions) @@ -94,7 +112,7 @@ export const decisionModel = (modelID: string, settings?: Settings) => { return configure(input).decision(modelID, input.providerOptions) } -function config({ apiKey, baseURL, body, headers, ...providerOptions }: Settings = {}) { +function config({ apiKey, baseURL, body, headers, ...providerOptions }: Settings = {}) { return { apiKey, baseURL, diff --git a/packages/ai/src/providers/digitalocean/responses.ts b/packages/ai/src/providers/digitalocean/responses.ts new file mode 100644 index 000000000000..16900e8e5cef --- /dev/null +++ b/packages/ai/src/providers/digitalocean/responses.ts @@ -0,0 +1,4 @@ +import type { OpenResponsesProviderOptionsInput } from "../open-responses-options.js" +import type { DigitalOcean } from "../digitalocean.js" +export { responsesModel as model } from "../digitalocean.js" +export type Settings = DigitalOcean.Settings diff --git a/packages/ai/src/providers/openrouter.ts b/packages/ai/src/providers/openrouter.ts index 2b9d9174914c..7ea472066542 100644 --- a/packages/ai/src/providers/openrouter.ts +++ b/packages/ai/src/providers/openrouter.ts @@ -9,8 +9,10 @@ import { SystemOne } from "../protocols/system-one.js" import { OpenAIImages } from "../protocols/openai-images.js" import { MediaRoute } from "../route/media.js" import { OpenAIChat } from "../protocols/openai-chat.js" +import { OpenResponses } from "../protocols/open-responses.js" import { cacheControl } from "../protocols/utils/cache.js" import { isRecord, JsonObject, lenient, ProviderShared } from "../protocols/shared.js" +import type { OpenResponsesProviderOptionsInput } from "./open-responses-options.js" export const id = ProviderID.make("openrouter") const baseURL = "https://openrouter.ai/api/v1" @@ -83,11 +85,11 @@ export interface OpenRouterDecisionOptions { export type Config = Omit & ProviderAuthOption<"optional"> & { readonly baseURL?: string - readonly providerOptions?: OpenRouterProviderOptionsInput + readonly providerOptions?: OpenRouterProviderOptionsInput | OpenResponsesProviderOptionsInput } -export type Settings = ProviderPackage.Settings & - OpenRouterProviderOptionsInput & { +export type Settings = ProviderPackage.Settings & + Options & { readonly apiKey?: string readonly baseURL?: string } @@ -183,20 +185,24 @@ export const route = Route.make({ framing: OpenAIChat.framing, }) -export const routes = [route] +const responsesRoute = Route.make({ + id: "openrouter-responses", + provider: id, + providerMetadataKey: "openrouter", + protocol: OpenResponses.protocol, + endpoint: Endpoint.path("/responses", { baseURL }), + transport: OpenResponses.httpTransport, + defaults: { providerOptions: { store: false, include: ["reasoning.encrypted_content"] } }, +}) -const configuredRoute = (input: Config) => { - const { apiKey: _, auth: _auth, baseURL: endpoint, ...rest } = input - return route.with({ - ...rest, - endpoint: { baseURL: endpoint ?? baseURL }, - auth: AuthOptions.bearer(input, "OPENROUTER_API_KEY"), - }) -} +export const routes = [route, responsesRoute] export const configure = (input: Config = {}) => { - const route = configuredRoute(input) + const { apiKey: _apiKey, auth: _auth, baseURL: endpoint, ...defaults } = input const auth = AuthOptions.bearer(input, "OPENROUTER_API_KEY") + const options = { ...defaults, endpoint: { baseURL: endpoint ?? baseURL }, auth } + const chatRoute = route.with(options) + const configuredResponses = responsesRoute.with(options) const decisionRoute = SystemOne.route.with({ provider: id, providerMetadataKey: "openrouter", @@ -217,7 +223,9 @@ export const configure = (input: Config = {}) => { return { id, model: (modelID: string | ModelID) => - route.model({ id: modelID, compatibility: { supportsPromptCacheKey: true } }), + chatRoute.model({ id: modelID, compatibility: { supportsPromptCacheKey: true } }), + responses: (modelID: string | ModelID) => + configuredResponses.model({ id: modelID }), image, decision, configure, @@ -227,8 +235,13 @@ export const configure = (input: Config = {}) => { export const provider = configure() export const decision = provider.decision export const image = provider.image +export const responses = provider.responses export const model: ProviderPackage.Model = (modelID, settings) => configure(config(settings)).model(modelID) +export const responsesModel: ProviderPackage.Model< + Settings, + OpenResponsesProviderOptionsInput +> = (modelID, settings) => configure(config(settings)).responses(modelID) export const imageModel = (modelID: string, settings?: Settings) => { const input = config(settings) return configure(input).image(modelID, input.providerOptions) @@ -238,7 +251,7 @@ export const decisionModel = (modelID: string, settings?: Settings) => { return configure(input).decision(modelID, input.providerOptions) } -function config({ apiKey, baseURL, body, headers, ...providerOptions }: Settings = {}) { +function config({ apiKey, baseURL, body, headers, ...providerOptions }: Settings = {}) { return { apiKey, baseURL, @@ -247,3 +260,5 @@ function config({ apiKey, baseURL, body, headers, ...providerOptions }: Settings providerOptions, } } + +export * as OpenRouter from "./openrouter.js" diff --git a/packages/ai/src/providers/openrouter/responses.ts b/packages/ai/src/providers/openrouter/responses.ts new file mode 100644 index 000000000000..34a9c7f2e13b --- /dev/null +++ b/packages/ai/src/providers/openrouter/responses.ts @@ -0,0 +1,4 @@ +import type { OpenResponsesProviderOptionsInput } from "../open-responses-options.js" +import type { OpenRouter } from "../openrouter.js" +export { responsesModel as model } from "../openrouter.js" +export type Settings = OpenRouter.Settings diff --git a/packages/ai/src/providers/venice.ts b/packages/ai/src/providers/venice.ts index a49a373eb68c..ecce69894b6d 100644 --- a/packages/ai/src/providers/venice.ts +++ b/packages/ai/src/providers/venice.ts @@ -1,10 +1,12 @@ import type { ProviderPackage } from "../provider-package.js" import { VeniceChat } from "../protocols/venice-chat.js" import { OpenAIChat } from "../protocols/openai-chat.js" +import { OpenResponses } from "../protocols/open-responses.js" import { AuthOptions, type ProviderAuthOption } from "../route/auth-options.js" import { Route, type RouteDefaultsInput } from "../route/client.js" import { Endpoint } from "../route/endpoint.js" import { ProviderID, type ModelID } from "../schema/index.js" +import type { OpenResponsesProviderOptionsInput } from "./open-responses-options.js" export const id = ProviderID.make("venice") export type ChatOptionsInput = VeniceChat.OptionsInput @@ -12,51 +14,76 @@ export type Config = Omit & ProviderAuthOption<"optional"> & { readonly baseURL?: string readonly queryParams?: Readonly> - readonly providerOptions?: ChatOptionsInput + readonly providerOptions?: ChatOptionsInput | OpenResponsesProviderOptionsInput } -export type Settings = ProviderPackage.Settings & - ChatOptionsInput & { +export type Settings = ProviderPackage.Settings & + Options & { readonly apiKey?: string readonly baseURL?: string readonly queryParams?: Readonly> } +const baseURL = "https://api.venice.ai/api/v1" + const route = Route.make({ id: "venice-chat", provider: id, providerMetadataKey: "venice", protocol: VeniceChat.protocol, - endpoint: Endpoint.path("/chat/completions", { baseURL: "https://api.venice.ai/api/v1" }), + endpoint: Endpoint.path("/chat/completions", { baseURL }), framing: OpenAIChat.framing, }) -export const routes = [route] +const responsesRoute = Route.make({ + id: "venice-responses", + provider: id, + providerMetadataKey: "venice", + protocol: OpenResponses.protocol, + endpoint: Endpoint.path("/responses", { baseURL }), + transport: OpenResponses.httpTransport, + defaults: { providerOptions: { store: false, include: ["reasoning.encrypted_content"] } }, +}) +export const routes = [route, responsesRoute] export const configure = (input: Config = {}) => { - const { apiKey: _apiKey, auth: _auth, baseURL, queryParams, ...rest } = input + const { apiKey: _apiKey, auth: _auth, baseURL: endpoint, queryParams, ...rest } = input + const options = { + ...rest, + endpoint: { baseURL: endpoint ?? baseURL, query: queryParams }, + auth: AuthOptions.bearer(input, "VENICE_API_KEY"), + } const chat = (modelID: string | ModelID) => - route - .with({ - ...rest, - endpoint: { baseURL: baseURL ?? route.endpoint.baseURL, query: queryParams }, - auth: AuthOptions.bearer(input, "VENICE_API_KEY"), - }) - .model({ id: modelID, compatibility: VeniceChat.compatibility }) - return { id, model: chat, chat, configure } + route.with(options).model({ id: modelID, compatibility: VeniceChat.compatibility }) + const responses = (modelID: string | ModelID) => + responsesRoute.with(options).model({ id: modelID }) + return { id, model: chat, chat, responses, configure } } export const provider = configure() export const chat = provider.chat -export const model: ProviderPackage.Model = ( - modelID, - { apiKey, baseURL, queryParams, body, headers, ...providerOptions }: Settings = {}, -) => - configure({ +export const responses = provider.responses +export const model: ProviderPackage.Model = (modelID, settings) => + configure(config(settings)).model(modelID) +export const responsesModel: ProviderPackage.Model< + Settings, + OpenResponsesProviderOptionsInput +> = (modelID, settings) => configure(config(settings)).responses(modelID) + +function config({ + apiKey, + baseURL, + queryParams, + body, + headers, + ...providerOptions +}: Settings = {}) { + return { apiKey, baseURL, queryParams, headers, http: body === undefined ? undefined : { body }, providerOptions, - }).model(modelID) + } +} export * as Venice from "./venice.js" diff --git a/packages/ai/src/providers/venice/responses.ts b/packages/ai/src/providers/venice/responses.ts new file mode 100644 index 000000000000..ea598885b79d --- /dev/null +++ b/packages/ai/src/providers/venice/responses.ts @@ -0,0 +1,4 @@ +import type { OpenResponsesProviderOptionsInput } from "../open-responses-options.js" +import type { Venice } from "../venice.js" +export { responsesModel as model } from "../venice.js" +export type Settings = Venice.Settings diff --git a/packages/ai/test/fixtures/recordings/digitalocean-responses/calls-a-freeform-text-tool.json b/packages/ai/test/fixtures/recordings/digitalocean-responses/calls-a-freeform-text-tool.json new file mode 100644 index 000000000000..47be8dcf599c --- /dev/null +++ b/packages/ai/test/fixtures/recordings/digitalocean-responses/calls-a-freeform-text-tool.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "metadata": { + "model": "openai-gpt-5.4-mini", + "tags": [ + "prefix:digitalocean-responses", + "provider:digitalocean", + "protocol:open-responses", + "tool", + "freeform" + ], + "name": "digitalocean-responses/calls-a-freeform-text-tool", + "recordedAt": "2026-10-28T19:12:33.087Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://inference.do-ai.run/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Use the run tool to execute exactly this code: print(1)\"}]}],\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"custom\",\"name\":\"run\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"}}],\"tool_choice\":\"required\"}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "event: response.created\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214752,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDhjZTk4MTAxZTgyZjBjNDAxNmFlMjQ5MjA1MzQwODdkMThiODIzODhkOGQ3MTkyOGI=\",\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"required\",\"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\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"},\"name\":\"run\",\"type\":\"custom\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":0,\"type\":\"response.created\"}\n\nevent: response.in_progress\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214752,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDhjZTk4MTAxZTgyZjBjNDAxNmFlMjQ5MjA1MzQwODdkMThiODIzODhkOGQ3MTkyOGI=\",\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"required\",\"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\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"},\"name\":\"run\",\"type\":\"custom\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":1,\"type\":\"response.in_progress\"}\n\nevent: response.output_item.added\ndata: {\"item\":{\"call_id\":\"call_sWc2e3FDzcDHuWrTq7MMLsdv\",\"id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"input\":\"\",\"name\":\"run\",\"status\":\"in_progress\",\"type\":\"custom_tool_call\"},\"output_index\":0,\"sequence_number\":2,\"type\":\"response.output_item.added\"}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"delta\":\"print\",\"item_id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"obfuscation\":\"PP2eqt19ql4\",\"output_index\":0,\"sequence_number\":3,\"type\":\"response.custom_tool_call_input.delta\"}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"delta\":\"(\",\"item_id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"obfuscation\":\"V93JUappuJM529d\",\"output_index\":0,\"sequence_number\":4,\"type\":\"response.custom_tool_call_input.delta\"}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"delta\":\"1\",\"item_id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"obfuscation\":\"zFU25alVZZzFk83\",\"output_index\":0,\"sequence_number\":5,\"type\":\"response.custom_tool_call_input.delta\"}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"delta\":\")\",\"item_id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"obfuscation\":\"PUSdHmBdTngU5K9\",\"output_index\":0,\"sequence_number\":6,\"type\":\"response.custom_tool_call_input.delta\"}\n\nevent: response.custom_tool_call_input.done\ndata: {\"input\":\"print(1)\",\"item_id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"output_index\":0,\"sequence_number\":7,\"type\":\"response.custom_tool_call_input.done\"}\n\nevent: response.output_item.done\ndata: {\"item\":{\"call_id\":\"call_sWc2e3FDzcDHuWrTq7MMLsdv\",\"id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"input\":\"print(1)\",\"name\":\"run\",\"status\":\"completed\",\"type\":\"custom_tool_call\"},\"output_index\":0,\"sequence_number\":8,\"type\":\"response.output_item.done\"}\n\nevent: response.completed\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":1793214753,\"created_at\":1793214752,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDhjZTk4MTAxZTgyZjBjNDAxNmFlMjQ5MjA1MzQwODdkMThiODIzODhkOGQ3MTkyOGI=\",\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[{\"call_id\":\"call_sWc2e3FDzcDHuWrTq7MMLsdv\",\"id\":\"ctc_08ce98101e82f0c4016ae24920ec5c87d193d7d24ac4d7b5d2\",\"input\":\"print(1)\",\"name\":\"run\",\"status\":\"completed\",\"type\":\"custom_tool_call\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"completed\",\"store\":false,\"temperature\":1,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"required\",\"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\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"},\"name\":\"run\",\"type\":\"custom\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"cost\":null,\"input_tokens\":64,\"input_tokens_details\":{\"audio_tokens\":null,\"cache_write_tokens\":0,\"cached_tokens\":0,\"text_tokens\":null},\"output_tokens\":14,\"output_tokens_details\":{\"reasoning_tokens\":0,\"text_tokens\":null},\"total_tokens\":78},\"user\":null},\"sequence_number\":9,\"type\":\"response.completed\"}\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/digitalocean-responses/continues-a-tool-call.json b/packages/ai/test/fixtures/recordings/digitalocean-responses/continues-a-tool-call.json new file mode 100644 index 000000000000..b98204264e66 --- /dev/null +++ b/packages/ai/test/fixtures/recordings/digitalocean-responses/continues-a-tool-call.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "metadata": { + "model": "openai-gpt-5.4-mini", + "tags": [ + "prefix:digitalocean-responses", + "provider:digitalocean", + "protocol:open-responses", + "tool", + "tool-loop" + ], + "name": "digitalocean-responses/continues-a-tool-call", + "recordedAt": "2026-10-28T19:12:05.871Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://inference.do-ai.run/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"What is the weather in Paris?\"}]}],\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "event: response.created\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214723,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDAzMWEyNjllOTEwNzU0MjAxNmFlMjQ5MDNkMTU4ODdkMTkzM2RlMzY1ZWEyYTdiNTA=\",\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"strict\":false,\"type\":\"function\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":0,\"type\":\"response.created\"}\n\nevent: response.in_progress\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214723,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDAzMWEyNjllOTEwNzU0MjAxNmFlMjQ5MDNkMTU4ODdkMTkzM2RlMzY1ZWEyYTdiNTA=\",\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"strict\":false,\"type\":\"function\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":1,\"type\":\"response.in_progress\"}\n\nevent: response.output_item.added\ndata: {\"item\":{\"arguments\":\"\",\"call_id\":\"call_vjbwbCiWRxwHDUuuGaOR3wCv\",\"id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"name\":\"get_weather\",\"status\":\"in_progress\",\"type\":\"function_call\"},\"output_index\":0,\"sequence_number\":2,\"type\":\"response.output_item.added\"}\n\nevent: response.function_call_arguments.delta\ndata: {\"delta\":\"{\\\"\",\"item_id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"obfuscation\":\"EyXTC075Cwch2U\",\"output_index\":0,\"sequence_number\":3,\"type\":\"response.function_call_arguments.delta\"}\n\nevent: response.function_call_arguments.delta\ndata: {\"delta\":\"city\",\"item_id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"obfuscation\":\"7cLP17DBHdYe\",\"output_index\":0,\"sequence_number\":4,\"type\":\"response.function_call_arguments.delta\"}\n\nevent: response.function_call_arguments.delta\ndata: {\"delta\":\"\\\":\\\"\",\"item_id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"obfuscation\":\"KjEklJKBVkhYN\",\"output_index\":0,\"sequence_number\":5,\"type\":\"response.function_call_arguments.delta\"}\n\nevent: response.function_call_arguments.delta\ndata: {\"delta\":\"Paris\",\"item_id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"obfuscation\":\"KSugf7OaYwf\",\"output_index\":0,\"sequence_number\":6,\"type\":\"response.function_call_arguments.delta\"}\n\nevent: response.function_call_arguments.delta\ndata: {\"delta\":\"\\\"}\",\"item_id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"obfuscation\":\"xW7CxNvXlmCkV1\",\"output_index\":0,\"sequence_number\":7,\"type\":\"response.function_call_arguments.delta\"}\n\nevent: response.function_call_arguments.done\ndata: {\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"item_id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"output_index\":0,\"sequence_number\":8,\"type\":\"response.function_call_arguments.done\"}\n\nevent: response.output_item.done\ndata: {\"item\":{\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"call_id\":\"call_vjbwbCiWRxwHDUuuGaOR3wCv\",\"id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"name\":\"get_weather\",\"status\":\"completed\",\"type\":\"function_call\"},\"output_index\":0,\"sequence_number\":9,\"type\":\"response.output_item.done\"}\n\nevent: response.completed\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":1793214724,\"created_at\":1793214723,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDAzMWEyNjllOTEwNzU0MjAxNmFlMjQ5MDNkMTU4ODdkMTkzM2RlMzY1ZWEyYTdiNTA=\",\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[{\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"call_id\":\"call_vjbwbCiWRxwHDUuuGaOR3wCv\",\"id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"name\":\"get_weather\",\"status\":\"completed\",\"type\":\"function_call\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"completed\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"strict\":false,\"type\":\"function\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"cost\":null,\"input_tokens\":67,\"input_tokens_details\":{\"audio_tokens\":null,\"cache_write_tokens\":0,\"cached_tokens\":0,\"text_tokens\":null},\"output_tokens\":18,\"output_tokens_details\":{\"reasoning_tokens\":0,\"text_tokens\":null},\"total_tokens\":85},\"user\":null},\"sequence_number\":10,\"type\":\"response.completed\"}\n\n" + } + }, + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://inference.do-ai.run/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"What is the weather in Paris?\"}]},{\"type\":\"function_call\",\"id\":\"fc_0031a269e9107542016ae249045c3c87d19f19bd114c7ae0f4\",\"call_id\":\"call_vjbwbCiWRxwHDUuuGaOR3wCv\",\"name\":\"get_weather\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\"},{\"type\":\"function_call_output\",\"call_id\":\"call_vjbwbCiWRxwHDUuuGaOR3wCv\",\"output\":\"{\\\"temperature\\\":22,\\\"condition\\\":\\\"sunny\\\"}\"}],\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "event: response.created\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214725,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDAzMWEyNjllOTEwNzU0MjAxNmFlMjQ5MDRmNjkwODdkMWIyMWU5ZjJjZDRlZjg0MDg=\",\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"strict\":false,\"type\":\"function\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":0,\"type\":\"response.created\"}\n\nevent: response.in_progress\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214725,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDAzMWEyNjllOTEwNzU0MjAxNmFlMjQ5MDRmNjkwODdkMWIyMWU5ZjJjZDRlZjg0MDg=\",\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"strict\":false,\"type\":\"function\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":1,\"type\":\"response.in_progress\"}\n\nevent: response.output_item.added\ndata: {\"item\":{\"content\":[],\"id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"phase\":\"final_answer\",\"role\":\"assistant\",\"status\":\"in_progress\",\"type\":\"message\"},\"output_index\":0,\"sequence_number\":2,\"type\":\"response.output_item.added\"}\n\nevent: response.content_part.added\ndata: {\"content_index\":0,\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"output_index\":0,\"part\":{\"annotations\":[],\"logprobs\":[],\"text\":\"\",\"type\":\"output_text\"},\"sequence_number\":3,\"type\":\"response.content_part.added\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\"Paris\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"rCSbF2261qu\",\"output_index\":0,\"sequence_number\":4,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\" is\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"Cn4joNPCkdJTI\",\"output_index\":0,\"sequence_number\":5,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\" \",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"JTpY6k5gYmA8oTA\",\"output_index\":0,\"sequence_number\":6,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\"22\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"xtsTjJla0gL0mB\",\"output_index\":0,\"sequence_number\":7,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\"°C\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"GHVg5XzNoaA6zR\",\"output_index\":0,\"sequence_number\":8,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\" and\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"T8yOkykxKY7E\",\"output_index\":0,\"sequence_number\":9,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\" sunny\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"qD511IM3AU\",\"output_index\":0,\"sequence_number\":10,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\".\",\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"obfuscation\":\"XqvgV7JYfjsYXd6\",\"output_index\":0,\"sequence_number\":11,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.done\ndata: {\"content_index\":0,\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"logprobs\":[],\"output_index\":0,\"sequence_number\":12,\"text\":\"Paris is 22°C and sunny.\",\"type\":\"response.output_text.done\"}\n\nevent: response.content_part.done\ndata: {\"content_index\":0,\"item_id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"output_index\":0,\"part\":{\"annotations\":[],\"logprobs\":[],\"text\":\"Paris is 22°C and sunny.\",\"type\":\"output_text\"},\"sequence_number\":13,\"type\":\"response.content_part.done\"}\n\nevent: response.output_item.done\ndata: {\"item\":{\"content\":[{\"annotations\":[],\"logprobs\":[],\"text\":\"Paris is 22°C and sunny.\",\"type\":\"output_text\"}],\"id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"phase\":\"final_answer\",\"role\":\"assistant\",\"status\":\"completed\",\"type\":\"message\"},\"output_index\":0,\"sequence_number\":14,\"type\":\"response.output_item.done\"}\n\nevent: response.completed\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":1793214725,\"created_at\":1793214725,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMDAzMWEyNjllOTEwNzU0MjAxNmFlMjQ5MDRmNjkwODdkMWIyMWU5ZjJjZDRlZjg0MDg=\",\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[{\"content\":[{\"annotations\":[],\"logprobs\":[],\"text\":\"Paris is 22°C and sunny.\",\"type\":\"output_text\"}],\"id\":\"msg_0031a269e9107542016ae24905a30887d1b8fb7fd9990f5510\",\"phase\":\"final_answer\",\"role\":\"assistant\",\"status\":\"completed\",\"type\":\"message\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"completed\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"strict\":false,\"type\":\"function\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"cost\":null,\"input_tokens\":106,\"input_tokens_details\":{\"audio_tokens\":null,\"cache_write_tokens\":0,\"cached_tokens\":0,\"text_tokens\":null},\"output_tokens\":12,\"output_tokens_details\":{\"reasoning_tokens\":0,\"text_tokens\":null},\"total_tokens\":118},\"user\":null},\"sequence_number\":15,\"type\":\"response.completed\"}\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/digitalocean-responses/streams-text.json b/packages/ai/test/fixtures/recordings/digitalocean-responses/streams-text.json new file mode 100644 index 000000000000..5f2c5a69deec --- /dev/null +++ b/packages/ai/test/fixtures/recordings/digitalocean-responses/streams-text.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "metadata": { + "model": "openai-gpt-5.4-mini", + "tags": [ + "prefix:digitalocean-responses", + "provider:digitalocean", + "protocol:open-responses", + "text", + "usage" + ], + "name": "digitalocean-responses/streams-text", + "recordedAt": "2026-10-28T19:12:03.314Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://inference.do-ai.run/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Reply exactly: OK\"}]}],\"stream\":true,\"max_output_tokens\":64,\"store\":false,\"include\":[\"reasoning.encrypted_content\"]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "event: response.created\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214722,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMGYxOGI1NWRlNjUzOTczODAxNmFlMjQ5MDI2N2EwODdkMTk3MGNjMTY3ODE3YzgwN2Q=\",\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":64,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"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\":[],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":0,\"type\":\"response.created\"}\n\nevent: response.in_progress\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":null,\"created_at\":1793214722,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMGYxOGI1NWRlNjUzOTczODAxNmFlMjQ5MDI2N2EwODdkMTk3MGNjMTY3ODE3YzgwN2Q=\",\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":64,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"in_progress\",\"store\":false,\"temperature\":1,\"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\":[],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"user\":null},\"sequence_number\":1,\"type\":\"response.in_progress\"}\n\nevent: response.output_item.added\ndata: {\"item\":{\"content\":[],\"id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"phase\":\"final_answer\",\"role\":\"assistant\",\"status\":\"in_progress\",\"type\":\"message\"},\"output_index\":0,\"sequence_number\":2,\"type\":\"response.output_item.added\"}\n\nevent: response.content_part.added\ndata: {\"content_index\":0,\"item_id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"output_index\":0,\"part\":{\"annotations\":[],\"logprobs\":[],\"text\":\"\",\"type\":\"output_text\"},\"sequence_number\":3,\"type\":\"response.content_part.added\"}\n\nevent: response.output_text.delta\ndata: {\"content_index\":0,\"delta\":\"OK\",\"item_id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"logprobs\":[],\"obfuscation\":\"dVydsXBv0XG9C7\",\"output_index\":0,\"sequence_number\":4,\"type\":\"response.output_text.delta\"}\n\nevent: response.output_text.done\ndata: {\"content_index\":0,\"item_id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"logprobs\":[],\"output_index\":0,\"sequence_number\":5,\"text\":\"OK\",\"type\":\"response.output_text.done\"}\n\nevent: response.content_part.done\ndata: {\"content_index\":0,\"item_id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"output_index\":0,\"part\":{\"annotations\":[],\"logprobs\":[],\"text\":\"OK\",\"type\":\"output_text\"},\"sequence_number\":6,\"type\":\"response.content_part.done\"}\n\nevent: response.output_item.done\ndata: {\"item\":{\"content\":[{\"annotations\":[],\"logprobs\":[],\"text\":\"OK\",\"type\":\"output_text\"}],\"id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"phase\":\"final_answer\",\"role\":\"assistant\",\"status\":\"completed\",\"type\":\"message\"},\"output_index\":0,\"sequence_number\":7,\"type\":\"response.output_item.done\"}\n\nevent: response.completed\ndata: {\"response\":{\"access_programs\":null,\"background\":false,\"completed_at\":1793214722,\"created_at\":1793214722,\"error\":null,\"frequency_penalty\":0,\"id\":\"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDpOb25lO3Jlc3BvbnNlX2lkOnJlc3BfMGYxOGI1NWRlNjUzOTczODAxNmFlMjQ5MDI2N2EwODdkMTk3MGNjMTY3ODE3YzgwN2Q=\",\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":64,\"max_tool_calls\":null,\"metadata\":{},\"model\":\"openai-gpt-5.4-mini\",\"moderation\":null,\"object\":\"response\",\"output\":[{\"content\":[{\"annotations\":[],\"logprobs\":[],\"text\":\"OK\",\"type\":\"output_text\"}],\"id\":\"msg_0f18b55de6539738016ae24902e92487d1ab56c41d7b779f47\",\"phase\":\"final_answer\",\"role\":\"assistant\",\"status\":\"completed\",\"type\":\"message\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_key\":\"afd53c3349400d1f29bd8b39deab817ee68b2a3b76df72001f78d5c99783623f\",\"prompt_cache_retention\":\"in_memory\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":null},\"safety_identifier\":\"39160981\",\"service_tier\":\"default\",\"status\":\"completed\",\"store\":false,\"temperature\":1,\"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\":[],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"cost\":null,\"input_tokens\":10,\"input_tokens_details\":{\"audio_tokens\":null,\"cache_write_tokens\":0,\"cached_tokens\":0,\"text_tokens\":null},\"output_tokens\":5,\"output_tokens_details\":{\"reasoning_tokens\":0,\"text_tokens\":null},\"total_tokens\":15},\"user\":null},\"sequence_number\":8,\"type\":\"response.completed\"}\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/openrouter-responses/calls-a-freeform-text-tool.json b/packages/ai/test/fixtures/recordings/openrouter-responses/calls-a-freeform-text-tool.json new file mode 100644 index 000000000000..72e436618b16 --- /dev/null +++ b/packages/ai/test/fixtures/recordings/openrouter-responses/calls-a-freeform-text-tool.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "metadata": { + "model": "openai/gpt-5.4-mini", + "tags": [ + "prefix:openrouter-responses", + "provider:openrouter", + "protocol:open-responses", + "tool", + "freeform" + ], + "name": "openrouter-responses/calls-a-freeform-text-tool", + "recordedAt": "2026-10-28T19:12:31.652Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://openrouter.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai/gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Use the run tool to execute exactly this code: print(1)\"}]}],\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"custom\",\"name\":\"run\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"}}],\"tool_choice\":\"required\"}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "data: {\"type\":\"response.created\",\"response\":{\"id\":\"gen-1793214750-mKxSP1x7cfTqz0InQBR1\",\"object\":\"response\",\"created_at\":1793214750,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"custom\",\"name\":\"run\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"}}],\"tool_choice\":\"required\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":null,\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":0}\n\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"gen-1793214750-mKxSP1x7cfTqz0InQBR1\",\"object\":\"response\",\"created_at\":1793214750,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"custom\",\"name\":\"run\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"}}],\"tool_choice\":\"required\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":null,\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":1}\n\ndata: {\"type\":\"response.output_item.added\",\"output_index\":0,\"item\":{\"id\":\"ctc_tmp_aasptvj0fik\",\"type\":\"custom_tool_call\",\"status\":\"in_progress\",\"call_id\":\"call_jlLLytaby5F4w22U0yMR8kvU\",\"name\":\"run\",\"input\":\"\"},\"sequence_number\":2}\n\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"output_index\":0,\"item_id\":\"ctc_tmp_aasptvj0fik\",\"delta\":\"print\",\"sequence_number\":3}\n\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"output_index\":0,\"item_id\":\"ctc_tmp_aasptvj0fik\",\"delta\":\"(\",\"sequence_number\":4}\n\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"output_index\":0,\"item_id\":\"ctc_tmp_aasptvj0fik\",\"delta\":\"1\",\"sequence_number\":5}\n\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"output_index\":0,\"item_id\":\"ctc_tmp_aasptvj0fik\",\"delta\":\")\",\"sequence_number\":6}\n\ndata: {\"type\":\"response.custom_tool_call_input.done\",\"output_index\":0,\"item_id\":\"ctc_tmp_aasptvj0fik\",\"input\":\"print(1)\",\"sequence_number\":7}\n\ndata: {\"type\":\"response.output_item.done\",\"output_index\":0,\"item\":{\"id\":\"ctc_tmp_aasptvj0fik\",\"type\":\"custom_tool_call\",\"status\":\"completed\",\"call_id\":\"call_jlLLytaby5F4w22U0yMR8kvU\",\"name\":\"run\",\"input\":\"print(1)\"},\"sequence_number\":8}\n\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"gen-1793214750-mKxSP1x7cfTqz0InQBR1\",\"object\":\"response\",\"created_at\":1793214750,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"completed\",\"completed_at\":1793214751,\"output\":[{\"id\":\"ctc_tmp_aasptvj0fik\",\"type\":\"custom_tool_call\",\"status\":\"completed\",\"call_id\":\"call_jlLLytaby5F4w22U0yMR8kvU\",\"name\":\"run\",\"input\":\"print(1)\"}],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"custom\",\"name\":\"run\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"}}],\"tool_choice\":\"required\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"default\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":null,\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":{\"input_tokens\":64,\"input_tokens_details\":{\"cached_tokens\":0},\"output_tokens\":14,\"output_tokens_details\":{\"reasoning_tokens\":0},\"total_tokens\":78,\"cost\":0.000111,\"is_byok\":false,\"cost_details\":{\"upstream_inference_cost\":0.000111,\"upstream_inference_input_cost\":0.000048,\"upstream_inference_output_cost\":0.000063}}},\"sequence_number\":9}\n\ndata: [DONE]\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/openrouter-responses/continues-a-tool-call.json b/packages/ai/test/fixtures/recordings/openrouter-responses/continues-a-tool-call.json new file mode 100644 index 000000000000..63bdd42f6edd --- /dev/null +++ b/packages/ai/test/fixtures/recordings/openrouter-responses/continues-a-tool-call.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "metadata": { + "model": "openai/gpt-5.4-mini", + "tags": [ + "prefix:openrouter-responses", + "provider:openrouter", + "protocol:open-responses", + "tool", + "tool-loop" + ], + "name": "openrouter-responses/continues-a-tool-call", + "recordedAt": "2026-10-28T19:12:01.377Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://openrouter.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai/gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"What is the weather in Paris?\"}]}],\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "data: {\"type\":\"response.created\",\"response\":{\"id\":\"gen-1793214719-hmic2S4CCE89G2d4D96L\",\"object\":\"response\",\"created_at\":1793214719,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"strict\":false,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false}}],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":0}\n\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"gen-1793214719-hmic2S4CCE89G2d4D96L\",\"object\":\"response\",\"created_at\":1793214719,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"strict\":false,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false}}],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":1}\n\ndata: {\"type\":\"response.output_item.added\",\"output_index\":0,\"item\":{\"id\":\"fc_tmp_omnt7gk11k8\",\"type\":\"function_call\",\"status\":\"in_progress\",\"call_id\":\"call_WkndZYqzvAYJdX87khaeM7dQ\",\"name\":\"get_weather\",\"arguments\":\"\"},\"sequence_number\":2}\n\ndata: {\"type\":\"response.function_call_arguments.delta\",\"output_index\":0,\"item_id\":\"fc_tmp_omnt7gk11k8\",\"delta\":\"{\\\"\",\"sequence_number\":3}\n\ndata: {\"type\":\"response.function_call_arguments.delta\",\"output_index\":0,\"item_id\":\"fc_tmp_omnt7gk11k8\",\"delta\":\"city\",\"sequence_number\":4}\n\ndata: {\"type\":\"response.function_call_arguments.delta\",\"output_index\":0,\"item_id\":\"fc_tmp_omnt7gk11k8\",\"delta\":\"\\\":\\\"\",\"sequence_number\":5}\n\ndata: {\"type\":\"response.function_call_arguments.delta\",\"output_index\":0,\"item_id\":\"fc_tmp_omnt7gk11k8\",\"delta\":\"Paris\",\"sequence_number\":6}\n\ndata: {\"type\":\"response.function_call_arguments.delta\",\"output_index\":0,\"item_id\":\"fc_tmp_omnt7gk11k8\",\"delta\":\"\\\"}\",\"sequence_number\":7}\n\ndata: {\"type\":\"response.function_call_arguments.done\",\"output_index\":0,\"item_id\":\"fc_tmp_omnt7gk11k8\",\"name\":\"get_weather\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"sequence_number\":8}\n\ndata: {\"type\":\"response.output_item.done\",\"output_index\":0,\"item\":{\"id\":\"fc_tmp_omnt7gk11k8\",\"type\":\"function_call\",\"status\":\"completed\",\"call_id\":\"call_WkndZYqzvAYJdX87khaeM7dQ\",\"name\":\"get_weather\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\"},\"sequence_number\":9}\n\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"gen-1793214719-hmic2S4CCE89G2d4D96L\",\"object\":\"response\",\"created_at\":1793214719,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"completed\",\"completed_at\":1793214720,\"output\":[{\"id\":\"fc_tmp_omnt7gk11k8\",\"type\":\"function_call\",\"status\":\"completed\",\"call_id\":\"call_WkndZYqzvAYJdX87khaeM7dQ\",\"name\":\"get_weather\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\"}],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"strict\":false,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false}}],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"default\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":{\"input_tokens\":67,\"input_tokens_details\":{\"cached_tokens\":0},\"output_tokens\":18,\"output_tokens_details\":{\"reasoning_tokens\":0},\"total_tokens\":85,\"cost\":0.00013125,\"is_byok\":false,\"cost_details\":{\"upstream_inference_cost\":0.00013125,\"upstream_inference_input_cost\":0.00005025,\"upstream_inference_output_cost\":0.000081}}},\"sequence_number\":10}\n\ndata: [DONE]\n\n" + } + }, + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://openrouter.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai/gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"What is the weather in Paris?\"}]},{\"type\":\"function_call\",\"id\":\"fc_tmp_omnt7gk11k8\",\"call_id\":\"call_WkndZYqzvAYJdX87khaeM7dQ\",\"name\":\"get_weather\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\"},{\"type\":\"function_call_output\",\"call_id\":\"call_WkndZYqzvAYJdX87khaeM7dQ\",\"output\":\"{\\\"temperature\\\":22,\\\"condition\\\":\\\"sunny\\\"}\"}],\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "data: {\"type\":\"response.created\",\"response\":{\"id\":\"gen-1793214720-6mfbIkJtwDbS0QLD67wD\",\"object\":\"response\",\"created_at\":1793214720,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"strict\":false,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false}}],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":0}\n\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"gen-1793214720-6mfbIkJtwDbS0QLD67wD\",\"object\":\"response\",\"created_at\":1793214720,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"strict\":false,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false}}],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":1}\n\ndata: {\"type\":\"response.output_item.added\",\"output_index\":0,\"item\":{\"id\":\"msg_tmp_l0v0a8ah9or\",\"type\":\"message\",\"status\":\"in_progress\",\"role\":\"assistant\",\"content\":[],\"phase\":\"final_answer\"},\"sequence_number\":2}\n\ndata: {\"type\":\"response.content_part.added\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"\",\"annotations\":[],\"logprobs\":[]},\"sequence_number\":3}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\"Paris\",\"logprobs\":[],\"sequence_number\":4}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\" is\",\"logprobs\":[],\"sequence_number\":5}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\" \",\"logprobs\":[],\"sequence_number\":6}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\"22\",\"logprobs\":[],\"sequence_number\":7}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\"°C\",\"logprobs\":[],\"sequence_number\":8}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\" and\",\"logprobs\":[],\"sequence_number\":9}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\" sunny\",\"logprobs\":[],\"sequence_number\":10}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"delta\":\".\",\"logprobs\":[],\"sequence_number\":11}\n\ndata: {\"type\":\"response.output_text.done\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"text\":\"Paris is 22°C and sunny.\",\"logprobs\":[],\"sequence_number\":12}\n\ndata: {\"type\":\"response.content_part.done\",\"output_index\":0,\"item_id\":\"msg_tmp_l0v0a8ah9or\",\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"Paris is 22°C and sunny.\",\"annotations\":[],\"logprobs\":[]},\"sequence_number\":13}\n\ndata: {\"type\":\"response.output_item.done\",\"output_index\":0,\"item\":{\"id\":\"msg_tmp_l0v0a8ah9or\",\"type\":\"message\",\"status\":\"completed\",\"role\":\"assistant\",\"content\":[{\"type\":\"output_text\",\"text\":\"Paris is 22°C and sunny.\",\"annotations\":[],\"logprobs\":[]}],\"phase\":\"final_answer\"},\"sequence_number\":14}\n\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"gen-1793214720-6mfbIkJtwDbS0QLD67wD\",\"object\":\"response\",\"created_at\":1793214720,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"completed\",\"completed_at\":1793214721,\"output\":[{\"id\":\"msg_tmp_l0v0a8ah9or\",\"type\":\"message\",\"role\":\"assistant\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"text\":\"Paris is 22°C and sunny.\",\"annotations\":[],\"logprobs\":[]}],\"phase\":\"final_answer\"}],\"error\":null,\"incomplete_details\":null,\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"strict\":false,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false}}],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":256,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"default\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":{\"input_tokens\":106,\"input_tokens_details\":{\"cached_tokens\":0},\"output_tokens\":12,\"output_tokens_details\":{\"reasoning_tokens\":0},\"total_tokens\":118,\"cost\":0.0001335,\"is_byok\":false,\"cost_details\":{\"upstream_inference_cost\":0.0001335,\"upstream_inference_input_cost\":0.0000795,\"upstream_inference_output_cost\":0.000054}}},\"sequence_number\":15}\n\ndata: [DONE]\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/openrouter-responses/streams-text.json b/packages/ai/test/fixtures/recordings/openrouter-responses/streams-text.json new file mode 100644 index 000000000000..bc5174e5f14e --- /dev/null +++ b/packages/ai/test/fixtures/recordings/openrouter-responses/streams-text.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "metadata": { + "model": "openai/gpt-5.4-mini", + "tags": [ + "prefix:openrouter-responses", + "provider:openrouter", + "protocol:open-responses", + "text", + "usage" + ], + "name": "openrouter-responses/streams-text", + "recordedAt": "2026-10-28T19:11:59.562Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://openrouter.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai/gpt-5.4-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Reply exactly: OK\"}]}],\"stream\":true,\"max_output_tokens\":64,\"store\":false,\"include\":[\"reasoning.encrypted_content\"]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream" + }, + "body": "data: {\"type\":\"response.created\",\"response\":{\"id\":\"gen-1793214718-hQ61zZmJsMM3exScOj2w\",\"object\":\"response\",\"created_at\":1793214718,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":64,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":null,\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":0}\n\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"gen-1793214718-hQ61zZmJsMM3exScOj2w\",\"object\":\"response\",\"created_at\":1793214718,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"in_progress\",\"completed_at\":null,\"output\":[],\"error\":null,\"incomplete_details\":null,\"tools\":[],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":64,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"auto\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":null,\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":null,\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":null},\"sequence_number\":1}\n\ndata: {\"type\":\"response.output_item.added\",\"output_index\":0,\"item\":{\"id\":\"msg_tmp_luc1vnm9au\",\"type\":\"message\",\"status\":\"in_progress\",\"role\":\"assistant\",\"content\":[],\"phase\":\"final_answer\"},\"sequence_number\":2}\n\ndata: {\"type\":\"response.content_part.added\",\"output_index\":0,\"item_id\":\"msg_tmp_luc1vnm9au\",\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"\",\"annotations\":[],\"logprobs\":[]},\"sequence_number\":3}\n\ndata: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"item_id\":\"msg_tmp_luc1vnm9au\",\"content_index\":0,\"delta\":\"OK\",\"logprobs\":[],\"sequence_number\":4}\n\ndata: {\"type\":\"response.output_text.done\",\"output_index\":0,\"item_id\":\"msg_tmp_luc1vnm9au\",\"content_index\":0,\"text\":\"OK\",\"logprobs\":[],\"sequence_number\":5}\n\ndata: {\"type\":\"response.content_part.done\",\"output_index\":0,\"item_id\":\"msg_tmp_luc1vnm9au\",\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"OK\",\"annotations\":[],\"logprobs\":[]},\"sequence_number\":6}\n\ndata: {\"type\":\"response.output_item.done\",\"output_index\":0,\"item\":{\"id\":\"msg_tmp_luc1vnm9au\",\"type\":\"message\",\"status\":\"completed\",\"role\":\"assistant\",\"content\":[{\"type\":\"output_text\",\"text\":\"OK\",\"annotations\":[],\"logprobs\":[]}],\"phase\":\"final_answer\"},\"sequence_number\":7}\n\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"gen-1793214718-hQ61zZmJsMM3exScOj2w\",\"object\":\"response\",\"created_at\":1793214718,\"model\":\"openai/gpt-5.4-mini\",\"status\":\"completed\",\"completed_at\":1793214719,\"output\":[{\"id\":\"msg_tmp_luc1vnm9au\",\"type\":\"message\",\"role\":\"assistant\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"text\":\"OK\",\"annotations\":[],\"logprobs\":[]}],\"phase\":\"final_answer\"}],\"error\":null,\"incomplete_details\":null,\"tools\":[],\"tool_choice\":\"auto\",\"parallel_tool_calls\":true,\"max_output_tokens\":64,\"temperature\":1,\"top_p\":1,\"presence_penalty\":0,\"frequency_penalty\":0,\"top_logprobs\":0,\"max_tool_calls\":null,\"metadata\":{},\"background\":false,\"previous_response_id\":null,\"service_tier\":\"default\",\"truncation\":\"disabled\",\"store\":false,\"instructions\":null,\"text\":{\"format\":{\"type\":\"text\"}},\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"none\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"safety_identifier\":null,\"prompt_cache_key\":null,\"prompt_cache_options\":null,\"usage\":{\"input_tokens\":10,\"input_tokens_details\":{\"cached_tokens\":0},\"output_tokens\":5,\"output_tokens_details\":{\"reasoning_tokens\":0},\"total_tokens\":15,\"cost\":0.00003,\"is_byok\":false,\"cost_details\":{\"upstream_inference_cost\":0.00003,\"upstream_inference_input_cost\":0.0000075,\"upstream_inference_output_cost\":0.0000225}}},\"sequence_number\":8}\n\ndata: [DONE]\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/venice-responses/calls-a-freeform-text-tool.json b/packages/ai/test/fixtures/recordings/venice-responses/calls-a-freeform-text-tool.json new file mode 100644 index 000000000000..af3b6dcec469 --- /dev/null +++ b/packages/ai/test/fixtures/recordings/venice-responses/calls-a-freeform-text-tool.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "metadata": { + "model": "openai-gpt-54-mini", + "tags": [ + "prefix:venice-responses", + "provider:venice", + "protocol:open-responses", + "tool", + "freeform" + ], + "name": "venice-responses/calls-a-freeform-text-tool", + "recordedAt": "2026-10-28T19:12:35.721Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://api.venice.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-54-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Use the run tool to execute exactly this code: print(1)\"}]}],\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"custom\",\"name\":\"run\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"}}],\"tool_choice\":\"required\"}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream; charset=utf-8" + }, + "body": "event: response.created\ndata: {\"type\":\"response.created\",\"response\":{\"id\":\"resp_06e0a7476e581c2b016ae24921582487d19218cdaf42cc0046\",\"object\":\"response\",\"created_at\":1793214753,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"required\",\"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\":\"custom\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"},\"name\":\"run\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":0}\n\nevent: response.in_progress\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"resp_06e0a7476e581c2b016ae24921582487d19218cdaf42cc0046\",\"object\":\"response\",\"created_at\":1793214753,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"required\",\"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\":\"custom\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"},\"name\":\"run\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":1}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkhX9L4ZsGV5terrPv6lGbChQIWEMIDqSW8gXdZWVqZkyfETU1BdQNtnt_1KGNUdrVBx1_S-29O0k1t1ctyQpcLLkm6fZyVcgxqHgcB-PyPQfviORisE4rUPJOkYiIUjce_iw7kmY0kRBySYf4OSdKgamxn6HjAAYGDhBnQ3PI0Cn4rQVhs7yciqmhc1yOcYsha7CYiExE4wyXXnd6MhZO5Bi4JU0hVVPDcE8qI5ymzxeVHT3p0KBhCNR7fXGLTxz1fNXGFuqPUTb8kwLiuYeaAXEDObAk5U3cCry4KuSUWs_SKLoWPgh1aA2vYmmbgZx-K9Z8sJab0pV_OnIcVA7BLR0Yjbd3Ei6v6iCctp6YRywTUAW64H9ujL4lAyrR3sAF5ofV484yrbSjzdLtB-QTkd4HlsT5P2fj6etIJiYr3xqlq8dbmjmapPvum4kci-H7Xfc5cMfYrziMNHeE1u-hoOLznjuVzzs8G_1NgDYAHHuHwZ5ffo0Phqt09q2rAZoHKO4bJH0fKeVk8nRsd0xhP41jgqPFDfv2MZ7g43wHxwM8A41HU04d69iQXP2HhqRtfucrz3BW-Jx0s9YEi_GyZ-V0SRtN-y9J1z-YcyeOzhGJC2DrHL1tAGr52PwjITSP5FHu4IPydPhkAotRD6ScepLHRto0EAYblPMIvAfZee27VeIRJ9RdmTpZ22zCxca58MuDjKiVz8hTBSp3URb88XBsz89A9ACh5y-4k_c14LM_eMgBTq1adK4GCwmcIZSMzK7sOzE6bK_eLRxfHF5pMKBs4iORWGDhoO6xZk8IjhxXJvB9M-s43A8mqd0jOfp14AVWdjrNKC-OwrUjhXZ4sUsbe_CjvC7bJz7OP5QskYOkFHgEwKun9CMTkeFKEpM2lJ1xSn0OgSmmF97X53dWmxrOBuBFkm90RFNvOP6Iy-MiBPk7_Ea4fXYcXnwBDHjiRWnk2gTKCcLSIXnUrPJdnoMHrybyD-T2YhgHChqz78Kq_ahPxE-Q8ANdjuEkVRxGeLTQJF7_EZtcE83Mbw8K1sYHN2lhzJZqW3wlzHWnfLxBEuDW504QzRkN8qmE0CDLe0JVr1u8oUbkKfZjCf_DDtmVRoOkUVtNTDi2dy1bzJ7ceMcc2Kl3bN9KwFMAqvOlo4zDH--tdtDpFtRUJoNObDsyrlXU8N7FQ0TiAIU7IsYbgxPjJuqB3qEmcFzbVdOvqxLnLYkXAUxDPYCbX1C0pUVInWfidYTU8rSYK7lIjssn-OaAgVQYHpoIOMD68KPWKT0KAGpZJKUc9wz6l7DPdUZ-46KwCwMkdh-SZz6w2cdOUVzvKc3rcQz-sErwQF7nP\",\"summary\":[]},\"output_index\":0,\"sequence_number\":2}\n\nevent: response.reasoning_summary_part.added\ndata: {\"type\":\"response.reasoning_summary_part.added\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"output_index\":0,\"part\":{\"type\":\"summary_text\",\"text\":\"\"},\"sequence_number\":3,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"**Executing user command**\\n\\nThe\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"I\",\"output_index\":0,\"sequence_number\":4,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" user\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"hfJoP9QDDXV\",\"output_index\":0,\"sequence_number\":5,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" has\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"IPklDKYnq2GQ\",\"output_index\":0,\"sequence_number\":6,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" asked\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"qKMiq0g7Gz\",\"output_index\":0,\"sequence_number\":7,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" me\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"CEDI91wq8S9zc\",\"output_index\":0,\"sequence_number\":8,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"G2t4a28um3vkI\",\"output_index\":0,\"sequence_number\":9,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" execute\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"6g20TjPR\",\"output_index\":0,\"sequence_number\":10,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" a\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"UPOdgVrdYalTma\",\"output_index\":0,\"sequence_number\":11,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" specific\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"FVMQzjF\",\"output_index\":0,\"sequence_number\":12,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" command\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"QUZkZvmX\",\"output_index\":0,\"sequence_number\":13,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\":\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"nsdrP8eCqi0L5Lc\",\"output_index\":0,\"sequence_number\":14,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" \\\"\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"RnvhtM1TAmry9O\",\"output_index\":0,\"sequence_number\":15,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"Use\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"bsNbRTExt95tZ\",\"output_index\":0,\"sequence_number\":16,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"MRYQjR4k2JqE\",\"output_index\":0,\"sequence_number\":17,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" run\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"uQxlrV7PaJag\",\"output_index\":0,\"sequence_number\":18,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" tool\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"SWJMgmi0Rnq\",\"output_index\":0,\"sequence_number\":19,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"Yx5bjljQELGyX\",\"output_index\":0,\"sequence_number\":20,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" execute\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"nQ2T388B\",\"output_index\":0,\"sequence_number\":21,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" exactly\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"mW3VYEbj\",\"output_index\":0,\"sequence_number\":22,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" this\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"KbPnP3Pl4OC\",\"output_index\":0,\"sequence_number\":23,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" code\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"w1YqX1BzpXl\",\"output_index\":0,\"sequence_number\":24,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\":\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"zmY8RJJgFTxEbka\",\"output_index\":0,\"sequence_number\":25,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" print\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"GTs6bRZKqu\",\"output_index\":0,\"sequence_number\":26,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"(\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"Q9bFIO44JQrGw4Y\",\"output_index\":0,\"sequence_number\":27,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"1\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"Ca18Fv4TKUxwNpG\",\"output_index\":0,\"sequence_number\":28,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\").\\\"\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"geJZPiEyoKNFm\",\"output_index\":0,\"sequence_number\":29,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" I\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"PQrUD44NZ9ksW6\",\"output_index\":0,\"sequence_number\":30,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" need\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"ZwP3r0ymoeV\",\"output_index\":0,\"sequence_number\":31,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"mBxzJyCwNQJA0\",\"output_index\":0,\"sequence_number\":32,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" call\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"6HlnNkxKdYS\",\"output_index\":0,\"sequence_number\":33,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"FyZxdi3KyoBj\",\"output_index\":0,\"sequence_number\":34,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" run\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"ruEwsQCxOWec\",\"output_index\":0,\"sequence_number\":35,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" tool\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"aWqZt9ajcl6\",\"output_index\":0,\"sequence_number\":36,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" in\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"fRQ9ZYDKWaFW6\",\"output_index\":0,\"sequence_number\":37,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" a\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"nt1pOBlrOiCsGg\",\"output_index\":0,\"sequence_number\":38,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" commentary\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"Patwc\",\"output_index\":0,\"sequence_number\":39,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" format\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"0SuGzSYLL\",\"output_index\":0,\"sequence_number\":40,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" with\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"BLu8uPCpwSV\",\"output_index\":0,\"sequence_number\":41,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" that\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"00In2jV4glz\",\"output_index\":0,\"sequence_number\":42,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" precise\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"qj5uaYZw\",\"output_index\":0,\"sequence_number\":43,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" code\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"FoBDC5LdNaG\",\"output_index\":0,\"sequence_number\":44,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\",\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"B7v4zOxjpD5DEdM\",\"output_index\":0,\"sequence_number\":45,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" without\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"N6wV6LTx\",\"output_index\":0,\"sequence_number\":46,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" adding\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"rSUID6c5U\",\"output_index\":0,\"sequence_number\":47,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" any\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"6WX1vW3o8smF\",\"output_index\":0,\"sequence_number\":48,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" extra\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"nP9hqs62Dz\",\"output_index\":0,\"sequence_number\":49,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" text\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"O5D2EXgK7KI\",\"output_index\":0,\"sequence_number\":50,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"zQGmNM4XBTKw8gx\",\"output_index\":0,\"sequence_number\":51,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" So\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"dnlSvlRAqHUIP\",\"output_index\":0,\"sequence_number\":52,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" I'll\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"YVyALrr1Ler\",\"output_index\":0,\"sequence_number\":53,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" use\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"WhvSj0KGwCMx\",\"output_index\":0,\"sequence_number\":54,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" functions\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"SDWKW0\",\"output_index\":0,\"sequence_number\":55,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".run\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"k0vSqfqZr7t4\",\"output_index\":0,\"sequence_number\":56,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" and\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"63KlPXwmvPqM\",\"output_index\":0,\"sequence_number\":57,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" simply\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"QPNJeff4A\",\"output_index\":0,\"sequence_number\":58,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" provide\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"a1MbUe8T\",\"output_index\":0,\"sequence_number\":59,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" \\\"\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"iStnp85bsGwC0Z\",\"output_index\":0,\"sequence_number\":60,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"print\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"122iB7Yn09c\",\"output_index\":0,\"sequence_number\":61,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"(\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"vC2exmwcnmGJkpD\",\"output_index\":0,\"sequence_number\":62,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"1\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"79TlOf1z0LOsi4x\",\"output_index\":0,\"sequence_number\":63,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\")\\\"\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"ED49gw8ZgNzfwi\",\"output_index\":0,\"sequence_number\":64,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" as\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"kYW80gye8ncxE\",\"output_index\":0,\"sequence_number\":65,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"jhNqssgwxI5g\",\"output_index\":0,\"sequence_number\":66,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" input\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"6w4zhcZwKT\",\"output_index\":0,\"sequence_number\":67,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"CYBTOoDJpiwWL3F\",\"output_index\":0,\"sequence_number\":68,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" After\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"1cpsSLNxM8\",\"output_index\":0,\"sequence_number\":69,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" that\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"HrjSBmjCAQb\",\"output_index\":0,\"sequence_number\":70,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\",\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"6JPrtpyCa1ULoYr\",\"output_index\":0,\"sequence_number\":71,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" I\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"uP4nTTIUkqYKHV\",\"output_index\":0,\"sequence_number\":72,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"’ll\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"qv9XbhGwDgTD6\",\"output_index\":0,\"sequence_number\":73,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" report\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"6OS7xkd4m\",\"output_index\":0,\"sequence_number\":74,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"XoK80d6E98Vd\",\"output_index\":0,\"sequence_number\":75,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" output\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"7MwpR5PF0\",\"output_index\":0,\"sequence_number\":76,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"QLjrBg0WVHk3Y\",\"output_index\":0,\"sequence_number\":77,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"7JUrnQRVWaqq\",\"output_index\":0,\"sequence_number\":78,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" user\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"kIBorssrzAS\",\"output_index\":0,\"sequence_number\":79,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"cukMLBtDRePfNtq\",\"output_index\":0,\"sequence_number\":80,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" Al\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"PFEZ7uBjGxvyn\",\"output_index\":0,\"sequence_number\":81,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"right\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"u3vYOcIquKu\",\"output_index\":0,\"sequence_number\":82,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\",\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"5ylJpRI8Un4sk7L\",\"output_index\":0,\"sequence_number\":83,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" let's\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"W86y9aWBpg\",\"output_index\":0,\"sequence_number\":84,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" get\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"bFqIpCsEUEID\",\"output_index\":0,\"sequence_number\":85,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" going\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"RetJuIJDzi\",\"output_index\":0,\"sequence_number\":86,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" with\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"d8C7DHP49TN\",\"output_index\":0,\"sequence_number\":87,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" this\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"91qGM9dDG7D\",\"output_index\":0,\"sequence_number\":88,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"!\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"obfuscation\":\"4nhuGUdS0bnEb52\",\"output_index\":0,\"sequence_number\":89,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.done\ndata: {\"type\":\"response.reasoning_summary_text.done\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"output_index\":0,\"sequence_number\":90,\"summary_index\":0,\"text\":\"**Executing user command**\\n\\nThe user has asked me to execute a specific command: \\\"Use the run tool to execute exactly this code: print(1).\\\" I need to call the run tool in a commentary format with that precise code, without adding any extra text. So I'll use functions.run and simply provide \\\"print(1)\\\" as the input. After that, I’ll report the output to the user. Alright, let's get going with this!\"}\n\nevent: response.reasoning_summary_part.done\ndata: {\"type\":\"response.reasoning_summary_part.done\",\"item_id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"output_index\":0,\"part\":{\"type\":\"summary_text\",\"text\":\"**Executing user command**\\n\\nThe user has asked me to execute a specific command: \\\"Use the run tool to execute exactly this code: print(1).\\\" I need to call the run tool in a commentary format with that precise code, without adding any extra text. So I'll use functions.run and simply provide \\\"print(1)\\\" as the input. After that, I’ll report the output to the user. Alright, let's get going with this!\"},\"sequence_number\":91,\"summary_index\":0}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkjosFnGGjO4TRcSmsj3HlxWMj1BBWKA-mhvsgfWR3dYQkhL5qS0k4yYQrxqQZXjpe_EvF12-YSaVnus5N_vpoZGLRORA6uaKk61wR1HvS3vYSbTS_FvHkHKlDNnDR2rrkdiKa4hj5pYvp_JJ6cZ1YHEE1LNsiib0Yo2O5i-lLcbSPmv9Xy_XIS7RIQ9F21yqdRNtFZ5FBfmKa9xxhNYs0nXRGxCfM1mmVw4d1y5NBpn4N4f1fXPGNbWna1lJ53Xidgr4itZnqVGxDgMBnlelF4wdYx2SsWngG4HCum5ghaZbqyu2KGnlUzl9t8KUp0n91sVCRnPb_ws-B-2UzE8GTJ8IkxCTDAHVaiIrzvsKt4TxH4w84hN96RdixiCmGx_1zvgFEW4FtdAT3lMHXto5m5LClwfx_VTsT754FgQMJPa7IoiM6N7_Z0g0EjIZoOQcljrD3Mb6X2H_S047MGjCROXSqSp3XZTb-dRIYNJ-Nl3Pe8WWq_tiDeY6U-6bsv9iq_d0zn2nC4EwYJ3PGV_KMYGIUY_iSmO7QHUNV_k4dpI2VXLk-8_OpRbFWErdPkDP0VS_F5_Em-AS0WPDntoB6Ju4mPMN-wCojsYGIncUIjcnEuO9g6yhmHLaA2nBEPjwD2cuVNrp1qiT7hrrAG-Q0Evq4QjwlMga595vNy0eDndlnIfEWq4fhjgGCTQHVnUju1gl9jtLEnQxKCLqo23EvOtBPWxyZYR0RvuS7747Em6KPgDiVWU9uSWpEF2kANQvZE46xNylayC0eXMelH4fsh3N2L4XrULSubhw8eoYy28YVZYFO-ux8H6jvibgHDrXlMrf13ZZWuwmyjKhTWmL0KdCjjOCuNY99TGSsYQW2u6506askQI_EXD6cZDy79KsdMWjdu9vOwqG-7AeYQNGCzMFndOJWbxfpx-e2xxl2giSf0s99AVOiARmN5BPJwNRiszkf4rpvZa6S2g5ONsxRcqOF0dB2bUxwleTsU8hF4pOHhZp9q2L0yYv_wWp0TD_iDs12aQkAA0_3eTsy_1BVoFUNj1f75Gttq9XEx-brAU0NbtziowoCoLNT56r7r18zOC_yDCdFMN-C5jdnr484VB_XH8CwrnBtEfV7KYF4CnXVZWtDfRuyAr_UmS0KlghqCMmwB7OhS-gGfzGRGBm1ZLzBVu0aLW3Jtk7xCihq-rSiW72k7EuRPX2_Qo94GcZ5Un3BBQAcopkZ9T8_P5GmYzH8F4LgUWsACt--kzJwgUj--mlWVdXtGlcHEu-WR95Qq57tKzkveTzW9iAZ2wOQdWywQ81g8Pz8FO7xnkKmcy158w-9GtJ-20OND9F0CGPYuGjP0OfOxqp9uOAWBhNbrJiwiOPlGPgPWLRXTvPhArrjUng8GOhOiBifY02N6mU1f6ArTMh2102qSI8cUeIVuHOFKohPNd-uGi9nTz0l2kr5-uaHL4SjK8QWAvhk4dZykYcW3L6d4JWZ9GoXQz0NXfEgBa0qA8lx_LD2r6z-Qio7hPFXqLoI6AWrJ5VpHCWHLTjX7obDL7tzDupqWWuVeXAxkoaP6Vih89qV7aPEkLhvhCaVETHgDQgShoXS79maZtwprGsHHk6qlPsfU7R6qtSw2xMlt_59aNskv3hR206DG68sdlxm868wC4Ov1YMx1ze4twOLyWTc1VCgDptpt3LaLNrRUlatd3fZvnMklFo4fSTLGmTXZAdGS9maVdwDydbyevSkSF5DgPLoHcV5xJ7w2PtSzshEZ7XlhOxKRHzjV11c7q1nKzQIdLGfGoaTmTzCpfePNvBxghYgQ4UJk9DXpjSPwGZRei1SXUcw48iKKPIYcU1x5eZR5PyDKMzJM7MxkeX1ddXEsTRGOe0YwMK03ExL2XFDw_CdE7Q5rZ-LI0tL1p6m5StgAtOkiP3ylc9cWJTlPmeWxX7CDFnaPOJKi9S688Trw3dce04kOoU-kcGFoSzguS-s3AHr_eVKF8QDDoFAw1Cn0cMQH6BBD5lHgWR54XJY4FlpvafuPL96rP_1xgacboSUo13VoNe96e_Vh4TCgPuUCBQ8Xhej740Rh-H4sL6FUDmmbw2YviKI18zLiF5Ow8poidQiHpocwlU8nDf8WJwL0VydOoHjp3Xs_GV0h6KDbpwqsyLC1p_iAy94RolJglk6SPPNUjz55My1lvEjJjVlclZZjx3lgEkbQC9eUwpvfy33UCP9wFpquhIXY-rvfKKVVlsdQOrrKuhUbQinafpRcDm6Iz9yVO_FLosvpGAaz6-alM_CgsCmdXHeF8imzlUU9bQsamvrCzPzo98NcdNo0Qpsb1sdZwPPS85lfi6y1NEq7zV7DVjuuBtuoZt6XpeeXNl0_w9IsKfkNRReffZzw05shPh00svaQefMaLLvVTWfPrNdUdZM=\",\"summary\":[{\"type\":\"summary_text\",\"text\":\"**Executing user command**\\n\\nThe user has asked me to execute a specific command: \\\"Use the run tool to execute exactly this code: print(1).\\\" I need to call the run tool in a commentary format with that precise code, without adding any extra text. So I'll use functions.run and simply provide \\\"print(1)\\\" as the input. After that, I’ll report the output to the user. Alright, let's get going with this!\"}]},\"output_index\":0,\"sequence_number\":92}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"type\":\"custom_tool_call\",\"status\":\"in_progress\",\"call_id\":\"call_gj2T8nUuz2YiWDbLq4Pz8LAK\",\"input\":\"\",\"name\":\"run\"},\"output_index\":1,\"sequence_number\":93}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"delta\":\"print\",\"item_id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"obfuscation\":\"aSYGxfTRT2v\",\"output_index\":1,\"sequence_number\":94}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"delta\":\"(\",\"item_id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"obfuscation\":\"Nv9YDCF4DElhY5x\",\"output_index\":1,\"sequence_number\":95}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"delta\":\"1\",\"item_id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"obfuscation\":\"jl0fC18N0rusTKf\",\"output_index\":1,\"sequence_number\":96}\n\nevent: response.custom_tool_call_input.delta\ndata: {\"type\":\"response.custom_tool_call_input.delta\",\"delta\":\")\",\"item_id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"obfuscation\":\"o1aSa11h6vPLXwg\",\"output_index\":1,\"sequence_number\":97}\n\nevent: response.custom_tool_call_input.done\ndata: {\"type\":\"response.custom_tool_call_input.done\",\"input\":\"print(1)\",\"item_id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"output_index\":1,\"sequence_number\":98}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"type\":\"custom_tool_call\",\"status\":\"completed\",\"call_id\":\"call_gj2T8nUuz2YiWDbLq4Pz8LAK\",\"input\":\"print(1)\",\"name\":\"run\"},\"output_index\":1,\"sequence_number\":99}\n\nevent: response.completed\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp_06e0a7476e581c2b016ae24921582487d19218cdaf42cc0046\",\"object\":\"response\",\"created_at\":1793214753,\"status\":\"completed\",\"access_programs\":null,\"background\":false,\"completed_at\":1793214755,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[{\"id\":\"rs_06e0a7476e581c2b016ae24921f9f487d1bf537ff92fff14e1\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkjeuXByewZQFTg_Pb3oAmzakc6cuaogcbplzFvDwteSx3L3tZ8LfMHVUi3aIbG35Ee_Wdb6EGvjvZ5tKlLbQyAWTXjKngb9ONk9LkSnE2gnH8ayaXwplapXULqMyQp5u9EA2pY0mJxRMJMxZl_-8Yr0V3zcwUJzSE7nxJgzu4u2IcZdM8DltCF3qvfocjKt1KhAiggMr7_vVJA0KrAxEQyalsfK6hrk-zwHfcagKaxmIZVJeurtMSach_Cmzv72UzQRCPrZ7BXCRrYaqI8QeeNtDg2Ad21LUpP0Pru-DvmH1mv5OIMTydzTXAuYK_Hh7PhSOetJoWEfFkr7BqIaHX60ISA0YXDdYTVq615PytPYGT_irDQ3RvlKaDXD0SDMg5azRIArqHOjcFzXrvFe6DOc5BpgZFf7OGtdRsfefDlZHKaQdOWTlj7kpeLj3sYMmuAJNNLccdhRhybR_ALh41iQCI7PS9CbCK7fp5BHBKEM4pxH0VCShtD2sjiNkN2uNZRLxkwy5174pJ-QB-vdMei39R4HQ9D5BrddRh2yQW6kLfECWLIagaqzqVGZ9ABNjEXS7Rfi59_asbMuZItS5zMkur4gLGYtj1YHJmgdCCPYDTR48ybXbnOM4yMcdnKBduMNpuDo0iu37oaAICqTr8OTcNorl62GgCRsV4z7Y5Ao_PUkW3N3sQZ0aj1y9Pu4SwnS-Qw-77GvJBJbW_2rIMKl2iJuVf6XYGlO7jBJQhnI7DeeUYaryLsm_l_JBxaHldd9KCpk9hQGgTuafWAR_tJ3ijS1z-5ziLJ8D2uHvClXnkCK9aOtCEbGlqEHBheOTiwTKE5Qei_xCr4H0WWMxp7AAlfHDW4H9kB1XWT1rKdP82pmUecF-8jQHRLgRlovNlh2Ygtv3KO3Mcj6SUHhgoh8i-h6P2RDoUmSQ6yezIC9nGN3HnXy6q-8ehboRKsYIiFLtBF1pa6Spdeq4EomLEjJ3o9RCexXxxqutvjtP4xIBf6o3hbG5ppBeiMNKrk12Y5hp_8Ee35Ugcua0eo9EN1FlWajBAgFuXgp-p4SDarD-SL9zyHsa0K6EUfAAFlTGlCXL0iLw6q6UUnLVWEbqzgcGnGpYnY8gdYiA7aIJxjAEzR6cxpMZpLLM7Cq7PF9mvBLuql5Zi2mLf6kY_JlCbm92wwcvBPVOhyqOHpQCikTqdcIrQ0jPgycWB6CRNxzckt8attvLrdYTigMd78LgWE-HeyXstaCSGM0FKB06I3FFHhPjQvDRJ7iiAU3R9wzvuQay0BS9GmBId2c7DKOPG1oPfxAR1TFc5N_V2LMV_j5BAoHXJ6QbTDT42cNFFqmkwoDUw6D51qEtJjgH3npUZjR9EP1i0lWxfF9BTVBceA7XbDuUSMvrnhHtr_xzmjb-Cpu3LmMWlWFroYHEOxLNxWbY0U3WpAFMhYgQdCM-zLROLPNaXrHtA2kv8b6S3Xh0baD_8Ja33imIB28EzQ2ptSFWRoRP0OKhE78R4m9p9KE0eTwjNzFy37runKPPr_qvvmtWfSPmxmxDEtjWWOoIt2-eTMRLtKAXV0Q2lTzCY9fVCgKS6VPm6pgdKNW7xpTSkI0m7u4CE03Vj6ZEOdushzu7sVedxmVC36ZhNRcTGBAtChZRVnBqB4g9CizVq4Oa5lApaY-TTcNSki7QldllPd4OHCnW2PPOQsCMZ7dpdnyWQ0lrIRk7HzEapnH5GemFoi46vBSr5yrQymcVn5fhaBsVkrAjZ--Eh9fhqxDLvrHvE0mT5I-gtTlNRa7AY-8dTjLvMHktVm-UTl2FkhLpB0sO2gSok0pAOFR48Z5mSlR-S-dMsxPwKKfNJNb6bYgQDYeUzwICJxnl_2g_NHf_Z2JGjoSpiIWLQrocWKzRqRkDiX0_B2NgazyV6cjZOswyp1ct4GerKNGKmj5E7bJwQYwrRfWjkw2GEWkqKowwkU6ZDEga6BcJwRZ5pGGljjl0fF0M1y1Wy8u4XcqIc1Zh9YxSQdT20ncuwgQ-Jfvjb8VYZ-coAUGFztQxHtv8hvm4ypoXFa1amy3nfkHsV2P_Qa3yzU9vPZj729I4yuiNt6MP9NVG_c964gxIdFvcTTucXMNJ0-LICPWY_F--qH1nc_Sz3K624fd4sw1d9saV_swSuaBQYVEt_b3XzuGi4YYlA6jRwbaZRwZFqGBXaR8u2UqVj-B_xJS1MdYOfz-zukpVe-cDM9x3a7dGW6yPgONsQoAVTSnFulLz7Or2Tt64d4-u4aAgyeOveVDtsrkhp8eKqG58shJElvDiItXC_dckGP9f3O0Y3I1BgOlxT_8CHVCNq6qSJWYaUvjDukjuoiHXcbbhyAIFXcQ4wVwbYgEkPv4L3YxQbwWd-B-jMiLxuMxwS2SQrsnarGTNdpI3ezdSg=\",\"summary\":[{\"type\":\"summary_text\",\"text\":\"**Executing user command**\\n\\nThe user has asked me to execute a specific command: \\\"Use the run tool to execute exactly this code: print(1).\\\" I need to call the run tool in a commentary format with that precise code, without adding any extra text. So I'll use functions.run and simply provide \\\"print(1)\\\" as the input. After that, I’ll report the output to the user. Alright, let's get going with this!\"}]},{\"id\":\"ctc_06e0a7476e581c2b016ae249238c0487d1bfd447623603d46e\",\"type\":\"custom_tool_call\",\"status\":\"completed\",\"call_id\":\"call_gj2T8nUuz2YiWDbLq4Pz8LAK\",\"input\":\"print(1)\",\"name\":\"run\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"default\",\"store\":false,\"temperature\":1,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"required\",\"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\":\"custom\",\"description\":\"Run a Python snippet.\",\"format\":{\"type\":\"text\"},\"name\":\"run\"}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"input_tokens\":64,\"input_tokens_details\":{\"cache_write_tokens\":0,\"cached_tokens\":0},\"output_tokens\":87,\"output_tokens_details\":{\"reasoning_tokens\":71},\"total_tokens\":151},\"metadata\":{}},\"sequence_number\":100}\n\ndata: [DONE]\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/venice-responses/continues-a-tool-call.json b/packages/ai/test/fixtures/recordings/venice-responses/continues-a-tool-call.json new file mode 100644 index 000000000000..e8d181bfd4b3 --- /dev/null +++ b/packages/ai/test/fixtures/recordings/venice-responses/continues-a-tool-call.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "metadata": { + "model": "openai-gpt-54-mini", + "tags": [ + "prefix:venice-responses", + "provider:venice", + "protocol:open-responses", + "tool", + "tool-loop" + ], + "name": "venice-responses/continues-a-tool-call", + "recordedAt": "2026-10-28T19:12:11.572Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://api.venice.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-54-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"What is the weather in Paris?\"}]}],\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream; charset=utf-8" + }, + "body": "event: response.created\ndata: {\"type\":\"response.created\",\"response\":{\"id\":\"resp_05980898d988ddab016ae24908f88487d1ad6408097d25b6c1\",\"object\":\"response\",\"created_at\":1793214728,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":0}\n\nevent: response.in_progress\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"resp_05980898d988ddab016ae24908f88487d1ad6408097d25b6c1\",\"object\":\"response\",\"created_at\":1793214728,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":1}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkJUqduxoApjOV-QgI0M6PnFiyVmxeWOzA1N7YLY5CW0MpZiq1xlg7wCcaoKrP77fz88-ypOJ6L7ZgMowXqsOHFgT40anf_QCsC7SXxvRSCN71-nB8w4CN9DolCSgcpD5JydrEVtdNZuK6O3fw3PLyRXbqL8dawd6DiSaCV0ZnO3zCp2v_YEtneBLY7m4Wam1lZDwiTS1OCToVw8OlD9JbjrU5RkukDP5Sm36gKOPdonwB-6R2OprRZ352fYYpyEdMS7BGSmDuyXQSCsq-mDIooy-a3eyagE8v7QmbVeKjyNzzQmbofa5mbYGpcM5MxlGCJi_U_hzOBjdrhM59vUuyJ8tLSKNKbTkLiN-ADUYDtZJf8TE06B6sDEfdmztDVFvI31SlQs0Fz0NVOOTkp6AdkUJPEGtxGKcHq2D-69U05onZktxuMgZPrGzGkcFimh7hR_fDr2-CloSx2iT1Py8WOQXpAoF-w3rcjojaM4DyoNZasiEmWxTDlsHUo7oqJtSSsjTqkHBtuANPGLJSysuThIqhRPhL7rJKGNc_qUjJfWyvJt6wWM2qEzeiT0uRCNFRpedfG_EDkwF7Cth-NmWb5kFkwbiVlHF30uIazq9Ud1UKr6tW8KMMo9SVlVoOicyV6x72hUOjS7m-6npP7Wa5zfzokBiMlKlh9Eg465uyE2xZw1XEJELSNlOJ_JJoerFWdQOtLtwfhAc5eCUaPSk6291pm6kjI_GUYpJkicQPmhjyIhcNlBe3_ccvuwx1Zi_07BDulll8zvnuc2ikMDhahValeqczYdV9VC31LOkvq8aiCJAU9-icXCXHWfeTlBgVHmAk4DPJLFcy4pPWAj0aNPZyX89NcwL9phf-eUTmmr0D1JSzUKkutI-Kp-XlO0W2QmB_1aWfyzeiGRDWBGCEvRCpSfnr7htxeP5u-dxCWmn6DPyOnrIhq4isBdQPmSUA_Hf4XtrbHlvf5WA5EBnf8m8VrDNpoWfm3bFdz9Zm5yoVZ-SnUJ9IZusD0D4PiOi1G_ddBX18TFJKmMf2bCHLxq1RYgBxrjmkvdrw3LGwSpplx2lRK1AddRoNqOGknLkaB1h3Tv4N5fIA0R73Rst-wegOQRM7x78XunjDuyRxnsIz994iZd_IVPoHx-wX8LsYZK_I6UTLZk4cSj2hT-tk_PA9FD6LIuX5TAGl4iqce6aT10v7VnZxNkts0YNg1hwndK5V-7D8DuLYCHB0qdFU1FvdqanvCtu4GFjzv-diMJn7y0xDmjOhs4XCD5tFYctUHvkFQn0o2-2RFfrmjy3bhFWNo4-nhOXX5CCFCFhpAhwoknTtC3lC7OqrafWZ-9Uo-\",\"summary\":[]},\"output_index\":0,\"sequence_number\":2}\n\nevent: response.reasoning_summary_part.added\ndata: {\"type\":\"response.reasoning_summary_part.added\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"output_index\":0,\"part\":{\"type\":\"summary_text\",\"text\":\"\"},\"sequence_number\":3,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"**Retrieving weather information**\\n\\nI\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"cvYWUAmdPdf\",\"output_index\":0,\"sequence_number\":4,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" need\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"HbfsDRXYWnf\",\"output_index\":0,\"sequence_number\":5,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"8ImKfZzqin4UL\",\"output_index\":0,\"sequence_number\":6,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" provide\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"6oal5ZKo\",\"output_index\":0,\"sequence_number\":7,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" a\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"h1ZZydqJktgDwi\",\"output_index\":0,\"sequence_number\":8,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" short\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"BlaAQwcjzR\",\"output_index\":0,\"sequence_number\":9,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" sentence\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"kQQWdR1\",\"output_index\":0,\"sequence_number\":10,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" about\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"329wq92xQH\",\"output_index\":0,\"sequence_number\":11,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"n8fBbqzy8YwW\",\"output_index\":0,\"sequence_number\":12,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" weather\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"kMkeHGwn\",\"output_index\":0,\"sequence_number\":13,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\",\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"q3U1ZzIbtde0Qsq\",\"output_index\":0,\"sequence_number\":14,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" so\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"65tkv1i6YdlGa\",\"output_index\":0,\"sequence_number\":15,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" I\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"NH47GLU9OOUbzz\",\"output_index\":0,\"sequence_number\":16,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"’ll\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"wb7Rnc8wGPSoq\",\"output_index\":0,\"sequence_number\":17,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" start\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"nRhz4gkDEn\",\"output_index\":0,\"sequence_number\":18,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" by\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"GAzqt2Slt96cX\",\"output_index\":0,\"sequence_number\":19,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" using\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"cNpdHLH0rt\",\"output_index\":0,\"sequence_number\":20,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"HL3QIIFeR4Mz\",\"output_index\":0,\"sequence_number\":21,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" get\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"NJYITT1ZDnOz\",\"output_index\":0,\"sequence_number\":22,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"_weather\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"j7JcZcMr\",\"output_index\":0,\"sequence_number\":23,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" tool\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"6gVnOjmEzJI\",\"output_index\":0,\"sequence_number\":24,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"OQ6mfwLWrLNFshY\",\"output_index\":0,\"sequence_number\":25,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" It\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"xNv4PIZE6Od94\",\"output_index\":0,\"sequence_number\":26,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"’s\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"XaYSBAcOppjoO8\",\"output_index\":0,\"sequence_number\":27,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" essential\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"I3LOSI\",\"output_index\":0,\"sequence_number\":28,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"RvZiO4QC3afl0\",\"output_index\":0,\"sequence_number\":29,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" make\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"BkWQNuxt0D1\",\"output_index\":0,\"sequence_number\":30,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" sure\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"zqcaXUy6d3r\",\"output_index\":0,\"sequence_number\":31,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" I\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"LrHAkRejvXvfu1\",\"output_index\":0,\"sequence_number\":32,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"’m\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"m9LSdOtnBgYVQP\",\"output_index\":0,\"sequence_number\":33,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" calling\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"d1YFeLXS\",\"output_index\":0,\"sequence_number\":34,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" it\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"m2HGottthER78\",\"output_index\":0,\"sequence_number\":35,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" in\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"upat3xlIoPCbh\",\"output_index\":0,\"sequence_number\":36,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"VQ2ekryvynef\",\"output_index\":0,\"sequence_number\":37,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" commentary\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"wl43W\",\"output_index\":0,\"sequence_number\":38,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" channel\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"eIpwFEl2\",\"output_index\":0,\"sequence_number\":39,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"rzD8ppvfeuZIeMx\",\"output_index\":0,\"sequence_number\":40,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" Let\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"hLvluE15Wi3k\",\"output_index\":0,\"sequence_number\":41,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"’s\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"UhAqBN6iOy37nJ\",\"output_index\":0,\"sequence_number\":42,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" focus\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"VbXFYWpNHM\",\"output_index\":0,\"sequence_number\":43,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" on\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"nssVS5oEZlaLX\",\"output_index\":0,\"sequence_number\":44,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" gathering\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"631DhH\",\"output_index\":0,\"sequence_number\":45,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"yMZh1X9s0Jx6\",\"output_index\":0,\"sequence_number\":46,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" weather\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"vxXd39cm\",\"output_index\":0,\"sequence_number\":47,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" for\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"CXzKQeMIla7O\",\"output_index\":0,\"sequence_number\":48,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" Paris\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"gSWPNrqNCb\",\"output_index\":0,\"sequence_number\":49,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" specifically\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"OS1\",\"output_index\":0,\"sequence_number\":50,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"E5NnlYDDbzYjiuE\",\"output_index\":0,\"sequence_number\":51,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" This\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"IrxdzLrNJhC\",\"output_index\":0,\"sequence_number\":52,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" should\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"Y0Petl1gP\",\"output_index\":0,\"sequence_number\":53,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" set\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"rSRLRNrBuUXW\",\"output_index\":0,\"sequence_number\":54,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" me\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"7XVcDTSSX8qmO\",\"output_index\":0,\"sequence_number\":55,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" up\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"XPnKyO9Mbukrh\",\"output_index\":0,\"sequence_number\":56,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"iKzDaFvozzZ8u\",\"output_index\":0,\"sequence_number\":57,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" deliver\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"CYSvttVl\",\"output_index\":0,\"sequence_number\":58,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" concise\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"Ij6fGNG9\",\"output_index\":0,\"sequence_number\":59,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" and\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"glzf7ZKuJKiJ\",\"output_index\":0,\"sequence_number\":60,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" accurate\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"ZyrdE95\",\"output_index\":0,\"sequence_number\":61,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" information\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"LeFF\",\"output_index\":0,\"sequence_number\":62,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" effectively\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"8Zic\",\"output_index\":0,\"sequence_number\":63,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\".\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"o7x1yfQlE0dHj3n\",\"output_index\":0,\"sequence_number\":64,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" I'm\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"FaYSYo6irbRb\",\"output_index\":0,\"sequence_number\":65,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" curious\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"QQ2nvogp\",\"output_index\":0,\"sequence_number\":66,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" to\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"6OoUFxEdBIL8P\",\"output_index\":0,\"sequence_number\":67,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" see\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"MOAZFEYdWuOl\",\"output_index\":0,\"sequence_number\":68,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" what\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"4pnbxSmQwEs\",\"output_index\":0,\"sequence_number\":69,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" the\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"C1MJRlN1Nxfq\",\"output_index\":0,\"sequence_number\":70,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" weather\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"1TEgTprH\",\"output_index\":0,\"sequence_number\":71,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" will\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"7S2JxeeyglZ\",\"output_index\":0,\"sequence_number\":72,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" be\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"V470GJyUbB9nM\",\"output_index\":0,\"sequence_number\":73,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\" like\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"abelmAqfSh4\",\"output_index\":0,\"sequence_number\":74,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.delta\ndata: {\"type\":\"response.reasoning_summary_text.delta\",\"delta\":\"!\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"obfuscation\":\"zU9GajEWoN9t74t\",\"output_index\":0,\"sequence_number\":75,\"summary_index\":0}\n\nevent: response.reasoning_summary_text.done\ndata: {\"type\":\"response.reasoning_summary_text.done\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"output_index\":0,\"sequence_number\":76,\"summary_index\":0,\"text\":\"**Retrieving weather information**\\n\\nI need to provide a short sentence about the weather, so I’ll start by using the get_weather tool. It’s essential to make sure I’m calling it in the commentary channel. Let’s focus on gathering the weather for Paris specifically. This should set me up to deliver concise and accurate information effectively. I'm curious to see what the weather will be like!\"}\n\nevent: response.reasoning_summary_part.done\ndata: {\"type\":\"response.reasoning_summary_part.done\",\"item_id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"output_index\":0,\"part\":{\"type\":\"summary_text\",\"text\":\"**Retrieving weather information**\\n\\nI need to provide a short sentence about the weather, so I’ll start by using the get_weather tool. It’s essential to make sure I’m calling it in the commentary channel. Let’s focus on gathering the weather for Paris specifically. This should set me up to deliver concise and accurate information effectively. I'm curious to see what the weather will be like!\"},\"sequence_number\":77,\"summary_index\":0}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkKw5bq5wrcwxIYomMV4hSXwL9lS2C375VylPdyAc7Jm105V-63GU-VhVb_z3hnM84XgYfJI6DrD0w9KNhUojqcON2XCqZdFj1iTXQVcG78XMeeSEg6LsaMoHsNfuaPhl7oepmOeB23PdRJPy4G8HGkOEmer1Y32u-uwUImyPRiFQ2VFh-tiWFnkNTn-9Zu2hl2TO2eyOrGlS7EjynZCfAunEE6NiDyckvNUZT9aTv39R_3pH5OWdn8SHUCn6rgZlaZPZ1_yyfDz5mdPnsloNqyidqxXuU4JNKMesXHDHhuvlpE3MhPQydDTK0dK1vHtcj50j199HLchNnEi_C6Ed7AQPqqi-Md73S-Qn8X5N-lYEQleC2ZDTl7PT0GuFJx-o60gks3oega8BqJoO0px8-gSJQg0C3_RCIPoDGdrj_D0WjQKp25dDHifV1YPsrw3Y314zQBwTR_qIFJ9-fp7qE30rmrX4hb58JBBE4xpYswTngbctEwVbv3LCI5yBlus7rnIuv9YUGLPk7EfD-cQRgen_h7HQdt6a5zX2mXthBCrVGbQenD8hRBF9gC6NSkQ3vIjxd9YkXFI7NPz7zvxBXqCqfwbfyayPye1K-kiMW9oYSCgBzNoIgMA2_TB1FEO7duf3J1aADscktr7DEvmGm_xH8ydLLrLYCAGTCp-ShE47LQzUMeQsT64hXaSpVomvr-D92_9kdCHjn3bZa_nfuKVk9x5Q3QZhs5T0r4RTvvoL8bUEycOCdyZ3mbIUOan2qmzJ9R56K0G4khkXk47jf5NqX6cysggUg4BxgxglGuSUcTk3MhuR-gvYF5MBxf_EXKbxWFM6r3AOBVh2V4CvtaLvLOGwvf3EUAS1LWvCYfPfHeH6iST2kZuvIr2cUjlST_M_hr2DwA63xaNid82jUQM6AxfXD5iREChzvg-9-poqHneQ2DXR7pl8go5A-AyaKuwfLVcdMnBqidqRRk8xn9fmhDAqw7g4eBN6AOn2-71IdQSNVxeG4fENvK7iRJw1eO4ZnKeZY2vyNrVN-hhuLykoxan9uEC3G6F5BaiEud36u0Pmg4UKEdZANhkYhKHmIDibv21HU4XSQd27ge52qkrAnQEGq4gURr3dw3GmAaOqDxMV7PJbcZ9ie-2LC__4qXsp2tjW0rXUliRpZjmLBiIi-TbyqwDLVHIYW5YRED_DTm2mq7DSN6rDnEkTY_yFHQ0p06jQ1xVJWPud7WnnddLLe6BNYWb0lMd61JcibgpIUYwasMkvM43DgvNs99xw6MuXiG3MTdaCC-xDF5VPkcuRCeqBQHCxOSe1m9fYC8STbq2m_L9b7KKPT3IYD_3GWhRQplDJXrfC3YBh9iqJQz1mNL-Vvsk49SzfreiXFfq6iAFxSFNywUmr7NvyDl36WsPbDcu7oCbXVYb-pDYr5ILWObauAzV3OiPDXLfIgknH4eXibNXmrKkwMwEtXnwv3KB3UmMTop15vNp5N3dRhlMmgu_L3meK37pl07OIzihZGVN70SsBbxjNGi8t1zLhnA4gA9nsX70DuSNJ3Kf78AjM-o03qd6LLrvf8g-2Gc77JqnvG9tpk7VtWmSuPHn9NW-rw-eSLGUr6_7y1lnz7XOg0x70sb9KewduT3zgCTgfA5ip1tp1mSZma_StTL8zZ7ewzxFUrPJJtjiZX1FhxhXhP1LMJLV-q-8aHHg8WmbOtHo6zUSCudStro20R6GX9Gy0g2vwOBfkrHG-HK9FTvArI1aeelSJ2Vt0za7HE7_yv1xGCLdQUYPw9oskxG_gUNjtQy85l6044BjPQqL2iO27w9y9Vmt_kFox7sA_gTlvGwvPWeoMxKciNi8xLIhzG3w4EyVnEkwCz4J8iGjDlRJDatyn5vmLXeow4CrsoNDZaxWRfgzjK-4iUbr93A0amG6NBKjmaVxLDhkAacgVlLnnwZiYsZ73vbXa4M6ZFCPHA=\",\"summary\":[{\"type\":\"summary_text\",\"text\":\"**Retrieving weather information**\\n\\nI need to provide a short sentence about the weather, so I’ll start by using the get_weather tool. It’s essential to make sure I’m calling it in the commentary channel. Let’s focus on gathering the weather for Paris specifically. This should set me up to deliver concise and accurate information effectively. I'm curious to see what the weather will be like!\"}]},\"output_index\":0,\"sequence_number\":78}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"type\":\"function_call\",\"status\":\"in_progress\",\"arguments\":\"\",\"call_id\":\"call_Ebs9709kzV8gdmgZ0LCGyC9S\",\"name\":\"get_weather\"},\"output_index\":1,\"sequence_number\":79}\n\nevent: response.function_call_arguments.delta\ndata: {\"type\":\"response.function_call_arguments.delta\",\"delta\":\"{\\\"\",\"item_id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"obfuscation\":\"TzevqnIuElinqk\",\"output_index\":1,\"sequence_number\":80}\n\nevent: response.function_call_arguments.delta\ndata: {\"type\":\"response.function_call_arguments.delta\",\"delta\":\"city\",\"item_id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"obfuscation\":\"JuOuL59Yj7VG\",\"output_index\":1,\"sequence_number\":81}\n\nevent: response.function_call_arguments.delta\ndata: {\"type\":\"response.function_call_arguments.delta\",\"delta\":\"\\\":\\\"\",\"item_id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"obfuscation\":\"6lhjcodYEU4fE\",\"output_index\":1,\"sequence_number\":82}\n\nevent: response.function_call_arguments.delta\ndata: {\"type\":\"response.function_call_arguments.delta\",\"delta\":\"Paris\",\"item_id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"obfuscation\":\"RUlFmcKikJD\",\"output_index\":1,\"sequence_number\":83}\n\nevent: response.function_call_arguments.delta\ndata: {\"type\":\"response.function_call_arguments.delta\",\"delta\":\"\\\"}\",\"item_id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"obfuscation\":\"CpZUkInZUkvFmO\",\"output_index\":1,\"sequence_number\":84}\n\nevent: response.function_call_arguments.done\ndata: {\"type\":\"response.function_call_arguments.done\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"item_id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"output_index\":1,\"sequence_number\":85}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"type\":\"function_call\",\"status\":\"completed\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"call_id\":\"call_Ebs9709kzV8gdmgZ0LCGyC9S\",\"name\":\"get_weather\"},\"output_index\":1,\"sequence_number\":86}\n\nevent: response.completed\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp_05980898d988ddab016ae24908f88487d1ad6408097d25b6c1\",\"object\":\"response\",\"created_at\":1793214728,\"status\":\"completed\",\"access_programs\":null,\"background\":false,\"completed_at\":1793214730,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[{\"id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkKu4yWp2-RQOsbrkBog4CBESTsiDi0ixsCAWsvcYZDq6EBA1fEt7iiXYgR5GBbpyqTXcP0pcc7GCMMptX_XFjixrmyQWCn8wgaeahn7T3dHpHiuv4J9Z3mtqy_At6_2W8C15DxsnqkYwnKNoBV-Fzx3VspWwWB8-1bLN4O26H_MzeX_cO3oo5Gglxiq4VynF8nCyaxWV5Me7yZXrtNooqrEunJ8MEVY6PXb4loTiwrFnUkINw3T2RbWsnOx62ng28M0tOCc6-hvHg4mgyjC-ZbNjzFA-oRuME6OaWTyXn0YsvxdcXRR36yY34eL2ZZ1xZSpb4cxmZ5BQHycXb4RZDp2iR5H2USUTwafYgArPqH3bW_9zS_51SzrP_ixSpxoz0NboUQONHQVwCv3ejcpENZsLC9Yte3sxt_U5djbJ8bVO4KNgXIg7eiSKDitKP8w9cu1SAgSZlJlWvrXmtC_JeS14TmI5aXAP3PZFNUMCWLSjFXCe87d3bsKdhtImQ2zXvfHca-Gzcyn4L20TGyF1NpNZ0VaBpedhct7_kp6KO-ju_gjVio_7wRQozLUHZENb2P_0RGPAW7eH8fF-FYDXqDS2_BuCMUayE7e5xu8ZvjH_Vn3WZ72oSFbFEKMwZvyswzgr_U1GCgnoq7yfoIYZRM0yl0tvblCy4Tp4iorWlnsKKR81gtVtF6_QctNhZgB0NV3NxVvAHtXJQaB2RFI6kzVrQ4Ge6XPbTabrimo0KdrttgfDfxWOg5AgPb0aansEuI9zblR63Yx4y8B-TK-u67a58Apw7ElumlQgyNA_y7RFk-7h4kT9H1C85PgKGaPFs8gXzFpVwH8zU8QDzoqH6Xhd9s3jQXJDRmP_qzbwlfdtdWR8aEc1FWsNW-2hlt1c1SxiPn0N2h8f0HZ7KtmKww2dru0jisBCd3I5sfIjmXTANPSPpUZ7Sebw9dPqxkVH-OBdJeqNRFCza2mDk5i1REliN3NSoorkZMm7NNWrYLg3iReNyLez-Sp0Lc_XD3nX47klgZLvdDXiNQQCBewirT_Lc2TjDaSqPQ-JnGBrWfx3fPEILDR6oRs95S9ekAVECL9UhsMy2Mh2bM1cewroDo925E7Aw5TY2ywuIWUlueh_Gr8Xk7BOcZdVZqGjqsdnAv-eW4EbRAvs_A-TeiSpyQOBvygSruCguq7KulE8Cka3GR77jTNCCpYEo6KxIC9LU67X_3QV9ssGBXse1pwFvvN_Y3HMBJCp1ndeVju9ndLB-kjexRH5Mam4beStUk26JHNPBV0w85g2n6xDd3mrr3sQt5Ec2bSISMS0woXjU8_15sZcEwx5NTDxrU-97uwseWTz-ZUTxErcqlpYh2gxVsOy43PIT1CEyRcuFRF8nHIHYktwvNB3XohduLGx7Ka7dRqHNAfqoBmvWpO4ViDu9xaIwCOMqywQNIQb8PrflwW1KKiaIy3ETsYldJUji8ObCj8PPWw6cr-1IPQVcAvFV9N1_AbQvlY1yXpnLAH5oHMe6IpKXfEm3C0pVnhgCdEZkMyYt1OQa2kVLH4TltfFBkyHVYqYYL3HE1w3sjU1a5O0m7GS2EpnvDr8zWWyaO4mLW8TZaodId26Q-KB24u5XNQ1tCQNy1b8HYb8LXOjIH7eo8R6NVVrHI9O22kA9EPzE_Ds9-eBy18-qnNQp4sj0CT2_KEFMjtYODXeg6gChdA0OI6rld_ZDiYtxXZzBQg760hQRyh3QK1gS-1NOSR8xutL3OgijjTZzIKHXtNMgvI3uBirLsNGrd0-WLbawz0GY8af2zlwhZQoxY1bdKJ-fP-6DkH9TNjhyav2Ax1HBxYgNJSjKOxntnRoVX81kIVJH1p1JF-6vwPqODbmGYoXaL2pw_HjTruAaqhRjaChYGaCGWxVUjg4skQ-Bq3U1ltb3kYAqOrfGvusmMS7xvdD8SEDNnAeo7w4FykBQt8OX2waI=\",\"summary\":[{\"type\":\"summary_text\",\"text\":\"**Retrieving weather information**\\n\\nI need to provide a short sentence about the weather, so I’ll start by using the get_weather tool. It’s essential to make sure I’m calling it in the commentary channel. Let’s focus on gathering the weather for Paris specifically. This should set me up to deliver concise and accurate information effectively. I'm curious to see what the weather will be like!\"}]},{\"id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"type\":\"function_call\",\"status\":\"completed\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\",\"call_id\":\"call_Ebs9709kzV8gdmgZ0LCGyC9S\",\"name\":\"get_weather\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"default\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"input_tokens\":67,\"input_tokens_details\":{\"cache_write_tokens\":0,\"cached_tokens\":0},\"output_tokens\":50,\"output_tokens_details\":{\"reasoning_tokens\":30},\"total_tokens\":117},\"metadata\":{}},\"sequence_number\":87}\n\ndata: [DONE]\n\n" + } + }, + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://api.venice.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-54-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"What is the weather in Paris?\"}]},{\"type\":\"reasoning\",\"id\":\"rs_05980898d988ddab016ae24909723487d1b758d82073a55dab\",\"summary\":[{\"type\":\"summary_text\",\"text\":\"**Retrieving weather information**\\n\\nI need to provide a short sentence about the weather, so I’ll start by using the get_weather tool. It’s essential to make sure I’m calling it in the commentary channel. Let’s focus on gathering the weather for Paris specifically. This should set me up to deliver concise and accurate information effectively. I'm curious to see what the weather will be like!\"}],\"encrypted_content\":\"gAAAAABq4kkKw5bq5wrcwxIYomMV4hSXwL9lS2C375VylPdyAc7Jm105V-63GU-VhVb_z3hnM84XgYfJI6DrD0w9KNhUojqcON2XCqZdFj1iTXQVcG78XMeeSEg6LsaMoHsNfuaPhl7oepmOeB23PdRJPy4G8HGkOEmer1Y32u-uwUImyPRiFQ2VFh-tiWFnkNTn-9Zu2hl2TO2eyOrGlS7EjynZCfAunEE6NiDyckvNUZT9aTv39R_3pH5OWdn8SHUCn6rgZlaZPZ1_yyfDz5mdPnsloNqyidqxXuU4JNKMesXHDHhuvlpE3MhPQydDTK0dK1vHtcj50j199HLchNnEi_C6Ed7AQPqqi-Md73S-Qn8X5N-lYEQleC2ZDTl7PT0GuFJx-o60gks3oega8BqJoO0px8-gSJQg0C3_RCIPoDGdrj_D0WjQKp25dDHifV1YPsrw3Y314zQBwTR_qIFJ9-fp7qE30rmrX4hb58JBBE4xpYswTngbctEwVbv3LCI5yBlus7rnIuv9YUGLPk7EfD-cQRgen_h7HQdt6a5zX2mXthBCrVGbQenD8hRBF9gC6NSkQ3vIjxd9YkXFI7NPz7zvxBXqCqfwbfyayPye1K-kiMW9oYSCgBzNoIgMA2_TB1FEO7duf3J1aADscktr7DEvmGm_xH8ydLLrLYCAGTCp-ShE47LQzUMeQsT64hXaSpVomvr-D92_9kdCHjn3bZa_nfuKVk9x5Q3QZhs5T0r4RTvvoL8bUEycOCdyZ3mbIUOan2qmzJ9R56K0G4khkXk47jf5NqX6cysggUg4BxgxglGuSUcTk3MhuR-gvYF5MBxf_EXKbxWFM6r3AOBVh2V4CvtaLvLOGwvf3EUAS1LWvCYfPfHeH6iST2kZuvIr2cUjlST_M_hr2DwA63xaNid82jUQM6AxfXD5iREChzvg-9-poqHneQ2DXR7pl8go5A-AyaKuwfLVcdMnBqidqRRk8xn9fmhDAqw7g4eBN6AOn2-71IdQSNVxeG4fENvK7iRJw1eO4ZnKeZY2vyNrVN-hhuLykoxan9uEC3G6F5BaiEud36u0Pmg4UKEdZANhkYhKHmIDibv21HU4XSQd27ge52qkrAnQEGq4gURr3dw3GmAaOqDxMV7PJbcZ9ie-2LC__4qXsp2tjW0rXUliRpZjmLBiIi-TbyqwDLVHIYW5YRED_DTm2mq7DSN6rDnEkTY_yFHQ0p06jQ1xVJWPud7WnnddLLe6BNYWb0lMd61JcibgpIUYwasMkvM43DgvNs99xw6MuXiG3MTdaCC-xDF5VPkcuRCeqBQHCxOSe1m9fYC8STbq2m_L9b7KKPT3IYD_3GWhRQplDJXrfC3YBh9iqJQz1mNL-Vvsk49SzfreiXFfq6iAFxSFNywUmr7NvyDl36WsPbDcu7oCbXVYb-pDYr5ILWObauAzV3OiPDXLfIgknH4eXibNXmrKkwMwEtXnwv3KB3UmMTop15vNp5N3dRhlMmgu_L3meK37pl07OIzihZGVN70SsBbxjNGi8t1zLhnA4gA9nsX70DuSNJ3Kf78AjM-o03qd6LLrvf8g-2Gc77JqnvG9tpk7VtWmSuPHn9NW-rw-eSLGUr6_7y1lnz7XOg0x70sb9KewduT3zgCTgfA5ip1tp1mSZma_StTL8zZ7ewzxFUrPJJtjiZX1FhxhXhP1LMJLV-q-8aHHg8WmbOtHo6zUSCudStro20R6GX9Gy0g2vwOBfkrHG-HK9FTvArI1aeelSJ2Vt0za7HE7_yv1xGCLdQUYPw9oskxG_gUNjtQy85l6044BjPQqL2iO27w9y9Vmt_kFox7sA_gTlvGwvPWeoMxKciNi8xLIhzG3w4EyVnEkwCz4J8iGjDlRJDatyn5vmLXeow4CrsoNDZaxWRfgzjK-4iUbr93A0amG6NBKjmaVxLDhkAacgVlLnnwZiYsZ73vbXa4M6ZFCPHA=\"},{\"type\":\"function_call\",\"id\":\"fc_05980898d988ddab016ae2490a715887d18c4ca83671699ca8\",\"call_id\":\"call_Ebs9709kzV8gdmgZ0LCGyC9S\",\"name\":\"get_weather\",\"arguments\":\"{\\\"city\\\":\\\"Paris\\\"}\"},{\"type\":\"function_call_output\",\"call_id\":\"call_Ebs9709kzV8gdmgZ0LCGyC9S\",\"output\":\"{\\\"temperature\\\":22,\\\"condition\\\":\\\"sunny\\\"}\"}],\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"stream\":true,\"max_output_tokens\":256,\"store\":false,\"include\":[\"reasoning.encrypted_content\"],\"tools\":[{\"type\":\"function\",\"name\":\"get_weather\",\"description\":\"Get current weather for a city.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream; charset=utf-8" + }, + "body": "event: response.created\ndata: {\"type\":\"response.created\",\"response\":{\"id\":\"resp_05980898d988ddab016ae2490adc6c87d1917eca7a94f82187\",\"object\":\"response\",\"created_at\":1793214730,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":0}\n\nevent: response.in_progress\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"resp_05980898d988ddab016ae2490adc6c87d1917eca7a94f82187\",\"object\":\"response\",\"created_at\":1793214730,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":1}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"type\":\"message\",\"status\":\"in_progress\",\"content\":[],\"phase\":\"final_answer\",\"role\":\"assistant\"},\"output_index\":0,\"sequence_number\":2}\n\nevent: response.content_part.added\ndata: {\"type\":\"response.content_part.added\",\"content_index\":0,\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"output_index\":0,\"part\":{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"\"},\"sequence_number\":3}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\"Paris\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"bwEnHChUqYT\",\"output_index\":0,\"sequence_number\":4}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\" is\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"yJBRziJaxpvtA\",\"output_index\":0,\"sequence_number\":5}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\" sunny\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"krbIR769MW\",\"output_index\":0,\"sequence_number\":6}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\" and\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"bbIc4pyn2RJS\",\"output_index\":0,\"sequence_number\":7}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\" \",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"OrQLe0rwJwEwEyr\",\"output_index\":0,\"sequence_number\":8}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\"22\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"IuxlCmaOH911hu\",\"output_index\":0,\"sequence_number\":9}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\"°C\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"QwOmxdrWN76T2e\",\"output_index\":0,\"sequence_number\":10}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\".\",\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"obfuscation\":\"2guZ9kOcZXsV2Ga\",\"output_index\":0,\"sequence_number\":11}\n\nevent: response.output_text.done\ndata: {\"type\":\"response.output_text.done\",\"content_index\":0,\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"logprobs\":[],\"output_index\":0,\"sequence_number\":12,\"text\":\"Paris is sunny and 22°C.\"}\n\nevent: response.content_part.done\ndata: {\"type\":\"response.content_part.done\",\"content_index\":0,\"item_id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"output_index\":0,\"part\":{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"Paris is sunny and 22°C.\"},\"sequence_number\":13}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"type\":\"message\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"Paris is sunny and 22°C.\"}],\"phase\":\"final_answer\",\"role\":\"assistant\"},\"output_index\":0,\"sequence_number\":14}\n\nevent: response.completed\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp_05980898d988ddab016ae2490adc6c87d1917eca7a94f82187\",\"object\":\"response\",\"created_at\":1793214730,\"status\":\"completed\",\"access_programs\":null,\"background\":false,\"completed_at\":1793214731,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":\"Use the get_weather tool, then answer in one short sentence.\",\"max_output_tokens\":256,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[{\"id\":\"msg_05980898d988ddab016ae2490b64a487d1ae40496600cdbeb7\",\"type\":\"message\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"Paris is sunny and 22°C.\"}],\"phase\":\"final_answer\",\"role\":\"assistant\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"default\",\"store\":false,\"temperature\":1,\"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 current weather for a city.\",\"name\":\"get_weather\",\"output_schema\":null,\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"additionalProperties\":false},\"strict\":false}],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"input_tokens\":138,\"input_tokens_details\":{\"cache_write_tokens\":0,\"cached_tokens\":0},\"output_tokens\":12,\"output_tokens_details\":{\"reasoning_tokens\":0},\"total_tokens\":150},\"metadata\":{}},\"sequence_number\":15}\n\ndata: [DONE]\n\n" + } + } + ] +} diff --git a/packages/ai/test/fixtures/recordings/venice-responses/streams-text.json b/packages/ai/test/fixtures/recordings/venice-responses/streams-text.json new file mode 100644 index 000000000000..6bc3a6eb2d91 --- /dev/null +++ b/packages/ai/test/fixtures/recordings/venice-responses/streams-text.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "metadata": { + "model": "openai-gpt-54-mini", + "tags": [ + "prefix:venice-responses", + "provider:venice", + "protocol:open-responses", + "text", + "usage" + ], + "name": "venice-responses/streams-text", + "recordedAt": "2026-10-28T19:12:08.796Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://api.venice.ai/api/v1/responses", + "headers": { + "content-type": "application/json" + }, + "body": "{\"model\":\"openai-gpt-54-mini\",\"input\":[{\"type\":\"message\",\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Reply exactly: OK\"}]}],\"stream\":true,\"max_output_tokens\":64,\"store\":false,\"include\":[\"reasoning.encrypted_content\"]}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream; charset=utf-8" + }, + "body": "event: response.created\ndata: {\"type\":\"response.created\",\"response\":{\"id\":\"resp_0cabc9d1491f10c9016ae24907b53087d18e4e308a06b0ea73\",\"object\":\"response\",\"created_at\":1793214727,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":64,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"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\":[],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":0}\n\nevent: response.in_progress\ndata: {\"type\":\"response.in_progress\",\"response\":{\"id\":\"resp_0cabc9d1491f10c9016ae24907b53087d18e4e308a06b0ea73\",\"object\":\"response\",\"created_at\":1793214727,\"status\":\"in_progress\",\"access_programs\":null,\"background\":false,\"completed_at\":null,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":64,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"auto\",\"store\":false,\"temperature\":1,\"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\":[],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":null,\"metadata\":{}},\"sequence_number\":1}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"rs_0cabc9d1491f10c9016ae2490866e887d182fad1558173a2d3\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkIxoU32pdCx5NRbLOUykwnvN8-s9fSOgdXMeSwFLY8hSJofX4v6y8p0C1wzqMqyyFr0rH1Q0AF4HioWGrU5jtuuLZ2UY6_70A2ZUxjFHujrdNTbj2YW2ml7JOwMVwpfTaBpHZgneODWp1UhZntEA01wAXittoTJ-FPFU9-iEe0p3yWMV9SmT1TXWoSXJL8nkMEVwzPkonGs1ZzyQt1OBEhch5Cci8PGz41lPTMb6qEYoRerOL_hsD-d815NeG7E0bquRHE_eEFAPFRlnSQ-foUGI0hLhoTHHUIypB8p-D2_M6xZZ4fhDRD3uuSd96OzP-qPm9lozAy5dIEKCQdWeonBnUBT0xruY15E0w6_SoDjFlQ2jDiPbRd5VL3mvMmV9vCLjbWzfNIF-IGZxwj2uREiytJozZJRIRVWxUBlRCgZ1BiG1fJhcXcHx4rawHEzytaeFcsdP-g3b6jnMbjtGj6N32uY3Jd1qud8dy4j4PhuIFdoqXFhNtz6b7pP3h8ra-bSXt4mOknK_8I3Y7-REw-N5aCov0H6XVWZiviWCvxOL8cL55gCsjSpIqXSyZuxr6A_oYP1pNbqelNYt15I5vhsvxn7pnpJAxuRojPnqujmWXD1U7jQ-tyz1du2BDNK6nwRuPeIN1_J4sYtO9o3_laQAFCA73Ri5KHqEOhTkDczY_NcCAHVJd8fBioFvkZPcSyxW-kR7dPRjP-T_uAero0m0d7CMBmz6JeBzB_w_fXEzuQ14675VcB179kuWYpHjyI9edyP53h6d4EcsH9YaMQWoQAlhYEcECHGqxYdZBWN_BsPQ8LDXqyfPpsa0xdXXzCP16kMDmwiMNchw9WTprFRVPvJqH-nszK1PvRiGFAP9CUOlA1_A0S5o80L_Fk4M2cT5UY8_8ULuHf4BoLXoTAsLWUzIErbxJJciquXSRoGTJCVqTeq3_sAaSbOcHBGcS7QCY-tDtDV3q0YtuP35OFLxlGfnnJBv5n1h48khTW0OlxLrXEru7qPTyEpqjoUEzkRbkWd-onx0zI03ybyxI3O0iya_mZ6iCPwDNsHFomK2Ju2aK-QJRraECLs5rnb3dSt2ouv3bQ1NjDZr-PAxqKJvL9Z6Ov2yf1iyMhcP8YPJ_tH5G3OD4kP7gGZMX2U_TxM7dbSuVcaiNiilu9aszq7Qq2Qar20JRURegB93AojXaDDoRfHNePc8lAK3XgavIUgatbmwEBQJ3bIOZ5Tg65KmH_P7uN-JKenCdHYPGcIbLThH3jrePjpqmGoEfkqloIGesFidal2XRxIaZShtzZizEALg76aoDNzAwjhV6aY6W8K3-HohJNmBoXDNR8TbRD\",\"summary\":[]},\"output_index\":0,\"sequence_number\":2}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"rs_0cabc9d1491f10c9016ae2490866e887d182fad1558173a2d3\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkIwi3AP1URR9fusgSbEU4MkRiyregCMMx2s2xrk6nMTKnZMlTS8tke0Ur-YLEmJpv3GHq3JqUDVn6-KdvDDCxt-PLn89m3tCX5CE_dM9wahjBM-XvFcV2eOyDsQ8J0kKAFP_uG3w2Xoly4Fju3m1H_iZ9o2jUsk1ThhZU4f1RHaq4u9_jUyU79Oo6T_YFpVgAYPF3PEfDBYEKKKXGe52JLkqxKXm0jtyPW2jUxbyQEEKzuRo0nwspRibkb4105prrWQrzKno_vlNTD8hnTthv2RxyF4BYQatHaR8_4DmA-_YWDV5nVHzXr1IZwjkWtf8ud-F0ILRsIpm8wcfWtXgZh0lQCNkIZHBXUpyVKquW70VvqnKyOTiUHkZHwj-I2g87OLoKeT-m1wcIf3m9AT8_KY6NQq3YRMPDLE4WLajtNHIFvV8TJhx4i_vsxcrV61kv4uL6ZO-gqMKvQy8asx8dcjqd2vTtSr7Q_gyycYO94YgeU52BHY9FqO8xTBojbGZD_JC518bxaZj-NIZYeon1TeE9zEV-YXX_XzSLT9kVqunhoCIN_dVdDyktirZHUjkC-wMG0VcOn8plrPP3WTj3Kn0YAm98PSYXya1Gmw3plfWfbWqCZ17pH0QxzJKdep5RV_RZyNTK5aSUvIXIV8R1YyD8VWpny7GSEzvuBfGXQk8kP30YmHBY0m4h6zeAEtHMMJEmFXFun34P_hP4ChNkw8Y84HU-rEZ9YUwiGHghZ0ClYA6iA1wjfr8if_c54mT8sGOa7ntEvf_1ZGt3htWGmBGYDa8fwBhkhp9_Ln8gK_c1LhIbg7Y5CLGqsooGjTTxQGEYWjnm_qvaB2Z_aurh-Mx7ugCDZdRvZL4-7qLNBGzf0Yy6V9wxRAOxcpTt7s6KGDAwWx37W4nsGhtMZvgwV2qBTyvgA1Ty4MV2FYnfaE22CcnJ28aro31c0cyroA8bw3RafZSrBLGGdK2nHuuAr0e9Y5EBZ3F6e5ycy5AiGvvO61I7p1NTIkB3CWhvXaW7Ss-OCs_ztXuGBgls-EMvXYX5yt1P-UMC3n6bZRnlG74b3NeRxJcaDM2qQSvXhtpVRKSdPbSH1tz6RMzRg_arhwEatuy8T3Ob4Dng2YIFuvJHk01Jn4F3HRw9l4oYYRYicj0KTHgoY1uQBc_Ts0NduixnTrG2CzqdCKDGJ4umpQpE4IlNOoPPYV7Vv78aRnwT6c098dPBIlQ7f5QhLC02dvCRclcmec_-jLiQeCEsmh_Jc2avXOn5iyWcPDnZJcrsGeI-oUbEA2h4TRem8L-QVz3VL3pLLcUWk0z5bMw-bHMqTq_qo-7HGzpKH0CES3f7EW2THTrwOkQ5vltxjU9g_DY2uXYU3wwtbdWntkOAI58FzLHxgFQy3tajFXavQbGaBUbzCpIDrhMzwwShTTp3hrbwid2XNECtCsFq7begqMNy4pVO6FQh9R-nkORw4jOmauEZg6g9qmqeTu5_zR9jbYImv7mH5FjSNybIGvtDO3c7OnUoOne7oXuNvz3LBIgQc_yuTf7Nw96g8UrM-iOSD9nMQ5YN2lDY_wDdPN4u0rqFBhztuNyle7CyD-kjfr-7Ra0sNOsraRlnIWnSW1DOCrEYt_fl19c3og1yFS7hl3vguu_6IbZTibeTmknBvtPwvhTEO8_zW1YSxIMT2qjWe-8Z69mYSVublbVpGqXp_Wc8S8ZP34GJgF_2WIrmE5UvlcDewfV_AYdRsoZERG97C6605QTTUg_gCgiDn67FBF7RjJvdiNDwvwXjm4k-YTQVlKXXHXHAjaCuQ2yNNCOTgPA==\",\"summary\":[]},\"output_index\":0,\"sequence_number\":3}\n\nevent: response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"item\":{\"id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"type\":\"message\",\"status\":\"in_progress\",\"content\":[],\"phase\":\"final_answer\",\"role\":\"assistant\"},\"output_index\":1,\"sequence_number\":4}\n\nevent: response.content_part.added\ndata: {\"type\":\"response.content_part.added\",\"content_index\":0,\"item_id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"output_index\":1,\"part\":{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"\"},\"sequence_number\":5}\n\nevent: response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"content_index\":0,\"delta\":\"OK\",\"item_id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"logprobs\":[],\"obfuscation\":\"ROt30LuDRUVYc5\",\"output_index\":1,\"sequence_number\":6}\n\nevent: response.output_text.done\ndata: {\"type\":\"response.output_text.done\",\"content_index\":0,\"item_id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"logprobs\":[],\"output_index\":1,\"sequence_number\":7,\"text\":\"OK\"}\n\nevent: response.content_part.done\ndata: {\"type\":\"response.content_part.done\",\"content_index\":0,\"item_id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"output_index\":1,\"part\":{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"OK\"},\"sequence_number\":8}\n\nevent: response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"type\":\"message\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"OK\"}],\"phase\":\"final_answer\",\"role\":\"assistant\"},\"output_index\":1,\"sequence_number\":9}\n\nevent: response.completed\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp_0cabc9d1491f10c9016ae24907b53087d18e4e308a06b0ea73\",\"object\":\"response\",\"created_at\":1793214727,\"status\":\"completed\",\"access_programs\":null,\"background\":false,\"completed_at\":1793214728,\"error\":null,\"frequency_penalty\":0,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":64,\"max_tool_calls\":null,\"model\":\"openai-gpt-54-mini\",\"moderation\":null,\"output\":[{\"id\":\"rs_0cabc9d1491f10c9016ae2490866e887d182fad1558173a2d3\",\"type\":\"reasoning\",\"content\":[],\"encrypted_content\":\"gAAAAABq4kkI4Q0cpOFjV14d4zkVeJRcj5vCJwcycDjxPK75hMGDZ-KG2QdYBEECh-f4zkKk53BgQR5W0IX8REcJzBmY7Or8VD62lT2sQQ8zhCOfHhOaWWw-GsMSvqAS5PFOPtHukdsIwTi89lnthYej58u_eAu3tNAR1go0rkXvI0jc-45cEB-uPninUBw1l4gZ3nDUI-go-aF8Irqm793fxtPoEuohdwwzVi18P_aMgCeFIUaPkz63_HCfZvhmld3QiOIS3kftOTBbIOfmB1Xat6e0qND6ngl0I8jniKQ5f7V1PPaGrvnMFRBezyfgkgV3PIduojb2bH2FRaEmUudWiun3eyQfWR59p1V38p023da_NmTDKSXIJMqAPb-orJterNSEiPBSya6gQUHzeQIiK1f7o4CmImxvwcnzqt_3c75vZX70NLvXGy71f1Iljs0yI_r4ncfCg-A7EF_rrN2w0xir4dxT_e8jETe_3Ov8OryZlQ5y65HWbRr-QW_e5HqTTagnwdzGBgHamAAM4IIpSV_bo68SCZpnDRAZ9LQLi-XjKnomRSfiitwsMSBrW0UH-A2clx-Sx_escHL8GEIyDNKQ65-AeOEe3JbyqyUAf_AO7zs1GgugmhKdxyy4z0V1agSGoBl4rZj9y1o-liD4dJ91pb40sjTam96KJqbfe0llobs1B-0SZhz5DLY6h_LdoWIM_tmVb5aH3lEOIV0QHFPoHVKDW0Gboxvy4mxJ-8RbqYoKNNPDZMj36Kw1OV_oq2bKVs1bvF_LI1Q5-Va1pjqRdr46pC2ZKb6-hnNDDELsGPB1Ba_LEv49gJo7_OlhmPWi47sPeWFrAXdj-vgX3f8di1YMvuPFwJezcLG1HWHWEUgMPqaMJGfjltU8Ji4xdyDDlHAkuo9XIh7ZgmPlVM45ucO0Blynv24Tgb0h6gFRUrFVbTbGfDrL_3FH7g98iTE-mW40gEI90rUNtmVFe0ZmNm4igue_JCehHuwOF-e2XDdlNXD4Gkw-Y0DdM5-DhULkjN1AAgjtmdl4Ud6yCZNjg8hcRp_bq6QRnZPryo3EIpvCpTijg93MVKDmVadt80_2dN6501rpyNBDnzK3FOUfMX0zWooGBDkYEddMMzKZUqMfT-keN_CYgDbGdMSkMT7Q9TF3QUs5scstVP1T1xr2nB5Ywb0rY8B20CFUQPxJYKxZHnHAkANkrNzNKCxGYCq9nrzbgrZcgONl0jUEncc6W-mxoIPWaeT8ZsQjd2y79wfHqGCUdl2Qi3sSbFO2NxhMHKA7aG-jacop27SGeyz7DvB-fjtGn0nbnwDatEanL6D5NheA2hNvoG5g2SW99LnPvwS8as2cyARwWitaRCLbCiMRnfl-frlq7uhEvesRlLUpzzQbre2q5FVPrOTOC8Rh2YcHHDCj0u2_CQsvAFHhRwsfQEirT92bkP_Jaxvftcp2Kdskae-EifRydeqB7fuOsmOB3i1b7PQyzolWSIasCS3YkBCEEtiVIMe2Bftq0NUzkTj0TeQn7U_pFvz1hZ3hggwTIGmJmjzVYMivFZ2f7faoUN3R6TzYxHMO0YFuRgjXXW8eqWLaoU0scHM0SpQnPqMMIn_25uvS2TowqHZQ_NVxHipi13q1z0pYGHc3k1_x-uA3Z9UuGKwb8PXYrCIYBuLyluXJZUgz8K4RqtH3E1_yvsH_MZT7Aaqv_nbkGG9zqVM-b1hSAlqjQlbIBvALsRV0XQksPAhCTXew7AJDBznJwNw7dSD-DFFgETe3qfJLPX6dZMFGthaRQFc-RVaq7abfOcYCgUA-dESiHuYdjvBnjQ==\",\"summary\":[]},{\"id\":\"msg_0cabc9d1491f10c9016ae24908a3e087d1a95885d4245b373f\",\"type\":\"message\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"OK\"}],\"phase\":\"final_answer\",\"role\":\"assistant\"}],\"parallel_tool_calls\":true,\"presence_penalty\":0,\"previous_response_id\":null,\"prompt_cache_retention\":\"24h\",\"reasoning\":{\"context\":\"current_turn\",\"effort\":\"high\",\"mode\":\"standard\",\"summary\":\"detailed\"},\"service_tier\":\"default\",\"store\":false,\"temperature\":1,\"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\":[],\"top_logprobs\":0,\"top_p\":0.98,\"truncation\":\"disabled\",\"usage\":{\"input_tokens\":10,\"input_tokens_details\":{\"cache_write_tokens\":0,\"cached_tokens\":0},\"output_tokens\":26,\"output_tokens_details\":{\"reasoning_tokens\":19},\"total_tokens\":36},\"metadata\":{}},\"sequence_number\":10}\n\ndata: [DONE]\n\n" + } + } + ] +} diff --git a/packages/ai/test/provider-package.test.ts b/packages/ai/test/provider-package.test.ts index 0f2caaee682d..e2b02ddcbcca 100644 --- a/packages/ai/test/provider-package.test.ts +++ b/packages/ai/test/provider-package.test.ts @@ -58,6 +58,37 @@ describe("provider package entrypoints", () => { }) }) + test("maps OpenRouter, DigitalOcean and Venice Responses entrypoints onto provider-owned routes", async () => { + const providers = [ + ["openrouter", "https://openrouter.ai/api/v1", await import("@opencode/ai/providers/openrouter/responses")], + ["digitalocean", "https://inference.do-ai.run/v1", await import("@opencode/ai/providers/digitalocean/responses")], + ["venice", "https://api.venice.ai/api/v1", await import("@opencode/ai/providers/venice/responses")], + ] as const + const settings = { + apiKey: "fixture", + headers: { "x-test": "fixture" }, + body: { future_option: true }, + reasoningEffort: "low", + } + for (const [provider, baseURL, module] of providers) { + const selected = module.model("gpt-5.4", settings) + expect(selected.provider).toBe(provider) + expect(selected.route.id).toBe(`${provider}-responses`) + expect(selected.route.protocol).toBe("open-responses") + expect(selected.route.endpoint).toMatchObject({ baseURL, path: "/responses" }) + expect(selected.route.defaults.headers).toEqual(settings.headers) + expect(selected.route.defaults.http?.body).toEqual(settings.body) + expect(selected.route.defaults.providerOptions).toEqual({ + reasoningEffort: "low", + store: false, + include: ["reasoning.encrypted_content"], + }) + expect(module.model("gpt-5.4", { ...settings, baseURL: "https://gateway.test/v1" }).route.endpoint.baseURL).toBe( + "https://gateway.test/v1", + ) + } + }) + test("maps Cohere entrypoints onto native and compatibility routes", async () => { const modules = await Promise.all([ import("@opencode/ai/providers/cohere"), diff --git a/packages/ai/test/provider/freeform-tools.test.ts b/packages/ai/test/provider/freeform-tools.test.ts index df18fce5b092..26027dfc51af 100644 --- a/packages/ai/test/provider/freeform-tools.test.ts +++ b/packages/ai/test/provider/freeform-tools.test.ts @@ -12,10 +12,12 @@ import { import * as AmazonBedrockMantle from "../../src/providers/amazon-bedrock-mantle.js" import * as Anthropic from "../../src/providers/anthropic.js" import * as Azure from "../../src/providers/azure.js" +import * as DigitalOcean from "../../src/providers/digitalocean.js" import * as OpenAI from "../../src/providers/openai.js" import * as OpenAICompatible from "../../src/providers/openai-compatible.js" import * as OpenAICompatibleResponses from "../../src/providers/openai-compatible-responses.js" import * as OpenRouter from "../../src/providers/openrouter.js" +import * as Venice from "../../src/providers/venice.js" import * as VercelAIGateway from "../../src/providers/vercel-ai-gateway.js" import { LLMClient } from "../../src/route.js" import { compileRequest } from "../../src/route/client.js" @@ -112,6 +114,9 @@ describe("freeform tools", () => { AmazonBedrockMantle.responsesModel("openai.gpt-5.4", { ...settings, region: "us-east-1" }), VercelAIGateway.responsesModel("openai/gpt-5.4", settings), OpenAICompatibleResponses.model("gpt-5.4", { ...settings, baseURL: "https://responses.test/v1" }), + OpenRouter.responsesModel("openai/gpt-5.4", settings), + DigitalOcean.responsesModel("openai-gpt-5.4", settings), + Venice.responsesModel("openai-gpt-54", settings), ] const chatModels = [ Azure.chatModel("gpt-5.4", { ...settings, resourceName: "fixture" }), diff --git a/packages/ai/test/provider/responses-routes.recorded.test.ts b/packages/ai/test/provider/responses-routes.recorded.test.ts new file mode 100644 index 000000000000..203d6e78e120 --- /dev/null +++ b/packages/ai/test/provider/responses-routes.recorded.test.ts @@ -0,0 +1,90 @@ +import { expect } from "bun:test" +import { Effect, Schema } from "effect" +import { LLM, LLMEvent, toDefinitions } from "../../src/effect.js" +import { DigitalOcean, OpenRouter, Venice } from "../../src/providers.js" +import { LLMClient } from "../../src/route.js" +import { Tool } from "../../src/tool.js" +import { expectWeatherToolLoop, runWeatherToolLoop, weatherToolLoopRequest } from "../recorded-scenarios.js" +import { recordedTests } from "../recorded-test.js" + +const run = toDefinitions({ + run: Tool.make({ + description: "Run a Python snippet.", + parameters: Schema.Struct({ code: Schema.String }), + success: Schema.String, + freeform: { type: "text" }, + }), +}) + +for (const item of [ + { + provider: "openrouter", + env: "OPENROUTER_API_KEY", + model: OpenRouter.configure({ apiKey: process.env.OPENROUTER_API_KEY ?? "fixture" }).responses( + "openai/gpt-5.4-mini", + ), + }, + { + provider: "digitalocean", + env: "DIGITAL_OCEAN_OFFICIAL_API_KEY", + model: DigitalOcean.configure({ apiKey: process.env.DIGITAL_OCEAN_OFFICIAL_API_KEY ?? "fixture" }).responses( + "openai-gpt-5.4-mini", + ), + }, + { + provider: "venice", + env: "VENICE_API_KEY", + model: Venice.configure({ apiKey: process.env.VENICE_API_KEY ?? "fixture" }).responses("openai-gpt-54-mini"), + }, +]) { + const recorded = recordedTests({ + prefix: `${item.provider}-responses`, + provider: item.provider, + protocol: "open-responses", + requires: [item.env], + metadata: { model: item.model.id }, + }) + + recorded.effect.with("streams text", { tags: ["text", "usage"] }, () => + Effect.gen(function* () { + const response = yield* LLMClient.generate( + LLM.request({ model: item.model, prompt: "Reply exactly: OK", generation: { maxTokens: 64 } }), + ) + expect(response.text.trim()).toMatch(/^OK\.?$/) + expect(response.events.some(LLMEvent.is.textDelta)).toBe(true) + expect(response.finishReason.normalized).toBe("stop") + expect(response.usage.outputTokens).toBeGreaterThan(0) + }), + ) + + recorded.effect.with("continues a tool call", { tags: ["tool", "tool-loop"] }, () => + Effect.gen(function* () { + const events = yield* runWeatherToolLoop( + weatherToolLoopRequest({ + id: `${item.provider}-responses-tool-loop`, + model: item.model, + maxTokens: 256, + temperature: false, + }), + ) + expectWeatherToolLoop(events) + }), + ) + + recorded.effect.with("calls a freeform text tool", { tags: ["tool", "freeform"] }, () => + Effect.gen(function* () { + const response = yield* LLMClient.generate( + LLM.request({ + model: item.model, + prompt: "Use the run tool to execute exactly this code: print(1)", + tools: run, + toolChoice: "required", + generation: { maxTokens: 256 }, + }), + ) + expect(response.toolCalls).toMatchObject([{ name: "run", input: { code: expect.stringContaining("print(1)") } }]) + expect(response.toolCalls[0]?.providerMetadata).toMatchObject({ [item.provider]: { custom: true } }) + expect(response.finishReason.normalized).toBe("tool-calls") + }), + ) +} diff --git a/packages/core/src/provider.ts b/packages/core/src/provider.ts index b2b454e3a903..40d0781ce5c5 100644 --- a/packages/core/src/provider.ts +++ b/packages/core/src/provider.ts @@ -95,6 +95,7 @@ const builtins = new Map Promise>([ ["@opencode/ai/providers/digitalocean", () => import("@opencode/ai/providers/digitalocean")], ["@opencode/ai/providers/digitalocean/decisions", () => import("@opencode/ai/providers/digitalocean/decisions")], ["@opencode/ai/providers/digitalocean/images", () => import("@opencode/ai/providers/digitalocean/images")], + ["@opencode/ai/providers/digitalocean/responses", () => import("@opencode/ai/providers/digitalocean/responses")], ["@opencode/ai/providers/fireworks", () => import("@opencode/ai/providers/fireworks")], ["@opencode/ai/providers/google", () => import("@opencode/ai/providers/google")], ["@opencode/ai/providers/google/interactions", () => import("@opencode/ai/providers/google/interactions")], @@ -144,9 +145,11 @@ const builtins = new Map Promise>([ ["@opencode/ai/providers/openrouter", () => import("@opencode/ai/providers/openrouter")], ["@opencode/ai/providers/openrouter/decisions", () => import("@opencode/ai/providers/openrouter/decisions")], ["@opencode/ai/providers/openrouter/images", () => import("@opencode/ai/providers/openrouter/images")], + ["@opencode/ai/providers/openrouter/responses", () => import("@opencode/ai/providers/openrouter/responses")], ["@opencode/ai/providers/togetherai", () => import("@opencode/ai/providers/togetherai")], ["@opencode/ai/providers/typesafe-ai/decisions", () => import("@opencode/ai/providers/typesafe-ai/decisions")], ["@opencode/ai/providers/venice", () => import("@opencode/ai/providers/venice")], + ["@opencode/ai/providers/venice/responses", () => import("@opencode/ai/providers/venice/responses")], ["@opencode/ai/providers/vercel-ai-gateway", () => import("@opencode/ai/providers/vercel-ai-gateway")], ["@opencode/ai/providers/vercel-ai-gateway/chat", () => import("@opencode/ai/providers/vercel-ai-gateway/chat")], [ diff --git a/packages/core/src/variant.ts b/packages/core/src/variant.ts index 7a469f529367..5d672822c2b6 100644 --- a/packages/core/src/variant.ts +++ b/packages/core/src/variant.ts @@ -621,6 +621,9 @@ const PROTOCOLS: Readonly> = { "@opencode/ai/providers/openai-compatible-responses": openResponses, "@opencode/ai/providers/google-vertex/responses": openResponses, "@opencode/ai/providers/xai": openResponses, + "@opencode/ai/providers/digitalocean/responses": openResponses, + "@opencode/ai/providers/openrouter/responses": openResponses, + "@opencode/ai/providers/venice/responses": openResponses, "@opencode/ai/providers/openai-compatible": openaiCompatible, "@opencode/ai/providers/openai/chat": openaiChat,