@langchain/openai 1.8.0 → 1.8.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 (235) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/azure/chat_models/common.cjs +1 -2
  3. package/dist/azure/chat_models/common.d.cts +1 -3
  4. package/dist/azure/chat_models/common.d.cts.map +1 -1
  5. package/dist/azure/chat_models/common.d.ts +1 -3
  6. package/dist/azure/chat_models/common.d.ts.map +1 -1
  7. package/dist/azure/chat_models/common.js +1 -2
  8. package/dist/azure/chat_models/completions.cjs +1 -2
  9. package/dist/azure/chat_models/completions.d.cts +1 -3
  10. package/dist/azure/chat_models/completions.d.cts.map +1 -1
  11. package/dist/azure/chat_models/completions.d.ts +1 -3
  12. package/dist/azure/chat_models/completions.d.ts.map +1 -1
  13. package/dist/azure/chat_models/completions.js +1 -2
  14. package/dist/azure/chat_models/index.cjs +2 -3
  15. package/dist/azure/chat_models/index.d.cts +1 -3
  16. package/dist/azure/chat_models/index.d.cts.map +1 -1
  17. package/dist/azure/chat_models/index.d.ts +1 -3
  18. package/dist/azure/chat_models/index.d.ts.map +1 -1
  19. package/dist/azure/chat_models/index.js +2 -3
  20. package/dist/azure/chat_models/responses.cjs +2 -3
  21. package/dist/azure/chat_models/responses.d.cts +1 -3
  22. package/dist/azure/chat_models/responses.d.cts.map +1 -1
  23. package/dist/azure/chat_models/responses.d.ts +1 -3
  24. package/dist/azure/chat_models/responses.d.ts.map +1 -1
  25. package/dist/azure/chat_models/responses.js +2 -3
  26. package/dist/azure/embeddings.cjs +3 -4
  27. package/dist/azure/embeddings.d.cts +1 -3
  28. package/dist/azure/embeddings.d.cts.map +1 -1
  29. package/dist/azure/embeddings.d.ts +1 -3
  30. package/dist/azure/embeddings.d.ts.map +1 -1
  31. package/dist/azure/embeddings.js +3 -4
  32. package/dist/azure/llms.cjs +2 -3
  33. package/dist/azure/llms.d.cts +1 -3
  34. package/dist/azure/llms.d.cts.map +1 -1
  35. package/dist/azure/llms.d.ts +1 -3
  36. package/dist/azure/llms.d.ts.map +1 -1
  37. package/dist/azure/llms.js +2 -3
  38. package/dist/chat_models/base.cjs +5 -6
  39. package/dist/chat_models/base.d.cts +1 -3
  40. package/dist/chat_models/base.d.cts.map +1 -1
  41. package/dist/chat_models/base.d.ts +1 -3
  42. package/dist/chat_models/base.d.ts.map +1 -1
  43. package/dist/chat_models/base.js +5 -6
  44. package/dist/chat_models/completions.cjs +1 -2
  45. package/dist/chat_models/completions.d.cts +1 -2
  46. package/dist/chat_models/completions.d.cts.map +1 -1
  47. package/dist/chat_models/completions.d.ts +1 -2
  48. package/dist/chat_models/completions.d.ts.map +1 -1
  49. package/dist/chat_models/completions.js +1 -2
  50. package/dist/chat_models/index.cjs +3 -4
  51. package/dist/chat_models/index.d.cts +2 -4
  52. package/dist/chat_models/index.d.cts.map +1 -1
  53. package/dist/chat_models/index.d.ts +2 -4
  54. package/dist/chat_models/index.d.ts.map +1 -1
  55. package/dist/chat_models/index.js +3 -4
  56. package/dist/chat_models/profiles.cjs +1 -2
  57. package/dist/chat_models/profiles.js +1 -2
  58. package/dist/chat_models/responses.cjs +3 -4
  59. package/dist/chat_models/responses.d.cts +1 -3
  60. package/dist/chat_models/responses.d.cts.map +1 -1
  61. package/dist/chat_models/responses.d.ts +1 -3
  62. package/dist/chat_models/responses.d.ts.map +1 -1
  63. package/dist/chat_models/responses.js +3 -4
  64. package/dist/converters/completions.cjs +2 -3
  65. package/dist/converters/completions.d.cts +0 -2
  66. package/dist/converters/completions.d.cts.map +1 -1
  67. package/dist/converters/completions.d.ts +0 -2
  68. package/dist/converters/completions.d.ts.map +1 -1
  69. package/dist/converters/completions.js +2 -3
  70. package/dist/converters/responses.cjs +2 -4
  71. package/dist/converters/responses.cjs.map +1 -1
  72. package/dist/converters/responses.d.cts +1 -2
  73. package/dist/converters/responses.d.cts.map +1 -1
  74. package/dist/converters/responses.d.ts +1 -2
  75. package/dist/converters/responses.d.ts.map +1 -1
  76. package/dist/converters/responses.js +2 -4
  77. package/dist/converters/responses.js.map +1 -1
  78. package/dist/decisions/index.cjs +2 -3
  79. package/dist/decisions/index.d.cts +0 -2
  80. package/dist/decisions/index.d.cts.map +1 -1
  81. package/dist/decisions/index.d.ts +0 -2
  82. package/dist/decisions/index.d.ts.map +1 -1
  83. package/dist/decisions/index.js +2 -3
  84. package/dist/decisions/input.cjs +1 -2
  85. package/dist/decisions/input.js +1 -2
  86. package/dist/decisions/types.cjs +1 -2
  87. package/dist/decisions/types.d.cts +0 -2
  88. package/dist/decisions/types.d.cts.map +1 -1
  89. package/dist/decisions/types.d.ts +0 -2
  90. package/dist/decisions/types.d.ts.map +1 -1
  91. package/dist/decisions/types.js +1 -2
  92. package/dist/embeddings.cjs +2 -3
  93. package/dist/embeddings.d.cts +0 -2
  94. package/dist/embeddings.d.cts.map +1 -1
  95. package/dist/embeddings.d.ts +0 -2
  96. package/dist/embeddings.d.ts.map +1 -1
  97. package/dist/embeddings.js +2 -3
  98. package/dist/index.cjs +38 -38
  99. package/dist/index.d.cts +7 -7
  100. package/dist/index.d.ts +7 -7
  101. package/dist/index.js +14 -14
  102. package/dist/llms.cjs +3 -4
  103. package/dist/llms.d.cts +0 -2
  104. package/dist/llms.d.cts.map +1 -1
  105. package/dist/llms.d.ts +0 -2
  106. package/dist/llms.d.ts.map +1 -1
  107. package/dist/llms.js +3 -4
  108. package/dist/tools/applyPatch.cjs +1 -2
  109. package/dist/tools/applyPatch.d.cts +0 -2
  110. package/dist/tools/applyPatch.d.cts.map +1 -1
  111. package/dist/tools/applyPatch.d.ts +0 -2
  112. package/dist/tools/applyPatch.d.ts.map +1 -1
  113. package/dist/tools/applyPatch.js +1 -2
  114. package/dist/tools/codeInterpreter.cjs +1 -2
  115. package/dist/tools/codeInterpreter.d.cts +0 -2
  116. package/dist/tools/codeInterpreter.d.cts.map +1 -1
  117. package/dist/tools/codeInterpreter.d.ts +0 -2
  118. package/dist/tools/codeInterpreter.d.ts.map +1 -1
  119. package/dist/tools/codeInterpreter.js +1 -2
  120. package/dist/tools/computerUse.cjs +1 -2
  121. package/dist/tools/computerUse.d.cts +0 -2
  122. package/dist/tools/computerUse.d.cts.map +1 -1
  123. package/dist/tools/computerUse.d.ts +0 -2
  124. package/dist/tools/computerUse.d.ts.map +1 -1
  125. package/dist/tools/computerUse.js +1 -2
  126. package/dist/tools/custom.cjs +1 -2
  127. package/dist/tools/custom.d.cts +0 -2
  128. package/dist/tools/custom.d.cts.map +1 -1
  129. package/dist/tools/custom.d.ts +0 -2
  130. package/dist/tools/custom.d.ts.map +1 -1
  131. package/dist/tools/custom.js +1 -2
  132. package/dist/tools/dalle.cjs +1 -2
  133. package/dist/tools/dalle.d.cts +0 -2
  134. package/dist/tools/dalle.d.cts.map +1 -1
  135. package/dist/tools/dalle.d.ts +0 -2
  136. package/dist/tools/dalle.d.ts.map +1 -1
  137. package/dist/tools/dalle.js +1 -2
  138. package/dist/tools/fileSearch.cjs +1 -2
  139. package/dist/tools/fileSearch.d.cts +0 -2
  140. package/dist/tools/fileSearch.d.cts.map +1 -1
  141. package/dist/tools/fileSearch.d.ts +0 -2
  142. package/dist/tools/fileSearch.d.ts.map +1 -1
  143. package/dist/tools/fileSearch.js +1 -2
  144. package/dist/tools/imageGeneration.cjs +1 -2
  145. package/dist/tools/imageGeneration.d.cts +0 -2
  146. package/dist/tools/imageGeneration.d.cts.map +1 -1
  147. package/dist/tools/imageGeneration.d.ts +0 -2
  148. package/dist/tools/imageGeneration.d.ts.map +1 -1
  149. package/dist/tools/imageGeneration.js +1 -2
  150. package/dist/tools/index.cjs +1 -2
  151. package/dist/tools/index.d.cts +0 -2
  152. package/dist/tools/index.d.cts.map +1 -1
  153. package/dist/tools/index.d.ts +0 -2
  154. package/dist/tools/index.d.ts.map +1 -1
  155. package/dist/tools/index.js +1 -2
  156. package/dist/tools/localShell.cjs +1 -2
  157. package/dist/tools/localShell.d.cts +0 -2
  158. package/dist/tools/localShell.d.cts.map +1 -1
  159. package/dist/tools/localShell.d.ts +0 -2
  160. package/dist/tools/localShell.d.ts.map +1 -1
  161. package/dist/tools/localShell.js +1 -2
  162. package/dist/tools/mcp.cjs +1 -2
  163. package/dist/tools/mcp.d.cts +1 -2
  164. package/dist/tools/mcp.d.cts.map +1 -1
  165. package/dist/tools/mcp.d.ts +1 -2
  166. package/dist/tools/mcp.d.ts.map +1 -1
  167. package/dist/tools/mcp.js +1 -2
  168. package/dist/tools/shell.cjs +1 -2
  169. package/dist/tools/shell.d.cts +0 -2
  170. package/dist/tools/shell.d.cts.map +1 -1
  171. package/dist/tools/shell.d.ts +0 -2
  172. package/dist/tools/shell.d.ts.map +1 -1
  173. package/dist/tools/shell.js +1 -2
  174. package/dist/tools/toolSearch.cjs +1 -2
  175. package/dist/tools/toolSearch.d.cts +0 -2
  176. package/dist/tools/toolSearch.d.cts.map +1 -1
  177. package/dist/tools/toolSearch.d.ts +0 -2
  178. package/dist/tools/toolSearch.d.ts.map +1 -1
  179. package/dist/tools/toolSearch.js +1 -2
  180. package/dist/tools/webSearch.cjs +1 -2
  181. package/dist/tools/webSearch.d.cts +0 -2
  182. package/dist/tools/webSearch.d.cts.map +1 -1
  183. package/dist/tools/webSearch.d.ts +0 -2
  184. package/dist/tools/webSearch.d.ts.map +1 -1
  185. package/dist/tools/webSearch.js +1 -2
  186. package/dist/types.d.cts +0 -2
  187. package/dist/types.d.cts.map +1 -1
  188. package/dist/types.d.ts +0 -2
  189. package/dist/types.d.ts.map +1 -1
  190. package/dist/utils/azure.cjs +1 -2
  191. package/dist/utils/azure.d.cts +1 -2
  192. package/dist/utils/azure.d.cts.map +1 -1
  193. package/dist/utils/azure.d.ts +1 -2
  194. package/dist/utils/azure.d.ts.map +1 -1
  195. package/dist/utils/azure.js +1 -2
  196. package/dist/utils/client.cjs +1 -2
  197. package/dist/utils/client.d.cts +0 -2
  198. package/dist/utils/client.d.cts.map +1 -1
  199. package/dist/utils/client.d.ts +0 -2
  200. package/dist/utils/client.d.ts.map +1 -1
  201. package/dist/utils/client.js +1 -2
  202. package/dist/utils/errors.cjs +1 -2
  203. package/dist/utils/errors.js +1 -2
  204. package/dist/utils/misc.cjs +1 -2
  205. package/dist/utils/misc.d.cts +0 -2
  206. package/dist/utils/misc.d.cts.map +1 -1
  207. package/dist/utils/misc.d.ts +0 -2
  208. package/dist/utils/misc.d.ts.map +1 -1
  209. package/dist/utils/misc.js +1 -2
  210. package/dist/utils/output.cjs +1 -2
  211. package/dist/utils/output.js +1 -2
  212. package/dist/utils/profile.cjs +1 -2
  213. package/dist/utils/profile.js +1 -2
  214. package/dist/utils/prompts.cjs +1 -2
  215. package/dist/utils/prompts.d.cts +0 -2
  216. package/dist/utils/prompts.d.cts.map +1 -1
  217. package/dist/utils/prompts.d.ts +0 -2
  218. package/dist/utils/prompts.d.ts.map +1 -1
  219. package/dist/utils/prompts.js +1 -2
  220. package/dist/utils/responses_stream_events.cjs +2 -2
  221. package/dist/utils/responses_stream_events.cjs.map +1 -1
  222. package/dist/utils/responses_stream_events.d.cts +1 -2
  223. package/dist/utils/responses_stream_events.d.cts.map +1 -1
  224. package/dist/utils/responses_stream_events.d.ts +1 -2
  225. package/dist/utils/responses_stream_events.d.ts.map +1 -1
  226. package/dist/utils/responses_stream_events.js +2 -2
  227. package/dist/utils/responses_stream_events.js.map +1 -1
  228. package/dist/utils/stream_events.js +1 -2
  229. package/dist/utils/tools.cjs +1 -2
  230. package/dist/utils/tools.d.cts +0 -2
  231. package/dist/utils/tools.d.cts.map +1 -1
  232. package/dist/utils/tools.d.ts +0 -2
  233. package/dist/utils/tools.d.ts.map +1 -1
  234. package/dist/utils/tools.js +1 -2
  235. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"responses_stream_events.cjs","names":["finalizeContentBlock","convertResponsesUsageToUsageMetadata"],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n // The initial args go out once, as the call's first slice.\n if (initialArgs) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: initialArgs },\n };\n }\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (event.delta) {\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: event.delta },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"responses_stream_events.cjs","names":["finalizeContentBlock","convertResponsesUsageToUsageMetadata"],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n // The initial args go out once, as the call's first slice.\n if (initialArgs) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: initialArgs },\n };\n }\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (event.delta) {\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: event.delta },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n model_name: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
