@langchain/openai 1.0.0-alpha.3 → 1.0.0

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.
Files changed (103) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/azure/chat_models/common.cjs +130 -0
  3. package/dist/azure/chat_models/common.cjs.map +1 -0
  4. package/dist/azure/chat_models/common.d.cts +16 -0
  5. package/dist/azure/chat_models/common.d.cts.map +1 -0
  6. package/dist/azure/chat_models/common.d.ts +16 -0
  7. package/dist/azure/chat_models/common.d.ts.map +1 -0
  8. package/dist/azure/chat_models/common.js +124 -0
  9. package/dist/azure/chat_models/common.js.map +1 -0
  10. package/dist/azure/chat_models/completions.cjs +50 -0
  11. package/dist/azure/chat_models/completions.cjs.map +1 -0
  12. package/dist/azure/chat_models/completions.d.cts +29 -0
  13. package/dist/azure/chat_models/completions.d.cts.map +1 -0
  14. package/dist/azure/chat_models/completions.d.ts +29 -0
  15. package/dist/azure/chat_models/completions.d.ts.map +1 -0
  16. package/dist/azure/chat_models/completions.js +50 -0
  17. package/dist/azure/chat_models/completions.js.map +1 -0
  18. package/dist/azure/{chat_models.cjs → chat_models/index.cjs} +14 -214
  19. package/dist/azure/chat_models/index.cjs.map +1 -0
  20. package/dist/azure/{chat_models.d.ts → chat_models/index.d.cts} +6 -11
  21. package/dist/azure/chat_models/index.d.cts.map +1 -0
  22. package/dist/azure/{chat_models.d.cts → chat_models/index.d.ts} +6 -11
  23. package/dist/azure/chat_models/index.d.ts.map +1 -0
  24. package/dist/azure/{chat_models.js → chat_models/index.js} +6 -205
  25. package/dist/azure/chat_models/index.js.map +1 -0
  26. package/dist/azure/chat_models/responses.cjs +50 -0
  27. package/dist/azure/chat_models/responses.cjs.map +1 -0
  28. package/dist/azure/chat_models/responses.d.cts +29 -0
  29. package/dist/azure/chat_models/responses.d.cts.map +1 -0
  30. package/dist/azure/chat_models/responses.d.ts +29 -0
  31. package/dist/azure/chat_models/responses.d.ts.map +1 -0
  32. package/dist/azure/chat_models/responses.js +50 -0
  33. package/dist/azure/chat_models/responses.js.map +1 -0
  34. package/dist/chat_models/base.cjs +533 -0
  35. package/dist/chat_models/base.cjs.map +1 -0
  36. package/dist/chat_models/base.d.cts +272 -0
  37. package/dist/chat_models/base.d.cts.map +1 -0
  38. package/dist/chat_models/base.d.ts +272 -0
  39. package/dist/chat_models/base.d.ts.map +1 -0
  40. package/dist/chat_models/base.js +532 -0
  41. package/dist/chat_models/base.js.map +1 -0
  42. package/dist/chat_models/completions.cjs +328 -0
  43. package/dist/chat_models/completions.cjs.map +1 -0
  44. package/dist/chat_models/completions.d.cts +33 -0
  45. package/dist/chat_models/completions.d.cts.map +1 -0
  46. package/dist/chat_models/completions.d.ts +33 -0
  47. package/dist/chat_models/completions.d.ts.map +1 -0
  48. package/dist/chat_models/completions.js +327 -0
  49. package/dist/chat_models/completions.js.map +1 -0
  50. package/dist/chat_models/index.cjs +608 -0
  51. package/dist/chat_models/index.cjs.map +1 -0
  52. package/dist/chat_models/index.d.cts +593 -0
  53. package/dist/chat_models/index.d.cts.map +1 -0
  54. package/dist/chat_models/index.d.ts +593 -0
  55. package/dist/chat_models/index.d.ts.map +1 -0
  56. package/dist/chat_models/index.js +608 -0
  57. package/dist/chat_models/index.js.map +1 -0
  58. package/dist/chat_models/responses.cjs +550 -0
  59. package/dist/chat_models/responses.cjs.map +1 -0
  60. package/dist/chat_models/responses.d.cts +77 -0
  61. package/dist/chat_models/responses.d.cts.map +1 -0
  62. package/dist/chat_models/responses.d.ts +77 -0
  63. package/dist/chat_models/responses.d.ts.map +1 -0
  64. package/dist/chat_models/responses.js +549 -0
  65. package/dist/chat_models/responses.js.map +1 -0
  66. package/dist/index.cjs +14 -7
  67. package/dist/index.d.cts +9 -3
  68. package/dist/index.d.ts +9 -3
  69. package/dist/index.js +8 -3
  70. package/dist/langchain-core/dist/callbacks/base.d.ts +1 -0
  71. package/dist/langchain-core/dist/callbacks/manager.d.ts +2 -0
  72. package/dist/langchain-core/dist/language_models/base.d.ts +5 -0
  73. package/dist/langchain-core/dist/language_models/chat_models.d.cts +13 -0
  74. package/dist/langchain-core/dist/language_models/chat_models.d.cts.map +1 -0
  75. package/dist/langchain-core/dist/language_models/chat_models.d.ts +20 -0
  76. package/dist/langchain-core/dist/language_models/chat_models.d.ts.map +1 -0
  77. package/dist/langchain-core/dist/runnables/base.d.ts +7 -0
  78. package/dist/langchain-core/dist/runnables/graph.d.ts +1 -0
  79. package/dist/langchain-core/dist/runnables/types.d.ts +2 -0
  80. package/dist/langchain-core/dist/tools/types.d.ts +5 -0
  81. package/dist/langchain-core/dist/tracers/base.d.ts +2 -0
  82. package/dist/langchain-core/dist/tracers/event_stream.d.ts +1 -0
  83. package/dist/langchain-core/dist/tracers/log_stream.d.ts +3 -0
  84. package/dist/langchain-core/dist/utils/types/index.d.ts +1 -0
  85. package/dist/langchain-core/dist/utils/types/zod.d.ts +1 -0
  86. package/dist/llms.cjs +1 -1
  87. package/dist/llms.d.cts +1 -1
  88. package/dist/llms.js +1 -1
  89. package/dist/utils/message_inputs.cjs +1 -1
  90. package/dist/utils/message_inputs.js +1 -1
  91. package/package.json +10 -7
  92. package/dist/azure/chat_models.cjs.map +0 -1
  93. package/dist/azure/chat_models.d.cts.map +0 -1
  94. package/dist/azure/chat_models.d.ts.map +0 -1
  95. package/dist/azure/chat_models.js.map +0 -1
  96. package/dist/chat_models.cjs +0 -1967
  97. package/dist/chat_models.cjs.map +0 -1
  98. package/dist/chat_models.d.cts +0 -933
  99. package/dist/chat_models.d.cts.map +0 -1
  100. package/dist/chat_models.d.ts +0 -933
  101. package/dist/chat_models.d.ts.map +0 -1
  102. package/dist/chat_models.js +0 -1963
  103. package/dist/chat_models.js.map +0 -1
