@langchain/openai 1.0.0 → 1.1.1

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 (106) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/azure/chat_models/completions.d.cts +1 -1
  3. package/dist/azure/chat_models/index.cjs +1 -1
  4. package/dist/azure/chat_models/index.d.cts +2 -2
  5. package/dist/azure/chat_models/index.js +1 -1
  6. package/dist/azure/chat_models/responses.cjs +1 -1
  7. package/dist/azure/chat_models/responses.d.cts +1 -1
  8. package/dist/azure/chat_models/responses.js +1 -1
  9. package/dist/azure/embeddings.cjs +1 -1
  10. package/dist/azure/embeddings.js +1 -1
  11. package/dist/chat_models/base.cjs +24 -3
  12. package/dist/chat_models/base.cjs.map +1 -1
  13. package/dist/chat_models/base.d.cts +20 -1
  14. package/dist/chat_models/base.d.cts.map +1 -1
  15. package/dist/chat_models/base.d.ts +23 -4
  16. package/dist/chat_models/base.d.ts.map +1 -1
  17. package/dist/chat_models/base.js +24 -3
  18. package/dist/chat_models/base.js.map +1 -1
  19. package/dist/chat_models/completions.cjs +36 -106
  20. package/dist/chat_models/completions.cjs.map +1 -1
  21. package/dist/chat_models/completions.d.cts +18 -7
  22. package/dist/chat_models/completions.d.cts.map +1 -1
  23. package/dist/chat_models/completions.d.ts +17 -6
  24. package/dist/chat_models/completions.d.ts.map +1 -1
  25. package/dist/chat_models/completions.js +37 -107
  26. package/dist/chat_models/completions.js.map +1 -1
  27. package/dist/chat_models/index.cjs +1 -1
  28. package/dist/chat_models/index.cjs.map +1 -1
  29. package/dist/chat_models/index.d.cts +3 -3
  30. package/dist/chat_models/index.d.ts +4 -4
  31. package/dist/chat_models/index.js +1 -1
  32. package/dist/chat_models/index.js.map +1 -1
  33. package/dist/chat_models/profiles.cjs +567 -0
  34. package/dist/chat_models/profiles.cjs.map +1 -0
  35. package/dist/chat_models/profiles.js +566 -0
  36. package/dist/chat_models/profiles.js.map +1 -0
  37. package/dist/chat_models/responses.cjs +14 -375
  38. package/dist/chat_models/responses.cjs.map +1 -1
  39. package/dist/chat_models/responses.d.cts +2 -17
  40. package/dist/chat_models/responses.d.cts.map +1 -1
  41. package/dist/chat_models/responses.d.ts +1 -16
  42. package/dist/chat_models/responses.d.ts.map +1 -1
  43. package/dist/chat_models/responses.js +15 -376
  44. package/dist/chat_models/responses.js.map +1 -1
  45. package/dist/converters/completions.cjs +605 -0
  46. package/dist/converters/completions.cjs.map +1 -0
  47. package/dist/converters/completions.d.cts +319 -0
  48. package/dist/converters/completions.d.cts.map +1 -0
  49. package/dist/converters/completions.d.ts +319 -0
  50. package/dist/converters/completions.d.ts.map +1 -0
  51. package/dist/converters/completions.js +599 -0
  52. package/dist/converters/completions.js.map +1 -0
  53. package/dist/converters/index.cjs +2 -0
  54. package/dist/converters/index.js +2 -0
  55. package/dist/converters/responses.cjs +895 -0
  56. package/dist/converters/responses.cjs.map +1 -0
  57. package/dist/converters/responses.d.cts +310 -0
  58. package/dist/converters/responses.d.cts.map +1 -0
  59. package/dist/converters/responses.d.ts +310 -0
  60. package/dist/converters/responses.d.ts.map +1 -0
  61. package/dist/converters/responses.js +889 -0
  62. package/dist/converters/responses.js.map +1 -0
  63. package/dist/embeddings.cjs +1 -1
  64. package/dist/embeddings.js +1 -1
  65. package/dist/index.cjs +24 -11
  66. package/dist/index.d.cts +4 -3
  67. package/dist/index.d.ts +4 -3
  68. package/dist/index.js +7 -5
  69. package/dist/llms.cjs +2 -2
  70. package/dist/llms.d.cts +1 -1
  71. package/dist/llms.js +2 -2
  72. package/dist/types.d.cts +2 -2
  73. package/dist/types.d.ts +2 -2
  74. package/dist/utils/errors.cjs +1 -1
  75. package/dist/utils/errors.cjs.map +1 -1
  76. package/dist/utils/errors.js +1 -1
  77. package/dist/utils/errors.js.map +1 -1
  78. package/dist/utils/misc.js +2 -2
  79. package/dist/utils/misc.js.map +1 -1
  80. package/dist/utils/output.cjs +0 -12
  81. package/dist/utils/output.cjs.map +1 -1
  82. package/dist/utils/output.js +1 -12
  83. package/dist/utils/output.js.map +1 -1
  84. package/dist/utils/prompts.cjs +2 -2
  85. package/dist/utils/prompts.cjs.map +1 -1
  86. package/dist/utils/prompts.d.cts +1 -0
  87. package/dist/utils/prompts.d.cts.map +1 -1
  88. package/dist/utils/prompts.d.ts +1 -0
  89. package/dist/utils/prompts.d.ts.map +1 -1
  90. package/dist/utils/prompts.js +2 -2
  91. package/dist/utils/prompts.js.map +1 -1
  92. package/dist/utils/tools.cjs +1 -1
  93. package/dist/utils/tools.js +1 -1
  94. package/package.json +9 -6
  95. package/dist/utils/message_inputs.cjs +0 -139
  96. package/dist/utils/message_inputs.cjs.map +0 -1
  97. package/dist/utils/message_inputs.d.cts +0 -9
  98. package/dist/utils/message_inputs.d.cts.map +0 -1
  99. package/dist/utils/message_inputs.d.ts +0 -9
  100. package/dist/utils/message_inputs.d.ts.map +0 -1
  101. package/dist/utils/message_inputs.js +0 -137
  102. package/dist/utils/message_inputs.js.map +0 -1
  103. package/dist/utils/standard.cjs +0 -315
  104. package/dist/utils/standard.cjs.map +0 -1
  105. package/dist/utils/standard.js +0 -313
  106. package/dist/utils/standard.js.map +0 -1