1
  import { OpenAI } from "openai";
2
2
  import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
3
- //#region src/utils/responses_stream_events.d.ts
4
3
  export interface ConvertOpenAIResponsesStreamOptions {
5
4
  streamUsage?: boolean;
6
5
  provider?: string;
7
6
  }
8
7
  type RawEvent = OpenAI.Responses.ResponseStreamEvent;
9
8
  export declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
10
- //#endregion
9
+ export {};
11
10
  //# sourceMappingURL=responses_stream_events.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"responses_stream_events.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;iBAeiB;EACf;EACA;;KAGG,WAAWA,OAAa,UAAU;wBAMhB,6BACrB,QAAQ,cAAc,WACtB,UAAS,sCACR,eAAe"}
1
+ {"version":3,"file":"responses_stream_events.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;iBAeiB;EACf;EACA;;KAGG,WAAWA,OAAa,UAAU;wBAMhB,6BACrB,QAAQ,cAAc,WACtB,UAAS,sCACR,eAAe"}
@@ -1,11 +1,10 @@
1
1
  import { OpenAI } from "openai";
2
2
  import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
3
- //#region src/utils/responses_stream_events.d.ts
4
3
  export interface ConvertOpenAIResponsesStreamOptions {
5
4
  streamUsage?: boolean;
6
5
  provider?: string;
7
6
  }