@@ -0,0 +1,549 @@
1
+ import { iife, isReasoningModel, messageToOpenAIRole } from "../utils/misc.js";
2
+ import { convertCompletionsCustomTool, formatToOpenAIToolChoice, isBuiltInTool, isBuiltInToolChoice, isCustomTool, isCustomToolCall, isOpenAICustomTool, parseCustomToolCall } from "../utils/tools.js";
3
+ import { _convertOpenAIResponsesUsageToLangChainUsage } from "../utils/output.js";
4
+ import { BaseChatOpenAI } from "./base.js";
5
+ import { wrapOpenAIClientError } from "../utils/client.js";
6
+ import { _convertToResponsesMessageFromV1 } from "../utils/standard.js";
7
+ import { completionsApiContentBlockConverter } from "../utils/message_inputs.js";
8
+ import { isOpenAITool } from "@langchain/core/language_models/base";
9
+ import { makeInvalidToolCall, parseToolCall } from "@langchain/core/output_parsers/openai_tools";
10
+ import { AIMessage, AIMessageChunk, convertToProviderContentBlock, isAIMessage, isDataContentBlock } from "@langchain/core/messages";
11
+ import { ChatGenerationChunk } from "@langchain/core/outputs";
12
+
13
+ //#region src/chat_models/responses.ts
14
+ const _FUNCTION_CALL_IDS_MAP_KEY = "__openai_function_call_ids__";
15
+ /**
16
+ * OpenAI Responses API implementation.
17
+ *
18
+ * Will be exported in a later version of @langchain/openai.
19
+ *
20
+ * @internal
21
+ */
22
+ var ChatOpenAIResponses = class extends BaseChatOpenAI {
23
+ invocationParams(options) {
24
+ let strict;
25
+ if (options?.strict !== void 0) strict = options.strict;
26
+ else if (this.supportsStrictToolCalling !== void 0) strict = this.supportsStrictToolCalling;
27
+ const params = {
28
+ model: this.model,
29
+ temperature: this.temperature,
30
+ top_p: this.topP,
31
+ user: this.user,
32
+ stream: this.streaming,
33
+ previous_response_id: options?.previous_response_id,
34
+ truncation: options?.truncation,
35
+ include: options?.include,
36
+ tools: options?.tools?.length ? this._reduceChatOpenAITools(options.tools, {
37
+ stream: this.streaming,
38
+ strict
39
+ }) : void 0,
40
+ tool_choice: isBuiltInToolChoice(options?.tool_choice) ? options?.tool_choice : (() => {
41
+ const formatted = formatToOpenAIToolChoice(options?.tool_choice);
42
+ if (typeof formatted === "object" && "type" in formatted) {
43
+ if (formatted.type === "function") return {
44
+ type: "function",
45
+ name: formatted.function.name
46
+ };
47
+ else if (formatted.type === "allowed_tools") return {
48
+ type: "allowed_tools",
49
+ mode: formatted.allowed_tools.mode,
50
+ tools: formatted.allowed_tools.tools
51
+ };
52
+ else if (formatted.type === "custom") return {
53
+ type: "custom",
54
+ name: formatted.custom.name
55
+ };
56
+ }
57
+ return void 0;
58
+ })(),
59
+ text: (() => {
60
+ if (options?.text) return options.text;
61
+ const format = this._getResponseFormat(options?.response_format);
62
+ if (format?.type === "json_schema") {
63
+ if (format.json_schema.schema != null) return {
64
+ format: {
65
+ type: "json_schema",
66
+ schema: format.json_schema.schema,
67
+ description: format.json_schema.description,
68
+ name: format.json_schema.name,
69
+ strict: format.json_schema.strict
70
+ },
71
+ verbosity: options?.verbosity
72
+ };
73
+ return void 0;
74
+ }
75
+ return {
76
+ format,
77
+ verbosity: options?.verbosity
78
+ };
79
+ })(),
80
+ parallel_tool_calls: options?.parallel_tool_calls,
81
+ max_output_tokens: this.maxTokens === -1 ? void 0 : this.maxTokens,
82
+ prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,
83
+ ...this.zdrEnabled ? { store: false } : {},
84
+ ...this.modelKwargs
85
+ };
86
+ const reasoning = this._getReasoningParams(options);
87
+ if (reasoning !== void 0) params.reasoning = reasoning;
88
+ return params;
89
+ }
90
+ async _generate(messages, options) {
91
+ const invocationParams = this.invocationParams(options);
92
+ if (invocationParams.stream) {
93
+ const stream = this._streamResponseChunks(messages, options);
94
+ let finalChunk;
95
+ for await (const chunk of stream) {
96
+ chunk.message.response_metadata = {
97
+ ...chunk.generationInfo,
98
+ ...chunk.message.response_metadata
99
+ };
100
+ finalChunk = finalChunk?.concat(chunk) ?? chunk;
101
+ }
102
+ return {
103
+ generations: finalChunk ? [finalChunk] : [],
104
+ llmOutput: { estimatedTokenUsage: (finalChunk?.message)?.usage_metadata }
105
+ };
106
+ } else {
107
+ const input = this._convertMessagesToResponsesParams(messages);
108
+ const data = await this.completionWithRetry({
109
+ input,
110
+ ...invocationParams,
111
+ stream: false
112
+ }, {
113
+ signal: options?.signal,
114
+ ...options?.options
115
+ });
116
+ return {
117
+ generations: [{
118
+ text: data.output_text,
119
+ message: this._convertResponsesMessageToBaseMessage(data)
120
+ }],
121
+ llmOutput: {
122
+ id: data.id,
123
+ estimatedTokenUsage: data.usage ? {
124
+ promptTokens: data.usage.input_tokens,
125
+ completionTokens: data.usage.output_tokens,
126
+ totalTokens: data.usage.total_tokens
127
+ } : void 0
128
+ }
129
+ };
130
+ }
131
+ }
132
+ async *_streamResponseChunks(messages, options, runManager) {
133
+ const streamIterable = await this.completionWithRetry({
134
+ ...this.invocationParams(options),
135
+ input: this._convertMessagesToResponsesParams(messages),
136
+ stream: true
137
+ }, options);
138
+ for await (const data of streamIterable) {
139
+ const chunk = this._convertResponsesDeltaToBaseMessageChunk(data);
140
+ if (chunk == null) continue;
141
+ yield chunk;
142
+ await runManager?.handleLLMNewToken(chunk.text || "", {
143
+ prompt: options.promptIndex ?? 0,
144
+ completion: 0
145
+ }, void 0, void 0, void 0, { chunk });
146
+ }
147
+ }
148
+ async completionWithRetry(request, requestOptions) {
149
+ return this.caller.call(async () => {
150
+ const clientOptions = this._getClientOptions(requestOptions);
151
+ try {
152
+ if (request.text?.format?.type === "json_schema" && !request.stream) return await this.client.responses.parse(request, clientOptions);
153
+ return await this.client.responses.create(request, clientOptions);
154
+ } catch (e) {
155
+ const error = wrapOpenAIClientError(e);
156
+ throw error;
157
+ }
158
+ });
159
+ }
160
+ /** @internal */
161
+ _convertResponsesMessageToBaseMessage(response) {
162
+ if (response.error) {
163
+ const error = new Error(response.error.message);
164
+ error.name = response.error.code;
165
+ throw error;
166
+ }
167
+ let messageId;
168
+ const content = [];
169
+ const tool_calls = [];
170
+ const invalid_tool_calls = [];
171
+ const response_metadata = {
172
+ model_provider: "openai",
173
+ model: response.model,
174
+ created_at: response.created_at,
175
+ id: response.id,
176
+ incomplete_details: response.incomplete_details,
177
+ metadata: response.metadata,
178
+ object: response.object,
179
+ status: response.status,
180
+ user: response.user,
181
+ service_tier: response.service_tier,
182
+ model_name: response.model
183
+ };
184
+ const additional_kwargs = {};
185
+ for (const item of response.output) if (item.type === "message") {
186
+ messageId = item.id;
187
+ content.push(...item.content.flatMap((part) => {
188
+ if (part.type === "output_text") {
189
+ if ("parsed" in part && part.parsed != null) additional_kwargs.parsed = part.parsed;
190
+ return {
191
+ type: "text",
192
+ text: part.text,
193
+ annotations: part.annotations
194
+ };
195
+ }
196
+ if (part.type === "refusal") {
197
+ additional_kwargs.refusal = part.refusal;
198
+ return [];
199
+ }
200
+ return part;
201
+ }));
202
+ } else if (item.type === "function_call") {
203
+ const fnAdapter = {
204
+ function: {
205
+ name: item.name,
206
+ arguments: item.arguments
207
+ },
208
+ id: item.call_id
209
+ };
210
+ try {
211
+ tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));
212
+ } catch (e) {
213
+ let errMessage;
214
+ if (typeof e === "object" && e != null && "message" in e && typeof e.message === "string") errMessage = e.message;
215
+ invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));
216
+ }
217
+ additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};
218
+ if (item.id) additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;
219
+ } else if (item.type === "reasoning") additional_kwargs.reasoning = item;
220
+ else if (item.type === "custom_tool_call") {
221
+ const parsed = parseCustomToolCall(item);
222
+ if (parsed) tool_calls.push(parsed);
223
+ else invalid_tool_calls.push(makeInvalidToolCall(item, "Malformed custom tool call"));
224
+ } else {
225
+ additional_kwargs.tool_outputs ??= [];
226
+ additional_kwargs.tool_outputs.push(item);
227
+ }
228
+ return new AIMessage({
229
+ id: messageId,
230
+ content,
231
+ tool_calls,
232
+ invalid_tool_calls,
233
+ usage_metadata: _convertOpenAIResponsesUsageToLangChainUsage(response.usage),
234
+ additional_kwargs,
235
+ response_metadata
236
+ });
237
+ }
238
+ /** @internal */
239
+ _convertResponsesDeltaToBaseMessageChunk(chunk) {
240
+ const content = [];
241
+ let generationInfo = {};
242
+ let usage_metadata;
243
+ const tool_call_chunks = [];
244
+ const response_metadata = { model_provider: "openai" };
245
+ const additional_kwargs = {};
246
+ let id;
247
+ if (chunk.type === "response.output_text.delta") content.push({
248
+ type: "text",
249
+ text: chunk.delta,
250
+ index: chunk.content_index
251
+ });
252
+ else if (chunk.type === "response.output_text.annotation.added") content.push({
253
+ type: "text",
254
+ text: "",
255
+ annotations: [chunk.annotation],
256
+ index: chunk.content_index
257
+ });
258
+ else if (chunk.type === "response.output_item.added" && chunk.item.type === "message") id = chunk.item.id;
259
+ else if (chunk.type === "response.output_item.added" && chunk.item.type === "function_call") {
260
+ tool_call_chunks.push({
261
+ type: "tool_call_chunk",
262
+ name: chunk.item.name,
263
+ args: chunk.item.arguments,
264
+ id: chunk.item.call_id,
265
+ index: chunk.output_index
266
+ });
267
+ additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = { [chunk.item.call_id]: chunk.item.id };
268
+ } else if (chunk.type === "response.output_item.done" && [
269
+ "web_search_call",
270
+ "file_search_call",
271
+ "computer_call",
272
+ "code_interpreter_call",
273
+ "mcp_call",
274
+ "mcp_list_tools",
275
+ "mcp_approval_request",
276
+ "image_generation_call",
277
+ "custom_tool_call"
278
+ ].includes(chunk.item.type)) additional_kwargs.tool_outputs = [chunk.item];
279
+ else if (chunk.type === "response.created") {
280
+ response_metadata.id = chunk.response.id;
281
+ response_metadata.model_name = chunk.response.model;
282
+ response_metadata.model = chunk.response.model;
283
+ } else if (chunk.type === "response.completed") {
284
+ const msg = this._convertResponsesMessageToBaseMessage(chunk.response);
285
+ usage_metadata = _convertOpenAIResponsesUsageToLangChainUsage(chunk.response.usage);
286
+ if (chunk.response.text?.format?.type === "json_schema") additional_kwargs.parsed ??= JSON.parse(msg.text);
287
+ for (const [key, value] of Object.entries(chunk.response)) if (key !== "id") response_metadata[key] = value;
288
+ } else if (chunk.type === "response.function_call_arguments.delta" || chunk.type === "response.custom_tool_call_input.delta") tool_call_chunks.push({
289
+ type: "tool_call_chunk",
290
+ args: chunk.delta,
291
+ index: chunk.output_index
292
+ });
293
+ else if (chunk.type === "response.web_search_call.completed" || chunk.type === "response.file_search_call.completed") generationInfo = { tool_outputs: {
294
+ id: chunk.item_id,
295
+ type: chunk.type.replace("response.", "").replace(".completed", ""),
296
+ status: "completed"
297
+ } };
298
+ else if (chunk.type === "response.refusal.done") additional_kwargs.refusal = chunk.refusal;
299
+ else if (chunk.type === "response.output_item.added" && "item" in chunk && chunk.item.type === "reasoning") {
300
+ const summary = chunk.item.summary ? chunk.item.summary.map((s, index) => ({
301
+ ...s,
302
+ index
303
+ })) : void 0;
304
+ additional_kwargs.reasoning = {
305
+ id: chunk.item.id,
306
+ type: chunk.item.type,
307
+ ...summary ? { summary } : {}
308
+ };
309
+ } else if (chunk.type === "response.reasoning_summary_part.added") additional_kwargs.reasoning = {
310
+ type: "reasoning",
311
+ summary: [{
312
+ ...chunk.part,
313
+ index: chunk.summary_index
314
+ }]
315
+ };
316
+ else if (chunk.type === "response.reasoning_summary_text.delta") additional_kwargs.reasoning = {
317
+ type: "reasoning",
318
+ summary: [{
319
+ text: chunk.delta,
320
+ type: "summary_text",
321
+ index: chunk.summary_index
322
+ }]
323
+ };
324
+ else if (chunk.type === "response.image_generation_call.partial_image") return null;
325
+ else return null;
326
+ return new ChatGenerationChunk({
327
+ text: content.map((part) => part.text).join(""),
328
+ message: new AIMessageChunk({
329
+ id,
330
+ content,
331
+ tool_call_chunks,
332
+ usage_metadata,
333
+ additional_kwargs,
334
+ response_metadata
335
+ }),
336
+ generationInfo
337
+ });
338
+ }
339
+ /** @internal */
340
+ _convertMessagesToResponsesParams(messages) {
341
+ return messages.flatMap((lcMsg) => {
342
+ const responseMetadata = lcMsg.response_metadata;
343
+ if (responseMetadata?.output_version === "v1") return _convertToResponsesMessageFromV1(lcMsg);
344
+ const additional_kwargs = lcMsg.additional_kwargs;
345
+ let role = messageToOpenAIRole(lcMsg);
346
+ if (role === "system" && isReasoningModel(this.model)) role = "developer";
347
+ if (role === "function") throw new Error("Function messages are not supported in Responses API");
348
+ if (role === "tool") {
349
+ const toolMessage = lcMsg;
350
+ if (additional_kwargs?.type === "computer_call_output") {
351
+ const output = (() => {
352
+ if (typeof toolMessage.content === "string") return {
353
+ type: "computer_screenshot",
354
+ image_url: toolMessage.content
355
+ };
356
+ if (Array.isArray(toolMessage.content)) {
357
+ const oaiScreenshot = toolMessage.content.find((i) => i.type === "computer_screenshot");
358
+ if (oaiScreenshot) return oaiScreenshot;
359
+ const lcImage = toolMessage.content.find((i) => i.type === "image_url");
360
+ if (lcImage) return {
361
+ type: "computer_screenshot",
362
+ image_url: typeof lcImage.image_url === "string" ? lcImage.image_url : lcImage.image_url.url
363
+ };
364
+ }
365
+ throw new Error("Invalid computer call output");
366
+ })();
367
+ return {
368
+ type: "computer_call_output",
369
+ output,
370
+ call_id: toolMessage.tool_call_id
371
+ };
372
+ }
373
+ if (toolMessage.additional_kwargs?.customTool) return {
374
+ type: "custom_tool_call_output",
375
+ call_id: toolMessage.tool_call_id,
376
+ output: toolMessage.content
377
+ };
378
+ return {
379
+ type: "function_call_output",
380
+ call_id: toolMessage.tool_call_id,
381
+ id: toolMessage.id?.startsWith("fc_") ? toolMessage.id : void 0,
382
+ output: typeof toolMessage.content !== "string" ? JSON.stringify(toolMessage.content) : toolMessage.content
383
+ };
384
+ }
385
+ if (role === "assistant") {
386
+ if (!this.zdrEnabled && responseMetadata?.output != null && Array.isArray(responseMetadata?.output) && responseMetadata?.output.length > 0 && responseMetadata?.output.every((item) => "type" in item)) return responseMetadata?.output;
387
+ const input = [];
388
+ if (additional_kwargs?.reasoning && !this.zdrEnabled) {
389
+ const reasoningItem = this._convertReasoningSummary(additional_kwargs.reasoning);
390
+ input.push(reasoningItem);
391
+ }
392
+ let { content } = lcMsg;
393
+ if (additional_kwargs?.refusal) {
394
+ if (typeof content === "string") content = [{
395
+ type: "output_text",
396
+ text: content,
397
+ annotations: []
398
+ }];
399
+ content = [...content, {
400
+ type: "refusal",
401
+ refusal: additional_kwargs.refusal
402
+ }];
403
+ }
404
+ if (typeof content === "string" || content.length > 0) input.push({
405
+ type: "message",
406
+ role: "assistant",
407
+ ...lcMsg.id && !this.zdrEnabled && lcMsg.id.startsWith("msg_") ? { id: lcMsg.id } : {},
408
+ content: iife(() => {
409
+ if (typeof content === "string") return content;
410
+ return content.flatMap((item) => {
411
+ if (item.type === "text") return {
412
+ type: "output_text",
413
+ text: item.text,
414
+ annotations: item.annotations ?? []
415
+ };
416
+ if (item.type === "output_text" || item.type === "refusal") return item;
417
+ return [];
418
+ });
419
+ })
420
+ });
421
+ const functionCallIds = additional_kwargs?.[_FUNCTION_CALL_IDS_MAP_KEY];
422
+ if (isAIMessage(lcMsg) && !!lcMsg.tool_calls?.length) input.push(...lcMsg.tool_calls.map((toolCall) => {
423
+ if (isCustomToolCall(toolCall)) return {
424
+ type: "custom_tool_call",
425
+ id: toolCall.call_id,
426
+ call_id: toolCall.id ?? "",
427
+ input: toolCall.args.input,
428
+ name: toolCall.name
429
+ };
430
+ return {
431
+ type: "function_call",
432
+ name: toolCall.name,
433
+ arguments: JSON.stringify(toolCall.args),
434
+ call_id: toolCall.id,
435
+ ...this.zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}
436
+ };
437
+ }));
438
+ else if (additional_kwargs?.tool_calls) input.push(...additional_kwargs.tool_calls.map((toolCall) => ({
439
+ type: "function_call",
440
+ name: toolCall.function.name,
441
+ call_id: toolCall.id,
442
+ arguments: toolCall.function.arguments,
443
+ ...this.zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}
444
+ })));
445
+ const toolOutputs = (responseMetadata?.output)?.length ? responseMetadata?.output : additional_kwargs.tool_outputs;
446
+ const fallthroughCallTypes = [
447
+ "computer_call",
448
+ "mcp_call",
449
+ "code_interpreter_call",
450
+ "image_generation_call"
451
+ ];
452
+ if (toolOutputs != null) {
453
+ const castToolOutputs = toolOutputs;
454
+ const fallthroughCalls = castToolOutputs?.filter((item) => fallthroughCallTypes.includes(item.type));
455
+ if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);
456
+ }
457
+ return input;
458
+ }
459
+ if (role === "user" || role === "system" || role === "developer") {
460
+ if (typeof lcMsg.content === "string") return {
461
+ type: "message",
462
+ role,
463
+ content: lcMsg.content
464
+ };
465
+ const messages$1 = [];
466
+ const content = lcMsg.content.flatMap((item) => {
467
+ if (item.type === "mcp_approval_response") messages$1.push({
468
+ type: "mcp_approval_response",
469
+ approval_request_id: item.approval_request_id,
470
+ approve: item.approve
471
+ });
472
+ if (isDataContentBlock(item)) return convertToProviderContentBlock(item, completionsApiContentBlockConverter);
473
+ if (item.type === "text") return {
474
+ type: "input_text",
475
+ text: item.text
476
+ };
477
+ if (item.type === "image_url") {
478
+ const imageUrl = iife(() => {
479
+ if (typeof item.image_url === "string") return item.image_url;
480
+ else if (typeof item.image_url === "object" && item.image_url !== null && "url" in item.image_url) return item.image_url.url;
481
+ return void 0;
482
+ });
483
+ const detail = iife(() => {
484
+ if (typeof item.image_url === "string") return "auto";
485
+ else if (typeof item.image_url === "object" && item.image_url !== null && "detail" in item.image_url) return item.image_url.detail;
486
+ return void 0;
487
+ });
488
+ return {
489
+ type: "input_image",
490
+ image_url: imageUrl,
491
+ detail
492
+ };
493
+ }
494
+ if (item.type === "input_text" || item.type === "input_image" || item.type === "input_file") return item;
495
+ return [];
496
+ });
497
+ if (content.length > 0) messages$1.push({
498
+ type: "message",
499
+ role,
500
+ content
501
+ });
502
+ return messages$1;
503
+ }
504
+ console.warn(`Unsupported role found when converting to OpenAI Responses API: ${role}`);
505
+ return [];
506
+ });
507
+ }
508
+ /** @internal */
509
+ _convertReasoningSummary(reasoning) {
510
+ const summary = (reasoning.summary.length > 1 ? reasoning.summary.reduce((acc, curr) => {
511
+ const last = acc[acc.length - 1];
512
+ if (last.index === curr.index) last.text += curr.text;
513
+ else acc.push(curr);
514
+ return acc;
515
+ }, [{ ...reasoning.summary[0] }]) : reasoning.summary).map((s) => Object.fromEntries(Object.entries(s).filter(([k]) => k !== "index")));
516
+ return {
517
+ ...reasoning,
518
+ summary
519
+ };
520
+ }
521
+ /** @internal */
522
+ _reduceChatOpenAITools(tools, fields) {
523
+ const reducedTools = [];
524
+ for (const tool of tools) if (isBuiltInTool(tool)) {
525
+ if (tool.type === "image_generation" && fields?.stream) tool.partial_images = 1;
526
+ reducedTools.push(tool);
527
+ } else if (isCustomTool(tool)) {
528
+ const customToolData = tool.metadata.customTool;
529
+ reducedTools.push({
530
+ type: "custom",
531
+ name: customToolData.name,
532
+ description: customToolData.description,
533
+ format: customToolData.format
534
+ });
535
+ } else if (isOpenAITool(tool)) reducedTools.push({
536
+ type: "function",
537
+ name: tool.function.name,
538
+ parameters: tool.function.parameters,
539
+ description: tool.function.description,
540
+ strict: fields?.strict ?? null
541
+ });
542
+ else if (isOpenAICustomTool(tool)) reducedTools.push(convertCompletionsCustomTool(tool));
543
+ return reducedTools;
544
+ }
545
+ };
546
+
547
+ //#endregion
548
+ export { ChatOpenAIResponses };
549
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","names":["options?: this[\"ParsedCallOptions\"]","strict: boolean | undefined","params: ChatResponsesInvocationParams","messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","finalChunk: ChatGenerationChunk | undefined","runManager?: CallbackManagerForLLMRun","request: OpenAIClient.Responses.ResponseCreateParams","requestOptions?: OpenAIClient.RequestOptions","response: ResponsesCreateInvoke | ResponsesParseInvoke","messageId: string | undefined","content: MessageContent","tool_calls: ToolCall[]","invalid_tool_calls: InvalidToolCall[]","response_metadata: Record<string, unknown>","additional_kwargs: {\n [key: string]: unknown;\n refusal?: string;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n tool_outputs?: unknown[];\n parsed?: unknown;\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n }","e: unknown","errMessage: string | undefined","chunk: OpenAIClient.Responses.ResponseStreamEvent","content: Record<string, unknown>[]","generationInfo: Record<string, unknown>","usage_metadata: UsageMetadata | undefined","tool_call_chunks: ToolCallChunk[]","additional_kwargs: {\n [key: string]: unknown;\n reasoning?: Partial<ChatOpenAIReasoningSummary>;\n tool_outputs?: unknown[];\n }","id: string | undefined","summary: ChatOpenAIReasoningSummary[\"summary\"] | undefined","input: ResponsesInputItem[]","fallthroughCallTypes: ResponsesInputItem[\"type\"][]","messages: ResponsesInputItem[]","messages","reasoning: ChatOpenAIReasoningSummary","tools: ChatOpenAIToolType[]","fields: { stream?: boolean; strict?: boolean }","reducedTools: ResponsesTool[]","isOpenAIFunctionTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n isAIMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n type InvalidToolCall,\n MessageContentImageUrl,\n isDataContentBlock,\n convertToProviderContentBlock,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport {\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport type {\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport { ResponseInputMessageContentList } from \"openai/resources/responses/responses.js\";\nimport { ChatOpenAIReasoningSummary, OpenAIVerbosityParam } from \"../types.js\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n formatToOpenAIToolChoice,\n _convertToOpenAITool,\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isCustomToolCall,\n isOpenAICustomTool,\n parseCustomToolCall,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport { _convertOpenAIResponsesUsageToLangChainUsage } from \"../utils/output.js\";\nimport {\n _convertMessagesToOpenAIParams,\n completionsApiContentBlockConverter,\n} from \"../utils/message_inputs.js\";\nimport {\n _convertToResponsesMessageFromV1,\n ResponsesInputItem,\n} from \"../utils/standard.js\";\nimport { iife, isReasoningModel, messageToOpenAIRole } from \"../utils/misc.js\";\nimport { BaseChatOpenAI, BaseChatOpenAICallOptions } from \"./base.js\";\n\nconst _FUNCTION_CALL_IDS_MAP_KEY = \"__openai_function_call_ids__\";\n\nexport interface ChatOpenAIResponsesCallOptions\n 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\ntype ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\ntype ExcludeController<T> = T extends { controller: unknown } ? never : T;\n\ntype ResponsesCreate = OpenAIClient.Responses[\"create\"];\ntype ResponsesParse = OpenAIClient.Responses[\"parse\"];\n\ntype ResponsesCreateInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\ntype ResponsesParseInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesParse>>\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 = ChatOpenAIResponsesCallOptions\n> extends BaseChatOpenAI<CallOptions> {\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (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\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 ...(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 ): Promise<ChatResult> {\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options);\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 input = this._convertMessagesToResponsesParams(messages);\n const data = await this.completionWithRetry(\n {\n input,\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: this._convertResponsesMessageToBaseMessage(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 *_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: this._convertMessagesToResponsesParams(messages),\n stream: true,\n },\n options\n );\n\n for await (const data of streamIterable) {\n const chunk = this._convertResponsesDeltaToBaseMessageChunk(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 _convertResponsesMessageToBaseMessage(\n response: ResponsesCreateInvoke | ResponsesParseInvoke\n ): BaseMessage {\n if (response.error) {\n // TODO: add support for `addLangChainErrorFields`\n const error = new Error(response.error.message);\n error.name = response.error.code;\n throw error;\n }\n\n let messageId: string | undefined;\n const content: MessageContent = [];\n const tool_calls: ToolCall[] = [];\n const invalid_tool_calls: InvalidToolCall[] = [];\n const response_metadata: Record<string, unknown> = {\n model_provider: \"openai\",\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n incomplete_details: response.incomplete_details,\n metadata: response.metadata,\n object: response.object,\n status: response.status,\n user: response.user,\n service_tier: response.service_tier,\n // for compatibility with chat completion calls.\n model_name: response.model,\n };\n\n const additional_kwargs: {\n [key: string]: unknown;\n refusal?: string;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n tool_outputs?: unknown[];\n parsed?: unknown;\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n } = {};\n\n for (const item of response.output) {\n if (item.type === \"message\") {\n messageId = item.id;\n content.push(\n ...item.content.flatMap((part) => {\n if (part.type === \"output_text\") {\n if (\"parsed\" in part && part.parsed != null) {\n additional_kwargs.parsed = part.parsed;\n }\n return {\n type: \"text\",\n text: part.text,\n annotations: part.annotations,\n };\n }\n\n if (part.type === \"refusal\") {\n additional_kwargs.refusal = part.refusal;\n return [];\n }\n\n return part;\n })\n );\n } else if (item.type === \"function_call\") {\n const fnAdapter = {\n function: { name: item.name, arguments: item.arguments },\n id: item.call_id,\n };\n\n try {\n tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));\n } catch (e: unknown) {\n let errMessage: string | undefined;\n if (\n typeof e === \"object\" &&\n e != null &&\n \"message\" in e &&\n typeof e.message === \"string\"\n ) {\n errMessage = e.message;\n }\n invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));\n }\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};\n if (item.id) {\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;\n }\n } else if (item.type === \"reasoning\") {\n additional_kwargs.reasoning = item;\n } else if (item.type === \"custom_tool_call\") {\n const parsed = parseCustomToolCall(item);\n if (parsed) {\n tool_calls.push(parsed);\n } else {\n invalid_tool_calls.push(\n makeInvalidToolCall(item, \"Malformed custom tool call\")\n );\n }\n } else {\n additional_kwargs.tool_outputs ??= [];\n additional_kwargs.tool_outputs.push(item);\n }\n }\n\n return new AIMessage({\n id: messageId,\n content,\n tool_calls,\n invalid_tool_calls,\n usage_metadata: _convertOpenAIResponsesUsageToLangChainUsage(\n response.usage\n ),\n additional_kwargs,\n response_metadata,\n });\n }\n\n /** @internal */\n protected _convertResponsesDeltaToBaseMessageChunk(\n chunk: OpenAIClient.Responses.ResponseStreamEvent\n ) {\n const content: Record<string, unknown>[] = [];\n let generationInfo: Record<string, unknown> = {};\n let usage_metadata: UsageMetadata | undefined;\n const tool_call_chunks: ToolCallChunk[] = [];\n const response_metadata: Record<string, unknown> = {\n model_provider: \"openai\",\n };\n const additional_kwargs: {\n [key: string]: unknown;\n reasoning?: Partial<ChatOpenAIReasoningSummary>;\n tool_outputs?: unknown[];\n } = {};\n let id: string | undefined;\n if (chunk.type === \"response.output_text.delta\") {\n content.push({\n type: \"text\",\n text: chunk.delta,\n index: chunk.content_index,\n });\n } else if (chunk.type === \"response.output_text.annotation.added\") {\n content.push({\n type: \"text\",\n text: \"\",\n annotations: [chunk.annotation],\n index: chunk.content_index,\n });\n } else if (\n chunk.type === \"response.output_item.added\" &&\n chunk.item.type === \"message\"\n ) {\n id = chunk.item.id;\n } else if (\n chunk.type === \"response.output_item.added\" &&\n chunk.item.type === \"function_call\"\n ) {\n tool_call_chunks.push({\n type: \"tool_call_chunk\",\n name: chunk.item.name,\n args: chunk.item.arguments,\n id: chunk.item.call_id,\n index: chunk.output_index,\n });\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = {\n [chunk.item.call_id]: chunk.item.id,\n };\n } else if (\n chunk.type === \"response.output_item.done\" &&\n [\n \"web_search_call\",\n \"file_search_call\",\n \"computer_call\",\n \"code_interpreter_call\",\n \"mcp_call\",\n \"mcp_list_tools\",\n \"mcp_approval_request\",\n \"image_generation_call\",\n \"custom_tool_call\",\n ].includes(chunk.item.type)\n ) {\n additional_kwargs.tool_outputs = [chunk.item];\n } else if (chunk.type === \"response.created\") {\n response_metadata.id = chunk.response.id;\n response_metadata.model_name = chunk.response.model;\n response_metadata.model = chunk.response.model;\n } else if (chunk.type === \"response.completed\") {\n const msg = this._convertResponsesMessageToBaseMessage(chunk.response);\n\n usage_metadata = _convertOpenAIResponsesUsageToLangChainUsage(\n chunk.response.usage\n );\n\n if (chunk.response.text?.format?.type === \"json_schema\") {\n additional_kwargs.parsed ??= JSON.parse(msg.text);\n }\n for (const [key, value] of Object.entries(chunk.response)) {\n if (key !== \"id\") response_metadata[key] = value;\n }\n } else if (\n chunk.type === \"response.function_call_arguments.delta\" ||\n chunk.type === \"response.custom_tool_call_input.delta\"\n ) {\n tool_call_chunks.push({\n type: \"tool_call_chunk\",\n args: chunk.delta,\n index: chunk.output_index,\n });\n } else if (\n chunk.type === \"response.web_search_call.completed\" ||\n chunk.type === \"response.file_search_call.completed\"\n ) {\n generationInfo = {\n tool_outputs: {\n id: chunk.item_id,\n type: chunk.type.replace(\"response.\", \"\").replace(\".completed\", \"\"),\n status: \"completed\",\n },\n };\n } else if (chunk.type === \"response.refusal.done\") {\n additional_kwargs.refusal = chunk.refusal;\n } else if (\n chunk.type === \"response.output_item.added\" &&\n \"item\" in chunk &&\n chunk.item.type === \"reasoning\"\n ) {\n const summary: ChatOpenAIReasoningSummary[\"summary\"] | undefined = chunk\n .item.summary\n ? chunk.item.summary.map((s, index) => ({\n ...s,\n index,\n }))\n : undefined;\n\n additional_kwargs.reasoning = {\n // We only capture ID in the first chunk or else the concatenated result of all chunks will\n // have an ID field that is repeated once per chunk. There is special handling for the `type`\n // field that prevents this, however.\n id: chunk.item.id,\n type: chunk.item.type,\n ...(summary ? { summary } : {}),\n };\n } else if (chunk.type === \"response.reasoning_summary_part.added\") {\n additional_kwargs.reasoning = {\n type: \"reasoning\",\n summary: [{ ...chunk.part, index: chunk.summary_index }],\n };\n } else if (chunk.type === \"response.reasoning_summary_text.delta\") {\n additional_kwargs.reasoning = {\n type: \"reasoning\",\n summary: [\n {\n text: chunk.delta,\n type: \"summary_text\",\n index: chunk.summary_index,\n },\n ],\n };\n } else if (chunk.type === \"response.image_generation_call.partial_image\") {\n // noop/fixme: retaining partial images in a message chunk means that _all_\n // partial images get kept in history, so we don't do anything here.\n return null;\n } else {\n return null;\n }\n\n return new ChatGenerationChunk({\n // Legacy reasons, `onLLMNewToken` should pulls this out\n text: content.map((part) => part.text).join(\"\"),\n message: new AIMessageChunk({\n id,\n content: content as MessageContent,\n tool_call_chunks,\n usage_metadata,\n additional_kwargs,\n response_metadata,\n }),\n generationInfo,\n });\n }\n\n /** @internal */\n protected _convertMessagesToResponsesParams(messages: BaseMessage[]) {\n return messages.flatMap(\n (lcMsg): ResponsesInputItem | ResponsesInputItem[] => {\n const responseMetadata = lcMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n if (responseMetadata?.output_version === \"v1\") {\n return _convertToResponsesMessageFromV1(lcMsg);\n }\n\n const additional_kwargs = lcMsg.additional_kwargs as\n | BaseMessageFields[\"additional_kwargs\"] & {\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n type?: string;\n refusal?: string;\n };\n\n let role = messageToOpenAIRole(lcMsg);\n if (role === \"system\" && isReasoningModel(this.model))\n role = \"developer\";\n\n if (role === \"function\") {\n throw new Error(\n \"Function messages are not supported in Responses API\"\n );\n }\n\n if (role === \"tool\") {\n const toolMessage = lcMsg as ToolMessage;\n\n // Handle computer call output\n if (additional_kwargs?.type === \"computer_call_output\") {\n const output = (() => {\n if (typeof toolMessage.content === \"string\") {\n return {\n type: \"computer_screenshot\" as const,\n image_url: toolMessage.content,\n };\n }\n\n if (Array.isArray(toolMessage.content)) {\n const oaiScreenshot = toolMessage.content.find(\n (i) => i.type === \"computer_screenshot\"\n ) as { type: \"computer_screenshot\"; image_url: string };\n\n if (oaiScreenshot) return oaiScreenshot;\n\n const lcImage = toolMessage.content.find(\n (i) => i.type === \"image_url\"\n ) as MessageContentImageUrl;\n\n if (lcImage) {\n return {\n type: \"computer_screenshot\" as const,\n image_url:\n typeof lcImage.image_url === \"string\"\n ? lcImage.image_url\n : lcImage.image_url.url,\n };\n }\n }\n\n throw new Error(\"Invalid computer call output\");\n })();\n\n return {\n type: \"computer_call_output\",\n output,\n call_id: toolMessage.tool_call_id,\n };\n }\n\n // Handle custom tool output\n if (toolMessage.additional_kwargs?.customTool) {\n return {\n type: \"custom_tool_call_output\",\n call_id: toolMessage.tool_call_id,\n output: toolMessage.content as string,\n };\n }\n\n return {\n type: \"function_call_output\",\n call_id: toolMessage.tool_call_id,\n id: toolMessage.id?.startsWith(\"fc_\") ? toolMessage.id : undefined,\n output:\n typeof toolMessage.content !== \"string\"\n ? JSON.stringify(toolMessage.content)\n : toolMessage.content,\n };\n }\n\n if (role === \"assistant\") {\n // if we have the original response items, just reuse them\n if (\n !this.zdrEnabled &&\n responseMetadata?.output != null &&\n Array.isArray(responseMetadata?.output) &&\n responseMetadata?.output.length > 0 &&\n responseMetadata?.output.every((item) => \"type\" in item)\n ) {\n return responseMetadata?.output;\n }\n\n // otherwise, try to reconstruct the response from what we have\n\n const input: ResponsesInputItem[] = [];\n\n // reasoning items\n if (additional_kwargs?.reasoning && !this.zdrEnabled) {\n const reasoningItem = this._convertReasoningSummary(\n additional_kwargs.reasoning\n );\n input.push(reasoningItem);\n }\n\n // ai content\n let { content } = lcMsg;\n if (additional_kwargs?.refusal) {\n if (typeof content === \"string\") {\n content = [\n { type: \"output_text\", text: content, annotations: [] },\n ];\n }\n content = [\n ...content,\n { type: \"refusal\", refusal: additional_kwargs.refusal },\n ];\n }\n\n if (typeof content === \"string\" || content.length > 0) {\n input.push({\n type: \"message\",\n role: \"assistant\",\n ...(lcMsg.id && !this.zdrEnabled && lcMsg.id.startsWith(\"msg_\")\n ? { id: lcMsg.id }\n : {}),\n content: iife(() => {\n if (typeof content === \"string\") {\n return content;\n }\n return content.flatMap((item) => {\n if (item.type === \"text\") {\n return {\n type: \"output_text\",\n text: item.text,\n annotations: item.annotations ?? [],\n };\n }\n\n if (item.type === \"output_text\" || item.type === \"refusal\") {\n return item;\n }\n\n return [];\n });\n }) as ResponseInputMessageContentList,\n });\n }\n\n const functionCallIds =\n additional_kwargs?.[_FUNCTION_CALL_IDS_MAP_KEY];\n\n if (isAIMessage(lcMsg) && !!lcMsg.tool_calls?.length) {\n input.push(\n ...lcMsg.tool_calls.map((toolCall): ResponsesInputItem => {\n if (isCustomToolCall(toolCall)) {\n return {\n type: \"custom_tool_call\",\n id: toolCall.call_id,\n call_id: toolCall.id ?? \"\",\n input: toolCall.args.input,\n name: toolCall.name,\n };\n }\n return {\n type: \"function_call\",\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.args),\n call_id: toolCall.id!,\n ...(this.zdrEnabled\n ? { id: functionCallIds?.[toolCall.id!] }\n : {}),\n };\n })\n );\n } else if (additional_kwargs?.tool_calls) {\n input.push(\n ...additional_kwargs.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: \"function_call\",\n name: toolCall.function.name,\n call_id: toolCall.id,\n arguments: toolCall.function.arguments,\n ...(this.zdrEnabled\n ? { id: functionCallIds?.[toolCall.id] }\n : {}),\n })\n )\n );\n }\n\n const toolOutputs = (\n responseMetadata?.output as Array<ResponsesInputItem>\n )?.length\n ? responseMetadata?.output\n : additional_kwargs.tool_outputs;\n\n const fallthroughCallTypes: ResponsesInputItem[\"type\"][] = [\n \"computer_call\",\n \"mcp_call\",\n \"code_interpreter_call\",\n \"image_generation_call\",\n ];\n\n if (toolOutputs != null) {\n const castToolOutputs = toolOutputs as Array<ResponsesInputItem>;\n const fallthroughCalls = castToolOutputs?.filter((item) =>\n fallthroughCallTypes.includes(item.type)\n );\n if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);\n }\n\n return input;\n }\n\n if (role === \"user\" || role === \"system\" || role === \"developer\") {\n if (typeof lcMsg.content === \"string\") {\n return { type: \"message\", role, content: lcMsg.content };\n }\n\n const messages: ResponsesInputItem[] = [];\n const content = lcMsg.content.flatMap((item) => {\n if (item.type === \"mcp_approval_response\") {\n messages.push({\n type: \"mcp_approval_response\",\n approval_request_id: item.approval_request_id as string,\n approve: item.approve as boolean,\n });\n }\n if (isDataContentBlock(item)) {\n return convertToProviderContentBlock(\n item,\n completionsApiContentBlockConverter\n );\n }\n if (item.type === \"text\") {\n return {\n type: \"input_text\",\n text: item.text,\n };\n }\n if (item.type === \"image_url\") {\n const imageUrl = iife(() => {\n if (typeof item.image_url === \"string\") {\n return item.image_url;\n } else if (\n typeof item.image_url === \"object\" &&\n item.image_url !== null &&\n \"url\" in item.image_url\n ) {\n return item.image_url.url;\n }\n return undefined;\n });\n const detail = iife(() => {\n if (typeof item.image_url === \"string\") {\n return \"auto\";\n } else if (\n typeof item.image_url === \"object\" &&\n item.image_url !== null &&\n \"detail\" in item.image_url\n ) {\n return item.image_url.detail;\n }\n return undefined;\n });\n return {\n type: \"input_image\",\n image_url: imageUrl,\n detail,\n };\n }\n if (\n item.type === \"input_text\" ||\n item.type === \"input_image\" ||\n item.type === \"input_file\"\n ) {\n return item;\n }\n return [];\n });\n\n if (content.length > 0) {\n messages.push({\n type: \"message\",\n role,\n content: content as ResponseInputMessageContentList,\n });\n }\n return messages;\n }\n\n console.warn(\n `Unsupported role found when converting to OpenAI Responses API: ${role}`\n );\n return [];\n }\n );\n }\n\n /** @internal */\n protected _convertReasoningSummary(\n reasoning: ChatOpenAIReasoningSummary\n ): OpenAIClient.Responses.ResponseReasoningItem {\n // combine summary parts that have the the same index and then remove the indexes\n const summary = (\n reasoning.summary.length > 1\n ? reasoning.summary.reduce(\n (acc, curr) => {\n const last = acc[acc.length - 1];\n\n if (last!.index === curr.index) {\n last!.text += curr.text;\n } else {\n acc.push(curr);\n }\n return acc;\n },\n [{ ...reasoning.summary[0] }]\n )\n : reasoning.summary\n ).map((s) =>\n Object.fromEntries(Object.entries(s).filter(([k]) => k !== \"index\"))\n ) as OpenAIClient.Responses.ResponseReasoningItem.Summary[];\n\n return {\n ...reasoning,\n summary,\n } as OpenAIClient.Responses.ResponseReasoningItem;\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 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 });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}