@@ -1,18 +1,11 @@
1
1
  const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- const require_misc = require('../utils/misc.cjs');
2
+ const require_client = require('../utils/client.cjs');
3
3
  const require_tools = require('../utils/tools.cjs');
4
- const require_output = require('../utils/output.cjs');
5
4
  const require_base = require('./base.cjs');
6
- const require_client = require('../utils/client.cjs');
7
- const require_standard = require('../utils/standard.cjs');
8
- const require_message_inputs = require('../utils/message_inputs.cjs');
5
+ const require_responses = require('../converters/responses.cjs');
9
6
  const __langchain_core_language_models_base = require_rolldown_runtime.__toESM(require("@langchain/core/language_models/base"));
10
- const __langchain_core_output_parsers_openai_tools = require_rolldown_runtime.__toESM(require("@langchain/core/output_parsers/openai_tools"));
11
- const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
12
- const __langchain_core_outputs = require_rolldown_runtime.__toESM(require("@langchain/core/outputs"));
13
7
 
14
8
  //#region src/chat_models/responses.ts
15
- const _FUNCTION_CALL_IDS_MAP_KEY = "__openai_function_call_ids__";
16
9
  /**
17
10
  * OpenAI Responses API implementation.
18
11
  *
@@ -105,9 +98,12 @@ var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
105
98
  llmOutput: { estimatedTokenUsage: (finalChunk?.message)?.usage_metadata }
106
99
  };
107
100
  } else {
108
- const input = this._convertMessagesToResponsesParams(messages);
109
101
  const data = await this.completionWithRetry({
110
- input,
102
+ input: require_responses.convertMessagesToResponsesInput({
103
+ messages,
104
+ zdrEnabled: this.zdrEnabled ?? false,
105
+ model: this.model
106
+ }),
111
107
  ...invocationParams,
112
108
  stream: false
113
109
  }, {
@@ -117,7 +113,7 @@ var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
117
113
  return {
118
114
  generations: [{
119
115
  text: data.output_text,
120
- message: this._convertResponsesMessageToBaseMessage(data)
116
+ message: require_responses.convertResponsesMessageToAIMessage(data)
121
117
  }],
122
118
  llmOutput: {
123
119
  id: data.id,
@@ -133,11 +129,15 @@ var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
133
129
  async *_streamResponseChunks(messages, options, runManager) {
134
130
  const streamIterable = await this.completionWithRetry({
135
131
  ...this.invocationParams(options),
136
- input: this._convertMessagesToResponsesParams(messages),
132
+ input: require_responses.convertMessagesToResponsesInput({
133
+ messages,
134
+ zdrEnabled: this.zdrEnabled ?? false,
135
+ model: this.model
136
+ }),
137
137
  stream: true
138
138
  }, options);
139
139
  for await (const data of streamIterable) {
140
- const chunk = this._convertResponsesDeltaToBaseMessageChunk(data);
140
+ const chunk = require_responses.convertResponsesDeltaToChatGenerationChunk(data);
141
141
  if (chunk == null) continue;
142
142
  yield chunk;
143
143
  await runManager?.handleLLMNewToken(chunk.text || "", {
@@ -159,367 +159,6 @@ var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
159
159
  });
160
160
  }
161
161
  /** @internal */
