@langchain/openai 1.5.0 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/chat_models/base.cjs +1 -1
- package/dist/chat_models/base.js +1 -1
- package/dist/chat_models/responses.cjs +13 -9
- package/dist/chat_models/responses.cjs.map +1 -1
- package/dist/chat_models/responses.d.cts.map +1 -1
- package/dist/chat_models/responses.d.ts.map +1 -1
- package/dist/chat_models/responses.js +13 -9
- package/dist/chat_models/responses.js.map +1 -1
- package/dist/converters/responses.cjs +35 -14
- package/dist/converters/responses.cjs.map +1 -1
- package/dist/converters/responses.d.cts.map +1 -1
- package/dist/converters/responses.d.ts.map +1 -1
- package/dist/converters/responses.js +35 -14
- package/dist/converters/responses.js.map +1 -1
- package/dist/llms.cjs +1 -1
- package/dist/llms.js +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @langchain/openai
|
|
2
2
|
|
|
3
|
+
## 1.5.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#11045](https://github.com/langchain-ai/langchainjs/pull/11045) [`05936ab`](https://github.com/langchain-ai/langchainjs/commit/05936ab45ce1bbb04b955c3ebdd03dc1451b655c) Thanks [@jackjin1997](https://github.com/jackjin1997)! - fix(openai): omit empty id and content on reasoning items in Responses API input
|
|
8
|
+
|
|
9
|
+
Reasoning blocks reassembled from streaming chunks (e.g. via `streamEvents`) never carry an id, since OpenAI's streaming protocol only includes it in non-streaming responses. When such a message was replayed as Responses API input on the next turn, the reasoning item was emitted with `id: ""`, which OpenAI rejects with `400 Invalid 'input[n].id': ''`. The `id` field is now omitted when absent.
|
|
10
|
+
|
|
11
|
+
A second error surfaced immediately after that fix: the same converter set a populated `content` array on the reasoning input item, which the Responses API also rejects (`400 Invalid 'input[n].content': array too long. Expected an array with maximum length 0`). Reasoning input items only carry `summary`, so `content` is no longer forwarded. Thanks to @csrujanreddy for catching the second issue and verifying both fixes against the live API.
|
|
12
|
+
|
|
13
|
+
- [#11065](https://github.com/langchain-ai/langchainjs/pull/11065) [`798cb70`](https://github.com/langchain-ai/langchainjs/commit/798cb705222f43759e94d02a790ebb706ef2f099) Thanks [@rxits](https://github.com/rxits)! - fix(openai): route standard url file blocks to native input_file in Responses API
|
|
14
|
+
|
|
15
|
+
- [#11090](https://github.com/langchain-ai/langchainjs/pull/11090) [`80c790b`](https://github.com/langchain-ai/langchainjs/commit/80c790b593ad19668f1101f84f06c175db114909) Thanks [@nikhilpakhloo](https://github.com/nikhilpakhloo)! - fix(openai): stream built-in tool progress events
|
|
16
|
+
|
|
17
|
+
## 1.5.1
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- [#11001](https://github.com/langchain-ai/langchainjs/pull/11001) [`80b43ec`](https://github.com/langchain-ai/langchainjs/commit/80b43ecffe0701c3c375c407fb601cb452f708ef) Thanks [@Herrtian](https://github.com/Herrtian)! - Wrap Responses API stream iteration errors with existing OpenAI client error handling.
|
|
22
|
+
|
|
3
23
|
## 1.5.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
|
@@ -233,7 +233,7 @@ var BaseChatOpenAI = class extends _langchain_core_language_models_chat_models.B
|
|
|
233
233
|
if (fields?.supportsStrictToolCalling !== void 0) this.supportsStrictToolCalling = fields.supportsStrictToolCalling;
|
|
234
234
|
if (fields?.service_tier !== void 0) this.service_tier = fields.service_tier;
|
|
235
235
|
this.zdrEnabled = fields?.zdrEnabled ?? false;
|
|
236
|
-
this._addVersion("@langchain/openai", "1.5.
|
|
236
|
+
this._addVersion("@langchain/openai", "1.5.2");
|
|
237
237
|
}
|
|
238
238
|
/**
|
|
239
239
|
* Returns backwards compatible reasoning parameters from constructor params and call options
|
package/dist/chat_models/base.js
CHANGED
|
@@ -233,7 +233,7 @@ var BaseChatOpenAI = class extends BaseChatModel {
|
|
|
233
233
|
if (fields?.supportsStrictToolCalling !== void 0) this.supportsStrictToolCalling = fields.supportsStrictToolCalling;
|
|
234
234
|
if (fields?.service_tier !== void 0) this.service_tier = fields.service_tier;
|
|
235
235
|
this.zdrEnabled = fields?.zdrEnabled ?? false;
|
|
236
|
-
this._addVersion("@langchain/openai", "1.5.
|
|
236
|
+
this._addVersion("@langchain/openai", "1.5.2");
|
|
237
237
|
}
|
|
238
238
|
/**
|
|
239
239
|
* Returns backwards compatible reasoning parameters from constructor params and call options
|
|
@@ -166,15 +166,19 @@ var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
|
|
|
166
166
|
}),
|
|
167
167
|
stream: true
|
|
168
168
|
}, options);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
try {
|
|
170
|
+
for await (const data of streamIterable) {
|
|
171
|
+
if (options.signal?.aborted) return;
|
|
172
|
+
const chunk = require_responses.convertResponsesDeltaToChatGenerationChunk(data);
|
|
173
|
+
if (chunk == null) continue;
|
|
174
|
+
yield chunk;
|
|
175
|
+
await runManager?.handleLLMNewToken(chunk.text || "", {
|
|
176
|
+
prompt: options.promptIndex ?? 0,
|
|
177
|
+
completion: 0
|
|
178
|
+
}, void 0, void 0, void 0, { chunk });
|
|
179
|
+
}
|
|
180
|
+
} catch (e) {
|
|
181
|
+
throw require_client.wrapOpenAIClientError(e);
|
|
178
182
|
}
|
|
179
183
|
}
|
|
180
184
|
async completionWithRetry(request, requestOptions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","isBuiltInToolChoice","formatToOpenAIToolChoice","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","convertOpenAIResponsesStream","convertResponsesDeltaToChatGenerationChunk","wrapOpenAIClientError","isBuiltInTool","isCustomTool","isOpenAICustomTool","convertCompletionsCustomTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n { signal: options?.signal, ...options?.options }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n return this.caller.call(async () => {\n const clientOptions = this._getClientOptions(requestOptions);\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","isBuiltInToolChoice","formatToOpenAIToolChoice","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","convertOpenAIResponsesStream","convertResponsesDeltaToChatGenerationChunk","wrapOpenAIClientError","isBuiltInTool","isCustomTool","isOpenAICustomTool","convertCompletionsCustomTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n { signal: options?.signal, ...options?.options }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n try {\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n return this.caller.call(async () => {\n const clientOptions = this._getClientOptions(requestOptions);\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.cts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;;UA+BiB,8BAAA,SAAuC,yBAAA;;AAAxD;;;EAKE,IAAA,GAAO,MAAA,CAAa,SAAA,CAAU,oBAAA;EAKjB;;;EAAb,UAAA,GAAa,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVkB;;;EAetD,OAAA,GAAU,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVjC;;;;EAgBA,oBAAA,GAAuB,MAAA,CAAa,SAAA,CAAU,oBAAA;EAXjC;;;EAgBb,SAAA,GAAY,oBAAA;AAAA;AAAA,KAGF,6BAAA,GAAgC,IAAA,CAC1C,MAAA,CAAa,SAAA,CAAU,oBAAA;;;;;;;;cAWZ,mBAAA,qBACS,8BAAA,GAClB,8BAAA,UACM,cAAA,CAAe,WAAA;EACvB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,oBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,oBAAA;EAQZ,gBAAA,CACP,OAAA,+BACC,6BAAA;EAuFG,SAAA,CACJ,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAwDJ,sBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,WAAA,GAAc,wBAAA,GACb,cAAA,CAAe,oBAAA;EAlLwB;EAAA,cAwN5B,mBAAA,CAAA;EAIP,qBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EA/NK;;;AAWzB;;;
|
|
1
|
+
{"version":3,"file":"responses.d.cts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;;UA+BiB,8BAAA,SAAuC,yBAAA;;AAAxD;;;EAKE,IAAA,GAAO,MAAA,CAAa,SAAA,CAAU,oBAAA;EAKjB;;;EAAb,UAAA,GAAa,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVkB;;;EAetD,OAAA,GAAU,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVjC;;;;EAgBA,oBAAA,GAAuB,MAAA,CAAa,SAAA,CAAU,oBAAA;EAXjC;;;EAgBb,SAAA,GAAY,oBAAA;AAAA;AAAA,KAGF,6BAAA,GAAgC,IAAA,CAC1C,MAAA,CAAa,SAAA,CAAU,oBAAA;;;;;;;;cAWZ,mBAAA,qBACS,8BAAA,GAClB,8BAAA,UACM,cAAA,CAAe,WAAA;EACvB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,oBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,oBAAA;EAQZ,gBAAA,CACP,OAAA,+BACC,6BAAA;EAuFG,SAAA,CACJ,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAwDJ,sBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,WAAA,GAAc,wBAAA,GACb,cAAA,CAAe,oBAAA;EAlLwB;EAAA,cAwN5B,mBAAA,CAAA;EAIP,qBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EA/NK;;;AAWzB;;;EAkQQ,mBAAA,CACJ,OAAA,EAAS,MAAA,CAAa,SAAA,CAAU,6BAAA,EAChC,cAAA,GAAiB,MAAA,CAAa,cAAA,GAC7B,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAa,SAAA,CAAU,mBAAA;EAE1C,mBAAA,CACJ,OAAA,EAAS,MAAA,CAAa,SAAA,CAAU,gCAAA,EAChC,cAAA,GAAiB,MAAA,CAAa,cAAA,GAC7B,OAAA,CAAQ,MAAA,CAAa,SAAA,CAAU,QAAA;EAvQX;EAAA,UAgSb,sBAAA,CACR,KAAA,EAAO,kBAAA,IACP,MAAA;IAAU,MAAA;IAAkB,MAAA;EAAA,IAC3B,aAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;;UA+BiB,8BAAA,SAAuC,yBAAA;;AAAxD;;;EAKE,IAAA,GAAO,MAAA,CAAa,SAAA,CAAU,oBAAA;EAKjB;;;EAAb,UAAA,GAAa,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVkB;;;EAetD,OAAA,GAAU,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVjC;;;;EAgBA,oBAAA,GAAuB,MAAA,CAAa,SAAA,CAAU,oBAAA;EAXjC;;;EAgBb,SAAA,GAAY,oBAAA;AAAA;AAAA,KAGF,6BAAA,GAAgC,IAAA,CAC1C,MAAA,CAAa,SAAA,CAAU,oBAAA;;;;;;;;cAWZ,mBAAA,qBACS,8BAAA,GAClB,8BAAA,UACM,cAAA,CAAe,WAAA;EACvB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,oBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,oBAAA;EAQZ,gBAAA,CACP,OAAA,+BACC,6BAAA;EAuFG,SAAA,CACJ,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAwDJ,sBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,WAAA,GAAc,wBAAA,GACb,cAAA,CAAe,oBAAA;EAlLwB;EAAA,cAwN5B,mBAAA,CAAA;EAIP,qBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EA/NK;;;AAWzB;;;
|
|
1
|
+
{"version":3,"file":"responses.d.ts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;;UA+BiB,8BAAA,SAAuC,yBAAA;;AAAxD;;;EAKE,IAAA,GAAO,MAAA,CAAa,SAAA,CAAU,oBAAA;EAKjB;;;EAAb,UAAA,GAAa,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVkB;;;EAetD,OAAA,GAAU,MAAA,CAAa,SAAA,CAAU,oBAAA;EAVjC;;;;EAgBA,oBAAA,GAAuB,MAAA,CAAa,SAAA,CAAU,oBAAA;EAXjC;;;EAgBb,SAAA,GAAY,oBAAA;AAAA;AAAA,KAGF,6BAAA,GAAgC,IAAA,CAC1C,MAAA,CAAa,SAAA,CAAU,oBAAA;;;;;;;;cAWZ,mBAAA,qBACS,8BAAA,GAClB,8BAAA,UACM,cAAA,CAAe,WAAA;EACvB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,oBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,oBAAA;EAQZ,gBAAA,CACP,OAAA,+BACC,6BAAA;EAuFG,SAAA,CACJ,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAwDJ,sBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,WAAA,GAAc,wBAAA,GACb,cAAA,CAAe,oBAAA;EAlLwB;EAAA,cAwN5B,mBAAA,CAAA;EAIP,qBAAA,CACL,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EA/NK;;;AAWzB;;;EAkQQ,mBAAA,CACJ,OAAA,EAAS,MAAA,CAAa,SAAA,CAAU,6BAAA,EAChC,cAAA,GAAiB,MAAA,CAAa,cAAA,GAC7B,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAa,SAAA,CAAU,mBAAA;EAE1C,mBAAA,CACJ,OAAA,EAAS,MAAA,CAAa,SAAA,CAAU,gCAAA,EAChC,cAAA,GAAiB,MAAA,CAAa,cAAA,GAC7B,OAAA,CAAQ,MAAA,CAAa,SAAA,CAAU,QAAA;EAvQX;EAAA,UAgSb,sBAAA,CACR,KAAA,EAAO,kBAAA,IACP,MAAA;IAAU,MAAA;IAAkB,MAAA;EAAA,IAC3B,aAAA;AAAA"}
|
|
@@ -166,15 +166,19 @@ var ChatOpenAIResponses = class extends BaseChatOpenAI {
|
|
|
166
166
|
}),
|
|
167
167
|
stream: true
|
|
168
168
|
}, options);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
try {
|
|
170
|
+
for await (const data of streamIterable) {
|
|
171
|
+
if (options.signal?.aborted) return;
|
|
172
|
+
const chunk = convertResponsesDeltaToChatGenerationChunk(data);
|
|
173
|
+
if (chunk == null) continue;
|
|
174
|
+
yield chunk;
|
|
175
|
+
await runManager?.handleLLMNewToken(chunk.text || "", {
|
|
176
|
+
prompt: options.promptIndex ?? 0,
|
|
177
|
+
completion: 0
|
|
178
|
+
}, void 0, void 0, void 0, { chunk });
|
|
179
|
+
}
|
|
180
|
+
} catch (e) {
|
|
181
|
+
throw wrapOpenAIClientError(e);
|
|
178
182
|
}
|
|
179
183
|
}
|
|
180
184
|
async completionWithRetry(request, requestOptions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","names":["isOpenAIFunctionTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n { signal: options?.signal, ...options?.options }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n return this.caller.call(async () => {\n const clientOptions = this._getClientOptions(requestOptions);\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.js","names":["isOpenAIFunctionTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n { signal: options?.signal, ...options?.options }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n try {\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n return this.caller.call(async () => {\n const clientOptions = this._getClientOptions(requestOptions);\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
|
|
@@ -538,12 +538,18 @@ const convertResponsesDeltaToChatGenerationChunk = (event) => {
|
|
|
538
538
|
index: event.output_index,
|
|
539
539
|
...event.type === "response.custom_tool_call_input.delta" ? { isCustomTool: true } : {}
|
|
540
540
|
});
|
|
541
|
-
else if (event.type === "response.web_search_call.completed" || event.type === "response.file_search_call.completed"
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
541
|
+
else if (event.type === "response.web_search_call.in_progress" || event.type === "response.web_search_call.searching" || event.type === "response.web_search_call.completed" || event.type === "response.file_search_call.in_progress" || event.type === "response.file_search_call.searching" || event.type === "response.file_search_call.completed" || event.type === "response.image_generation_call.in_progress" || event.type === "response.image_generation_call.generating" || event.type === "response.image_generation_call.completed") {
|
|
542
|
+
const [, type, status] = event.type.match(/^response\.(.*)\.([^.]+)$/) ?? [
|
|
543
|
+
"",
|
|
544
|
+
"",
|
|
545
|
+
""
|
|
546
|
+
];
|
|
547
|
+
generationInfo = { tool_outputs: {
|
|
548
|
+
id: event.item_id,
|
|
549
|
+
type,
|
|
550
|
+
status
|
|
551
|
+
} };
|
|
552
|
+
} else if (event.type === "response.refusal.done") additional_kwargs.refusal = event.refusal;
|
|
547
553
|
else if (event.type === "response.output_item.added" && "item" in event && event.item.type === "reasoning") {
|
|
548
554
|
const summary = event.item.summary ? event.item.summary.map((s, index) => ({
|
|
549
555
|
...s,
|
|
@@ -751,16 +757,11 @@ const convertStandardContentMessageToResponsesInput = (message) => {
|
|
|
751
757
|
type: "summary_text",
|
|
752
758
|
text: ""
|
|
753
759
|
}];
|
|
754
|
-
|
|
760
|
+
return {
|
|
755
761
|
type: "reasoning",
|
|
756
|
-
id: block.id
|
|
762
|
+
...block.id ? { id: block.id } : {},
|
|
757
763
|
summary
|
|
758
764
|
};
|
|
759
|
-
if (block.reasoning) reasoningItem.content = [{
|
|
760
|
-
type: "reasoning_text",
|
|
761
|
-
text: block.reasoning
|
|
762
|
-
}];
|
|
763
|
-
return reasoningItem;
|
|
764
765
|
};
|
|
765
766
|
const convertFunctionCall = (block) => ({
|
|
766
767
|
type: "function_call",
|
|
@@ -1074,7 +1075,27 @@ const convertMessagesToResponsesInput = ({ messages, zdrEnabled, model }) => {
|
|
|
1074
1075
|
approval_request_id: item.approval_request_id,
|
|
1075
1076
|
approve: item.approve
|
|
1076
1077
|
});
|
|
1077
|
-
if ((0, _langchain_core_messages.isDataContentBlock)(item))
|
|
1078
|
+
if ((0, _langchain_core_messages.isDataContentBlock)(item)) {
|
|
1079
|
+
if (item.type === "file") {
|
|
1080
|
+
const filename = require_misc.getFilenameFromMetadata(item);
|
|
1081
|
+
if (item.source_type === "url") return {
|
|
1082
|
+
type: "input_file",
|
|
1083
|
+
file_url: item.url,
|
|
1084
|
+
...filename ? { filename } : {}
|
|
1085
|
+
};
|
|
1086
|
+
if (item.source_type === "id") return {
|
|
1087
|
+
type: "input_file",
|
|
1088
|
+
file_id: item.id,
|
|
1089
|
+
...filename ? { filename } : {}
|
|
1090
|
+
};
|
|
1091
|
+
if (item.source_type === "base64") return {
|
|
1092
|
+
type: "input_file",
|
|
1093
|
+
file_data: `data:${item.mime_type ?? ""};base64,${item.data}`,
|
|
1094
|
+
filename: require_misc.getRequiredFilenameFromMetadata(item)
|
|
1095
|
+
};
|
|
1096
|
+
}
|
|
1097
|
+
return (0, _langchain_core_messages.convertToProviderContentBlock)(item, require_completions.completionsApiContentBlockConverter);
|
|
1098
|
+
}
|
|
1078
1099
|
if (item.type === "text") return {
|
|
1079
1100
|
type: "input_text",
|
|
1080
1101
|
text: item.text
|