8
7
  type RawEvent = OpenAI.Responses.ResponseStreamEvent;
9
8
  export declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
10
- //#endregion
9
+ export {};
11
10
  //# sourceMappingURL=responses_stream_events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"responses_stream_events.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;iBAeiB;EACf;EACA;;KAGG,WAAWA,OAAa,UAAU;wBAMhB,6BACrB,QAAQ,cAAc,WACtB,UAAS,sCACR,eAAe"}
1
+ {"version":3,"file":"responses_stream_events.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;iBAeiB;EACf;EACA;;KAGG,WAAWA,OAAa,UAAU;wBAMhB,6BACrB,QAAQ,cAAc,WACtB,UAAS,sCACR,eAAe"}
@@ -1,6 +1,6 @@
1
1
  import { convertResponsesUsageToUsageMetadata } from "../converters/responses.js";
2
2
  import { finalizeContentBlock } from "@langchain/core/language_models/compat";
3
- //#region src/utils/responses_stream_events.ts
3
+ // src/utils/responses_stream_events.ts
4
4
  async function* convertOpenAIResponsesStream(source, options = {}) {
5
5
  const shouldStreamUsage = options.streamUsage ?? true;
6
6
  const provider = options.provider ?? "openai";
@@ -220,6 +220,7 @@ async function* convertOpenAIResponsesStream(source, options = {}) {
220
220
  model_provider: provider,
221
221
  id: event.response.id,
222
222
  model: event.response.model,
223
+ model_name: event.response.model,
223
224
  status: event.response.status
224
225
  };
225
226
  if (shouldStreamUsage && event.response.usage) {
@@ -255,7 +256,6 @@ function mapResponseStatusToFinishReason(status, eventType) {
255
256
  if (status === "incomplete") return "length";
256
257
  return "stop";
257
258
  }
258
- //#endregion
259
259
  export { convertOpenAIResponsesStream };
260
260
 
261
261
  //# sourceMappingURL=responses_stream_events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"responses_stream_events.js","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n // The initial args go out once, as the call's first slice.\n if (initialArgs) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: initialArgs },\n };\n }\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (event.delta) {\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: event.delta },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"responses_stream_events.js","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n // The initial args go out once, as the call's first slice.\n if (initialArgs) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: initialArgs },\n };\n }\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (event.delta) {\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: event.delta },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n model_name: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
@@ -1,2 +1 @@
1
- import { convertOpenAICompletionsStream } from "@langchain/core/language_models/openai_completions_stream";
2
- export { convertOpenAICompletionsStream };
1
+ export { convertOpenAICompletionsStream } from "@langchain/core/language_models/openai_completions_stream";
@@ -1,7 +1,7 @@
1
1
  let _langchain_core_utils_function_calling = require("@langchain/core/utils/function_calling");
2
2
  require("@langchain/core/utils/types");
3
3
  require("@langchain/core/utils/json_schema");
4
- //#region src/utils/tools.ts
4
+ // src/utils/tools.ts
5
5
  /**
6
6
  * Formats a tool in either OpenAI format, or LangChain structured tool format
7
7
  * into an OpenAI tool format. If the tool is already in OpenAI format, return without
@@ -185,7 +185,6 @@ function convertResponsesCustomTool(tool) {
185
185
  }
186
186
  };
187
187
  }
188
- //#endregion
189
188
  exports._convertToOpenAITool = _convertToOpenAITool;
190
189
  exports.convertCompletionsCustomTool = convertCompletionsCustomTool;
191
190
  exports.convertResponsesCustomTool = convertResponsesCustomTool;
@@ -3,10 +3,8 @@ import "@langchain/core/language_models/base";
3
3
  import { BindToolsInput } from "@langchain/core/language_models/chat_models";
4
4
  import { DynamicTool } from "@langchain/core/tools";
5
5
  import "@langchain/core/messages/tool";
6
- //#region src/utils/tools.d.ts
7
6
  export type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string;
8
7
  export type ResponsesToolChoice = NonNullable<OpenAI.Responses.ResponseCreateParams["tool_choice"]>;
9
8
  export type ChatOpenAIToolType = BindToolsInput | OpenAI.Chat.ChatCompletionTool | ResponsesTool;
10
9
  export type ResponsesTool = NonNullable<OpenAI.Responses.ResponseCreateParams["tools"]>[number];
11
- //#endregion
12
10
  //# sourceMappingURL=tools.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;YAiMY,mBACRA,OAAa;YAIL,sBAAsB,YAChCA,OAAa,UAAU;YAGb,qBACR,iBACAA,OAAa,KAAK,qBAClB;YAEQ,gBAAgB,YAC1BA,OAAa,UAAU"}
1
+ {"version":3,"file":"tools.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;YAiMY,mBACRA,OAAa;YAIL,sBAAsB,YAChCA,OAAa,UAAU;YAGb,qBACR,iBACAA,OAAa,KAAK,qBAClB;YAEQ,gBAAgB,YAC1BA,OAAa,UAAU"}
@@ -3,10 +3,8 @@ import { BindToolsInput } from "@langchain/core/language_models/chat_models";
3
3
  import "@langchain/core/language_models/base";
4
4
  import { DynamicTool } from "@langchain/core/tools";
5
5
  import "@langchain/core/messages/tool";
6
- //#region src/utils/tools.d.ts
7
6
  export type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string;
8
7
  export type ResponsesToolChoice = NonNullable<OpenAI.Responses.ResponseCreateParams["tool_choice"]>;
9
8
  export type ChatOpenAIToolType = BindToolsInput | OpenAI.Chat.ChatCompletionTool | ResponsesTool;
10
9
  export type ResponsesTool = NonNullable<OpenAI.Responses.ResponseCreateParams["tools"]>[number];
11
- //#endregion
12
10
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;YAiMY,mBACRA,OAAa;YAIL,sBAAsB,YAChCA,OAAa,UAAU;YAGb,qBACR,iBACAA,OAAa,KAAK,qBAClB;YAEQ,gBAAgB,YAC1BA,OAAa,UAAU"}
1
+ {"version":3,"file":"tools.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;YAiMY,mBACRA,OAAa;YAIL,sBAAsB,YAChCA,OAAa,UAAU;YAGb,qBACR,iBACAA,OAAa,KAAK,qBAClB;YAEQ,gBAAgB,YAC1BA,OAAa,UAAU"}
@@ -1,7 +1,7 @@
1
1
  import { convertToOpenAITool, isLangChainTool } from "@langchain/core/utils/function_calling";
2
2
  import "@langchain/core/utils/types";
3
3
  import "@langchain/core/utils/json_schema";
4
- //#region src/utils/tools.ts
4
+ // src/utils/tools.ts
5
5
  /**
6
6
  * Formats a tool in either OpenAI format, or LangChain structured tool format
7
7
  * into an OpenAI tool format. If the tool is already in OpenAI format, return without
@@ -185,7 +185,6 @@ function convertResponsesCustomTool(tool) {
185
185
  }
186
186
  };
187
187
  }
188
- //#endregion
189
188
  export { _convertToOpenAITool, convertCompletionsCustomTool, convertResponsesCustomTool, formatFunctionDefinitions, formatToOpenAIToolChoice, hasProviderToolDefinition, isBuiltInTool, isBuiltInToolChoice, isComputerToolCall, isCustomTool, isCustomToolCall, isOpenAICustomTool, parseComputerCall, parseCustomToolCall };
190
189
 
191
190
  //# sourceMappingURL=tools.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/openai",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "OpenAI integrations for LangChain.js",
5
5
  "author": "LangChain",
6
6
  "license": "MIT",
@@ -15,25 +15,25 @@
15
15
  "homepage": "https://github.com/langchain-ai/langchainjs/tree/main/libs/providers/langchain-openai/",
16
16
  "dependencies": {
17
17
  "js-tiktoken": "^1.0.12",
18
- "openai": "^7.45.1",
18
+ "openai": "^7.47.0",
19
19
  "zod": "^3.25.76 || ^4"
20
20
  },
21
21
  "peerDependencies": {
22
- "@langchain/core": "^1.3.1"
22
+ "@langchain/core": "^1.3.5"
23
23
  },
24
24
  "devDependencies": {
25
- "@azure/identity": "^4.13.3",
26
- "@cfworker/json-schema": "^4.1.1",
25
+ "@azure/identity": "^4.14.1",
26
+ "@cfworker/json-schema": "^4.1.4",
27
27
  "@tsconfig/recommended": "^1.0.10",
28
- "@types/node": "^26.6.3",
29
- "@vitest/coverage-v8": "^5.0.2",
30
- "dotenv": "^17.4.2",
28
+ "@types/node": "^26.6.6",
29
+ "@vitest/coverage-v8": "^5.0.5",
30
+ "dotenv": "^18.0.9",
31
31
  "dpdm": "^4.3.0",
32
32
  "rimraf": "^6.1.3",
33
33
  "typescript": "~7.0.2",
34
- "vitest": "^5.0.2",
34
+ "vitest": "^5.0.5",
35
35
  "zod-to-json-schema": "^3.25.2",
36
- "@langchain/core": "^1.3.1",
36
+ "@langchain/core": "^1.3.5",
37
37
  "@langchain/standard-tests": "0.0.23",
38
38
  "@langchain/tsconfig": "0.0.1"
39
39
  },