162
- _convertResponsesMessageToBaseMessage(response) {
163
- if (response.error) {
164
- const error = new Error(response.error.message);
165
- error.name = response.error.code;
166
- throw error;
167
- }
168
- let messageId;
169
- const content = [];
170
- const tool_calls = [];
171
- const invalid_tool_calls = [];
172
- const response_metadata = {
173
- model_provider: "openai",
174
- model: response.model,
175
- created_at: response.created_at,
176
- id: response.id,
177
- incomplete_details: response.incomplete_details,
178
- metadata: response.metadata,
179
- object: response.object,
180
- status: response.status,
181
- user: response.user,
182
- service_tier: response.service_tier,
183
- model_name: response.model
184
- };
185
- const additional_kwargs = {};
186
- for (const item of response.output) if (item.type === "message") {
187
- messageId = item.id;
188
- content.push(...item.content.flatMap((part) => {
189
- if (part.type === "output_text") {
190
- if ("parsed" in part && part.parsed != null) additional_kwargs.parsed = part.parsed;
191
- return {
192
- type: "text",
193
- text: part.text,
194
- annotations: part.annotations
195
- };
196
- }
197
- if (part.type === "refusal") {
198
- additional_kwargs.refusal = part.refusal;
199
- return [];
200
- }
201
- return part;
202
- }));
203
- } else if (item.type === "function_call") {
204
- const fnAdapter = {
205
- function: {
206
- name: item.name,
207
- arguments: item.arguments
208
- },
209
- id: item.call_id
210
- };
211
- try {
212
- tool_calls.push((0, __langchain_core_output_parsers_openai_tools.parseToolCall)(fnAdapter, { returnId: true }));
213
- } catch (e) {
214
- let errMessage;
215
- if (typeof e === "object" && e != null && "message" in e && typeof e.message === "string") errMessage = e.message;
216
- invalid_tool_calls.push((0, __langchain_core_output_parsers_openai_tools.makeInvalidToolCall)(fnAdapter, errMessage));
217
- }
218
- additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};
219
- if (item.id) additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;
220
- } else if (item.type === "reasoning") additional_kwargs.reasoning = item;
221
- else if (item.type === "custom_tool_call") {
222
- const parsed = require_tools.parseCustomToolCall(item);
223
- if (parsed) tool_calls.push(parsed);
224
- else invalid_tool_calls.push((0, __langchain_core_output_parsers_openai_tools.makeInvalidToolCall)(item, "Malformed custom tool call"));
225
- } else {
226
- additional_kwargs.tool_outputs ??= [];
227
- additional_kwargs.tool_outputs.push(item);
228
- }
229
- return new __langchain_core_messages.AIMessage({
230
- id: messageId,
231
- content,
232
- tool_calls,
233
- invalid_tool_calls,
234
- usage_metadata: require_output._convertOpenAIResponsesUsageToLangChainUsage(response.usage),
235
- additional_kwargs,
236
- response_metadata
237
- });
238
- }
239
- /** @internal */
240
- _convertResponsesDeltaToBaseMessageChunk(chunk) {
241
- const content = [];
242
- let generationInfo = {};
243
- let usage_metadata;
244
- const tool_call_chunks = [];
245
- const response_metadata = { model_provider: "openai" };
246
- const additional_kwargs = {};
247
- let id;
248
- if (chunk.type === "response.output_text.delta") content.push({
249
- type: "text",
250
- text: chunk.delta,
251
- index: chunk.content_index
252
- });
253
- else if (chunk.type === "response.output_text.annotation.added") content.push({
254
- type: "text",
255
- text: "",
256
- annotations: [chunk.annotation],
257
- index: chunk.content_index
258
- });
259
- else if (chunk.type === "response.output_item.added" && chunk.item.type === "message") id = chunk.item.id;
260
- else if (chunk.type === "response.output_item.added" && chunk.item.type === "function_call") {
261
- tool_call_chunks.push({
262
- type: "tool_call_chunk",
263
- name: chunk.item.name,
264
- args: chunk.item.arguments,
265
- id: chunk.item.call_id,
266
- index: chunk.output_index
267
- });
268
- additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = { [chunk.item.call_id]: chunk.item.id };
269
- } else if (chunk.type === "response.output_item.done" && [
270
- "web_search_call",
271
- "file_search_call",
272
- "computer_call",
273
- "code_interpreter_call",
274
- "mcp_call",
275
- "mcp_list_tools",
276
- "mcp_approval_request",
277
- "image_generation_call",
278
- "custom_tool_call"
279
- ].includes(chunk.item.type)) additional_kwargs.tool_outputs = [chunk.item];
280
- else if (chunk.type === "response.created") {
281
- response_metadata.id = chunk.response.id;
282
- response_metadata.model_name = chunk.response.model;
283
- response_metadata.model = chunk.response.model;
284
- } else if (chunk.type === "response.completed") {
285
- const msg = this._convertResponsesMessageToBaseMessage(chunk.response);
286
- usage_metadata = require_output._convertOpenAIResponsesUsageToLangChainUsage(chunk.response.usage);
287
- if (chunk.response.text?.format?.type === "json_schema") additional_kwargs.parsed ??= JSON.parse(msg.text);
288
- for (const [key, value] of Object.entries(chunk.response)) if (key !== "id") response_metadata[key] = value;
289
- } else if (chunk.type === "response.function_call_arguments.delta" || chunk.type === "response.custom_tool_call_input.delta") tool_call_chunks.push({
290
- type: "tool_call_chunk",
291
- args: chunk.delta,
292
- index: chunk.output_index
293
- });
294
- else if (chunk.type === "response.web_search_call.completed" || chunk.type === "response.file_search_call.completed") generationInfo = { tool_outputs: {
295
- id: chunk.item_id,
296
- type: chunk.type.replace("response.", "").replace(".completed", ""),
297
- status: "completed"
298
- } };
299
- else if (chunk.type === "response.refusal.done") additional_kwargs.refusal = chunk.refusal;
300
- else if (chunk.type === "response.output_item.added" && "item" in chunk && chunk.item.type === "reasoning") {
301
- const summary = chunk.item.summary ? chunk.item.summary.map((s, index) => ({
302
- ...s,
303
- index
304
- })) : void 0;
305
- additional_kwargs.reasoning = {
306
- id: chunk.item.id,
307
- type: chunk.item.type,
308
- ...summary ? { summary } : {}
309
- };
310
- } else if (chunk.type === "response.reasoning_summary_part.added") additional_kwargs.reasoning = {
311
- type: "reasoning",
312
- summary: [{
313
- ...chunk.part,
314
- index: chunk.summary_index
315
- }]
316
- };
317
- else if (chunk.type === "response.reasoning_summary_text.delta") additional_kwargs.reasoning = {
318
- type: "reasoning",
319
- summary: [{
320
- text: chunk.delta,
321
- type: "summary_text",
322
- index: chunk.summary_index
323
- }]
324
- };
325
- else if (chunk.type === "response.image_generation_call.partial_image") return null;
326
- else return null;
327
- return new __langchain_core_outputs.ChatGenerationChunk({
328
- text: content.map((part) => part.text).join(""),
329
- message: new __langchain_core_messages.AIMessageChunk({
330
- id,
331
- content,
332
- tool_call_chunks,
333
- usage_metadata,
334
- additional_kwargs,
335
- response_metadata
336
- }),
337
- generationInfo
338
- });
339
- }
340
- /** @internal */
341
- _convertMessagesToResponsesParams(messages) {
342
- return messages.flatMap((lcMsg) => {
343
- const responseMetadata = lcMsg.response_metadata;
344
- if (responseMetadata?.output_version === "v1") return require_standard._convertToResponsesMessageFromV1(lcMsg);
345
- const additional_kwargs = lcMsg.additional_kwargs;
346
- let role = require_misc.messageToOpenAIRole(lcMsg);
347
- if (role === "system" && require_misc.isReasoningModel(this.model)) role = "developer";
348
- if (role === "function") throw new Error("Function messages are not supported in Responses API");
349
- if (role === "tool") {
350
- const toolMessage = lcMsg;
351
- if (additional_kwargs?.type === "computer_call_output") {
352
- const output = (() => {
353
- if (typeof toolMessage.content === "string") return {
354
- type: "computer_screenshot",
355
- image_url: toolMessage.content
356
- };
357
- if (Array.isArray(toolMessage.content)) {
358
- const oaiScreenshot = toolMessage.content.find((i) => i.type === "computer_screenshot");
359
- if (oaiScreenshot) return oaiScreenshot;
360
- const lcImage = toolMessage.content.find((i) => i.type === "image_url");
361
- if (lcImage) return {
362
- type: "computer_screenshot",
363
- image_url: typeof lcImage.image_url === "string" ? lcImage.image_url : lcImage.image_url.url
364
- };
365
- }
366
- throw new Error("Invalid computer call output");
367
- })();
368
- return {
369
- type: "computer_call_output",
370
- output,
371
- call_id: toolMessage.tool_call_id
372
- };
373
- }
374
- if (toolMessage.additional_kwargs?.customTool) return {
375
- type: "custom_tool_call_output",
376
- call_id: toolMessage.tool_call_id,
377
- output: toolMessage.content
378
- };
379
- return {
380
- type: "function_call_output",
381
- call_id: toolMessage.tool_call_id,
382
- id: toolMessage.id?.startsWith("fc_") ? toolMessage.id : void 0,
383
- output: typeof toolMessage.content !== "string" ? JSON.stringify(toolMessage.content) : toolMessage.content
384
- };
385
- }
386
- if (role === "assistant") {
387
- if (!this.zdrEnabled && responseMetadata?.output != null && Array.isArray(responseMetadata?.output) && responseMetadata?.output.length > 0 && responseMetadata?.output.every((item) => "type" in item)) return responseMetadata?.output;
388
- const input = [];
389
- if (additional_kwargs?.reasoning && !this.zdrEnabled) {
390
- const reasoningItem = this._convertReasoningSummary(additional_kwargs.reasoning);
391
- input.push(reasoningItem);
392
- }
393
- let { content } = lcMsg;
394
- if (additional_kwargs?.refusal) {
395
- if (typeof content === "string") content = [{
396
- type: "output_text",
397
- text: content,
398
- annotations: []
399
- }];
400
- content = [...content, {
401
- type: "refusal",
402
- refusal: additional_kwargs.refusal
403
- }];
404
- }
405
- if (typeof content === "string" || content.length > 0) input.push({
406
- type: "message",
407
- role: "assistant",
408
- ...lcMsg.id && !this.zdrEnabled && lcMsg.id.startsWith("msg_") ? { id: lcMsg.id } : {},
409
- content: require_misc.iife(() => {
410
- if (typeof content === "string") return content;
411
- return content.flatMap((item) => {
412
- if (item.type === "text") return {
413
- type: "output_text",
414
- text: item.text,
415
- annotations: item.annotations ?? []
416
- };
417
- if (item.type === "output_text" || item.type === "refusal") return item;
418
- return [];
419
- });
420
- })
421
- });
422
- const functionCallIds = additional_kwargs?.[_FUNCTION_CALL_IDS_MAP_KEY];
423
- if ((0, __langchain_core_messages.isAIMessage)(lcMsg) && !!lcMsg.tool_calls?.length) input.push(...lcMsg.tool_calls.map((toolCall) => {
424
- if (require_tools.isCustomToolCall(toolCall)) return {
425
- type: "custom_tool_call",
426
- id: toolCall.call_id,
427
- call_id: toolCall.id ?? "",
428
- input: toolCall.args.input,
429
- name: toolCall.name
430
- };
431
- return {
432
- type: "function_call",
433
- name: toolCall.name,
434
- arguments: JSON.stringify(toolCall.args),
435
- call_id: toolCall.id,
436
- ...this.zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}
437
- };
438
- }));
439
- else if (additional_kwargs?.tool_calls) input.push(...additional_kwargs.tool_calls.map((toolCall) => ({
440
- type: "function_call",
441
- name: toolCall.function.name,
442
- call_id: toolCall.id,
443
- arguments: toolCall.function.arguments,
444
- ...this.zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}
445
- })));
446
- const toolOutputs = (responseMetadata?.output)?.length ? responseMetadata?.output : additional_kwargs.tool_outputs;
447
- const fallthroughCallTypes = [
448
- "computer_call",
449
- "mcp_call",
450
- "code_interpreter_call",
451
- "image_generation_call"
452
- ];
453
- if (toolOutputs != null) {
454
- const castToolOutputs = toolOutputs;
455
- const fallthroughCalls = castToolOutputs?.filter((item) => fallthroughCallTypes.includes(item.type));
456
- if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);
457
- }
458
- return input;
459
- }
460
- if (role === "user" || role === "system" || role === "developer") {
461
- if (typeof lcMsg.content === "string") return {
462
- type: "message",
463
- role,
464
- content: lcMsg.content
465
- };
466
- const messages$1 = [];
467
- const content = lcMsg.content.flatMap((item) => {
468
- if (item.type === "mcp_approval_response") messages$1.push({
469
- type: "mcp_approval_response",
470
- approval_request_id: item.approval_request_id,
471
- approve: item.approve
472
- });
473
- if ((0, __langchain_core_messages.isDataContentBlock)(item)) return (0, __langchain_core_messages.convertToProviderContentBlock)(item, require_message_inputs.completionsApiContentBlockConverter);
474
- if (item.type === "text") return {
475
- type: "input_text",
476
- text: item.text
477
- };
478
- if (item.type === "image_url") {
479
- const imageUrl = require_misc.iife(() => {
480
- if (typeof item.image_url === "string") return item.image_url;
481
- else if (typeof item.image_url === "object" && item.image_url !== null && "url" in item.image_url) return item.image_url.url;
482
- return void 0;
483
- });
484
- const detail = require_misc.iife(() => {
485
- if (typeof item.image_url === "string") return "auto";
486
- else if (typeof item.image_url === "object" && item.image_url !== null && "detail" in item.image_url) return item.image_url.detail;
487
- return void 0;
488
- });
489
- return {
490
- type: "input_image",
491
- image_url: imageUrl,
492
- detail
493
- };
494
- }
495
- if (item.type === "input_text" || item.type === "input_image" || item.type === "input_file") return item;
496
- return [];
497
- });
498
- if (content.length > 0) messages$1.push({
499
- type: "message",
500
- role,
501
- content
502
- });
503
- return messages$1;
504
- }
505
- console.warn(`Unsupported role found when converting to OpenAI Responses API: ${role}`);
506
- return [];
507
- });
508
- }
509
- /** @internal */
510
- _convertReasoningSummary(reasoning) {
511
- const summary = (reasoning.summary.length > 1 ? reasoning.summary.reduce((acc, curr) => {
512
- const last = acc[acc.length - 1];
513
- if (last.index === curr.index) last.text += curr.text;
514
- else acc.push(curr);
515
- return acc;
516
- }, [{ ...reasoning.summary[0] }]) : reasoning.summary).map((s) => Object.fromEntries(Object.entries(s).filter(([k]) => k !== "index")));
517
- return {
518
- ...reasoning,
519
- summary
520
- };
521
- }
522
- /** @internal */
523
162
  _reduceChatOpenAITools(tools, fields) {
524
163
  const reducedTools = [];
525
164
  for (const tool of tools) if (require_tools.isBuiltInTool(tool)) {
@@ -1 +1 @@
1
- {"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","options?: this[\"ParsedCallOptions\"]","strict: boolean | undefined","params: ChatResponsesInvocationParams","isBuiltInToolChoice","formatToOpenAIToolChoice","messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","finalChunk: ChatGenerationChunk | undefined","runManager?: CallbackManagerForLLMRun","request: OpenAIClient.Responses.ResponseCreateParams","requestOptions?: OpenAIClient.RequestOptions","wrapOpenAIClientError","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","parseCustomToolCall","AIMessage","_convertOpenAIResponsesUsageToLangChainUsage","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","ChatGenerationChunk","AIMessageChunk","_convertToResponsesMessageFromV1","messageToOpenAIRole","isReasoningModel","input: ResponsesInputItem[]","iife","isCustomToolCall","fallthroughCallTypes: ResponsesInputItem[\"type\"][]","messages: ResponsesInputItem[]","messages","completionsApiContentBlockConverter","reasoning: ChatOpenAIReasoningSummary","tools: ChatOpenAIToolType[]","fields: { stream?: boolean; strict?: boolean }","reducedTools: ResponsesTool[]","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 {\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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"}
1
+ {"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","options?: this[\"ParsedCallOptions\"]","strict: boolean | undefined","params: ChatResponsesInvocationParams","isBuiltInToolChoice","formatToOpenAIToolChoice","messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","finalChunk: ChatGenerationChunk | undefined","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","runManager?: CallbackManagerForLLMRun","convertResponsesDeltaToChatGenerationChunk","request: OpenAIClient.Responses.ResponseCreateParams","requestOptions?: OpenAIClient.RequestOptions","wrapOpenAIClientError","tools: ChatOpenAIToolType[]","fields: { stream?: boolean; strict?: boolean }","reducedTools: ResponsesTool[]","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 { 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 { BaseChatOpenAI, BaseChatOpenAICallOptions } from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\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\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 = 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 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 *_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 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 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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"}
@@ -1,10 +1,10 @@
1
- import { ChatOpenAIReasoningSummary, OpenAIVerbosityParam } from "../types.cjs";
1
+ import { OpenAIVerbosityParam } from "../types.cjs";
2
2
  import { ChatOpenAIToolType, ResponsesTool } from "../utils/tools.cjs";
3
3
  import { BaseChatOpenAI, BaseChatOpenAICallOptions } from "./base.cjs";
4
4
  import { OpenAI as OpenAI$1 } from "openai";
5
+ import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
5
6
  import { BaseMessage } from "@langchain/core/messages";
6
7
  import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
7
- import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
8
8
 
9
9
  //#region src/chat_models/responses.d.ts
10
10
  interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {
@@ -32,13 +32,6 @@ interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {
32
32
  verbosity?: OpenAIVerbosityParam;
33
33
  }
34
34
  type ChatResponsesInvocationParams = Omit<OpenAI$1.Responses.ResponseCreateParams, "input">;
35
- type ExcludeController<T> = T extends {
36
- controller: unknown;
37
- } ? never : T;
38
- type ResponsesCreate = OpenAI$1.Responses["create"];
39
- type ResponsesParse = OpenAI$1.Responses["parse"];
40
- type ResponsesCreateInvoke = ExcludeController<Awaited<ReturnType<ResponsesCreate>>>;
41
- type ResponsesParseInvoke = ExcludeController<Awaited<ReturnType<ResponsesParse>>>;
42
35
  /**
43
36
  * OpenAI Responses API implementation.
44
37
  *
@@ -59,14 +52,6 @@ declare class ChatOpenAIResponses<CallOptions extends ChatOpenAIResponsesCallOpt
59
52
  completionWithRetry(request: OpenAI$1.Responses.ResponseCreateParamsStreaming, requestOptions?: OpenAI$1.RequestOptions): Promise<AsyncIterable<OpenAI$1.Responses.ResponseStreamEvent>>;
60
53
  completionWithRetry(request: OpenAI$1.Responses.ResponseCreateParamsNonStreaming, requestOptions?: OpenAI$1.RequestOptions): Promise<OpenAI$1.Responses.Response>;
61
54
  /** @internal */
62
- protected _convertResponsesMessageToBaseMessage(response: ResponsesCreateInvoke | ResponsesParseInvoke): BaseMessage;
63
- /** @internal */
64
- protected _convertResponsesDeltaToBaseMessageChunk(chunk: OpenAI$1.Responses.ResponseStreamEvent): ChatGenerationChunk | null;
65
- /** @internal */
66
- protected _convertMessagesToResponsesParams(messages: BaseMessage[]): (OpenAI$1.Responses.ResponseInputItem.ComputerCallOutput | OpenAI$1.Responses.EasyInputMessage | OpenAI$1.Responses.ResponseInputItem.FunctionCallOutput | OpenAI$1.Responses.ResponseInputItem.ImageGenerationCall | OpenAI$1.Responses.ResponseInputItem.ItemReference | OpenAI$1.Responses.ResponseInputItem.LocalShellCall | OpenAI$1.Responses.ResponseInputItem.LocalShellCallOutput | OpenAI$1.Responses.ResponseInputItem.McpApprovalRequest | OpenAI$1.Responses.ResponseInputItem.McpApprovalResponse | OpenAI$1.Responses.ResponseInputItem.McpCall | OpenAI$1.Responses.ResponseInputItem.McpListTools | OpenAI$1.Responses.ResponseInputItem.Message | OpenAI$1.Responses.ResponseCodeInterpreterToolCall | OpenAI$1.Responses.ResponseComputerToolCall | OpenAI$1.Responses.ResponseCustomToolCall | OpenAI$1.Responses.ResponseCustomToolCallOutput | OpenAI$1.Responses.ResponseFileSearchToolCall | OpenAI$1.Responses.ResponseFunctionToolCall | OpenAI$1.Responses.ResponseFunctionWebSearch | OpenAI$1.Responses.ResponseOutputMessage | OpenAI$1.Responses.ResponseReasoningItem)[];
67
- /** @internal */
68
- protected _convertReasoningSummary(reasoning: ChatOpenAIReasoningSummary): OpenAI$1.Responses.ResponseReasoningItem;
69
- /** @internal */
70
55
  protected _reduceChatOpenAITools(tools: ChatOpenAIToolType[], fields: {
71
56
  stream?: boolean;
72
57
  strict?: boolean;