@langchain/openai 1.5.12 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/chat_models/base.cjs +7 -1
  3. package/dist/chat_models/base.cjs.map +1 -1
  4. package/dist/chat_models/base.d.cts +9 -1
  5. package/dist/chat_models/base.d.cts.map +1 -1
  6. package/dist/chat_models/base.d.ts +9 -1
  7. package/dist/chat_models/base.d.ts.map +1 -1
  8. package/dist/chat_models/base.js +7 -1
  9. package/dist/chat_models/base.js.map +1 -1
  10. package/dist/chat_models/completions.cjs +10 -3
  11. package/dist/chat_models/completions.cjs.map +1 -1
  12. package/dist/chat_models/completions.d.cts.map +1 -1
  13. package/dist/chat_models/completions.d.ts.map +1 -1
  14. package/dist/chat_models/completions.js +11 -4
  15. package/dist/chat_models/completions.js.map +1 -1
  16. package/dist/chat_models/index.cjs +64 -0
  17. package/dist/chat_models/index.cjs.map +1 -1
  18. package/dist/chat_models/index.d.cts +64 -0
  19. package/dist/chat_models/index.d.cts.map +1 -1
  20. package/dist/chat_models/index.d.ts +64 -0
  21. package/dist/chat_models/index.d.ts.map +1 -1
  22. package/dist/chat_models/index.js +64 -0
  23. package/dist/chat_models/index.js.map +1 -1
  24. package/dist/chat_models/responses.cjs +5 -3
  25. package/dist/chat_models/responses.cjs.map +1 -1
  26. package/dist/chat_models/responses.d.cts.map +1 -1
  27. package/dist/chat_models/responses.d.ts.map +1 -1
  28. package/dist/chat_models/responses.js +5 -3
  29. package/dist/chat_models/responses.js.map +1 -1
  30. package/dist/converters/completions.cjs +9 -8
  31. package/dist/converters/completions.cjs.map +1 -1
  32. package/dist/converters/completions.d.cts.map +1 -1
  33. package/dist/converters/completions.d.ts.map +1 -1
  34. package/dist/converters/completions.js +10 -9
  35. package/dist/converters/completions.js.map +1 -1
  36. package/dist/converters/responses.cjs +87 -52
  37. package/dist/converters/responses.cjs.map +1 -1
  38. package/dist/converters/responses.d.cts.map +1 -1
  39. package/dist/converters/responses.d.ts.map +1 -1
  40. package/dist/converters/responses.js +88 -53
  41. package/dist/converters/responses.js.map +1 -1
  42. package/dist/index.d.cts +2 -2
  43. package/dist/index.d.ts +2 -2
  44. package/dist/llms.cjs +1 -1
  45. package/dist/llms.cjs.map +1 -1
  46. package/dist/llms.js +1 -1
  47. package/dist/llms.js.map +1 -1
  48. package/dist/types.d.cts +7 -2
  49. package/dist/types.d.cts.map +1 -1
  50. package/dist/types.d.ts +7 -2
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/utils/misc.cjs +30 -1
  53. package/dist/utils/misc.cjs.map +1 -1
  54. package/dist/utils/misc.d.cts +1 -0
  55. package/dist/utils/misc.d.cts.map +1 -1
  56. package/dist/utils/misc.d.ts +1 -0
  57. package/dist/utils/misc.d.ts.map +1 -1
  58. package/dist/utils/misc.js +27 -2
  59. package/dist/utils/misc.js.map +1 -1
  60. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/chat_models/index.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { type BaseLanguageModelInput } from \"@langchain/core/language_models/base\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { type OpenAICallOptions, type OpenAIChatInput } from \"../types.js\";\nimport {\n _convertToOpenAITool,\n isBuiltInTool,\n isCustomTool,\n isOpenAICustomTool,\n} from \"../utils/tools.js\";\nimport { _modelPrefersResponsesAPI } from \"../utils/misc.js\";\nimport { _convertOpenAIResponsesUsageToLangChainUsage } from \"../utils/output.js\";\nimport {\n ChatOpenAICompletions,\n ChatOpenAICompletionsCallOptions,\n} from \"./completions.js\";\nimport {\n ChatOpenAIResponses,\n ChatOpenAIResponsesCallOptions,\n} from \"./responses.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\nexport type ChatOpenAICallOptions = ChatOpenAICompletionsCallOptions &\n ChatOpenAIResponsesCallOptions;\n\nexport interface ChatOpenAIFields extends BaseChatOpenAIFields {\n /**\n * Whether to use the responses API for all requests. If `false` the responses API will be used\n * only when required in order to fulfill the request.\n */\n useResponsesApi?: boolean;\n /**\n * The completions chat instance\n * @internal\n */\n completions?: ChatOpenAICompletions;\n /**\n * The responses chat instance\n * @internal\n */\n responses?: ChatOpenAIResponses;\n}\n\n/**\n * OpenAI chat model integration.\n *\n * To use with Azure, import the `AzureChatOpenAI` class.\n *\n * Setup:\n * Install `@langchain/openai` and set an environment variable named `OPENAI_API_KEY`.\n *\n * ```bash\n * npm install @langchain/openai\n * export OPENAI_API_KEY=\"your-api-key\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain_openai.ChatOpenAI.html#constructor)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_openai.ChatOpenAICallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatOpenAI } from '@langchain/openai';\n *\n * const llm = new ChatOpenAI({\n * model: \"gpt-4o-mini\",\n * temperature: 0,\n * maxTokens: undefined,\n * timeout: undefined,\n * maxRetries: 2,\n * // apiKey: \"...\",\n * // configuration: {\n * // baseURL: \"...\",\n * // }\n * // organization: \"...\",\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessage {\n * \"id\": \"chatcmpl-9u4Mpu44CbPjwYFkTbeoZgvzB00Tz\",\n * \"content\": \"J'adore la programmation.\",\n * \"response_metadata\": {\n * \"tokenUsage\": {\n * \"completionTokens\": 5,\n * \"promptTokens\": 28,\n * \"totalTokens\": 33\n * },\n * \"finish_reason\": \"stop\",\n * \"system_fingerprint\": \"fp_3aa7262c27\"\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 28,\n * \"output_tokens\": 5,\n * \"total_tokens\": 33\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"chatcmpl-9u4NWB7yUeHCKdLr6jP3HpaOYHTqs\",\n * \"content\": \"\"\n * }\n * AIMessageChunk {\n * \"content\": \"J\"\n * }\n * AIMessageChunk {\n * \"content\": \"'adore\"\n * }\n * AIMessageChunk {\n * \"content\": \" la\"\n * }\n * AIMessageChunk {\n * \"content\": \" programmation\",,\n * }\n * AIMessageChunk {\n * \"content\": \".\",,\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"response_metadata\": {\n * \"finish_reason\": \"stop\",\n * \"system_fingerprint\": \"fp_c9aa9c0491\"\n * },\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"usage_metadata\": {\n * \"input_tokens\": 28,\n * \"output_tokens\": 5,\n * \"total_tokens\": 33\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"chatcmpl-9u4PnX6Fy7OmK46DASy0bH6cxn5Xu\",\n * \"content\": \"J'adore la programmation.\",\n * \"response_metadata\": {\n * \"prompt\": 0,\n * \"completion\": 0,\n * \"finish_reason\": \"stop\",\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 28,\n * \"output_tokens\": 5,\n * \"total_tokens\": 33\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools(\n * [GetWeather, GetPopulation],\n * {\n * // strict: true // enforce tool args schema is respected\n * }\n * );\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetWeather',\n * args: { location: 'Los Angeles, CA' },\n * type: 'tool_call',\n * id: 'call_uPU4FiFzoKAtMxfmPnfQL6UK'\n * },\n * {\n * name: 'GetWeather',\n * args: { location: 'New York, NY' },\n * type: 'tool_call',\n * id: 'call_UNkEwuQsHrGYqgDQuH9nPAtX'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'Los Angeles, CA' },\n * type: 'tool_call',\n * id: 'call_kL3OXxaq9OjIKqRTpvjaCH14'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York, NY' },\n * type: 'tool_call',\n * id: 'call_s9KQB1UWj45LLGaEnjz0179q'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().nullable().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, {\n * name: \"Joke\",\n * strict: true, // Optionally enable OpenAI structured outputs\n * });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: 'Why was the cat sitting on the computer?',\n * punchline: 'Because it wanted to keep an eye on the mouse!',\n * rating: 7\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>JSON Object Response Format</strong></summary>\n *\n * ```typescript\n * const jsonLlm = llm.withConfig({ response_format: { type: \"json_object\" } });\n * const jsonLlmAiMsg = await jsonLlm.invoke(\n * \"Return a JSON object with key 'randomInts' and a value of 10 random ints in [0-99]\"\n * );\n * console.log(jsonLlmAiMsg.content);\n * ```\n *\n * ```txt\n * {\n * \"randomInts\": [23, 87, 45, 12, 78, 34, 56, 90, 11, 67]\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Multimodal</strong></summary>\n *\n * ```typescript\n * import { HumanMessage } from '@langchain/core/messages';\n *\n * const imageUrl = \"https://example.com/image.jpg\";\n * const imageData = await fetch(imageUrl).then(res => res.arrayBuffer());\n * const base64Image = Buffer.from(imageData).toString('base64');\n *\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"describe the weather in this image\" },\n * {\n * type: \"image_url\",\n * image_url: { url: `data:image/jpeg;base64,${base64Image}` },\n * },\n * ]\n * });\n *\n * const imageDescriptionAiMsg = await llm.invoke([message]);\n * console.log(imageDescriptionAiMsg.content);\n * ```\n *\n * ```txt\n * The weather in the image appears to be clear and sunny. The sky is mostly blue with a few scattered white clouds, indicating fair weather. The bright sunlight is casting shadows on the green, grassy hill, suggesting it is a pleasant day with good visibility. There are no signs of rain or stormy conditions.\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 28, output_tokens: 5, total_tokens: 33 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Logprobs</strong></summary>\n *\n * ```typescript\n * const logprobsLlm = new ChatOpenAI({ model: \"gpt-4o-mini\", logprobs: true });\n * const aiMsgForLogprobs = await logprobsLlm.invoke(input);\n * console.log(aiMsgForLogprobs.response_metadata.logprobs);\n * ```\n *\n * ```txt\n * {\n * content: [\n * {\n * token: 'J',\n * logprob: -0.000050616763,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * {\n * token: \"'\",\n * logprob: -0.01868736,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * {\n * token: 'ad',\n * logprob: -0.0000030545007,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * { token: 'ore', logprob: 0, bytes: [Array], top_logprobs: [] },\n * {\n * token: ' la',\n * logprob: -0.515404,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * {\n * token: ' programm',\n * logprob: -0.0000118755715,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * { token: 'ation', logprob: 0, bytes: [Array], top_logprobs: [] },\n * {\n * token: '.',\n * logprob: -0.0000037697225,\n * bytes: [Array],\n * top_logprobs: []\n * }\n * ],\n * refusal: null\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Response Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForResponseMetadata = await llm.invoke(input);\n * console.log(aiMsgForResponseMetadata.response_metadata);\n * ```\n *\n * ```txt\n * {\n * tokenUsage: { completionTokens: 5, promptTokens: 28, totalTokens: 33 },\n * finish_reason: 'stop',\n * system_fingerprint: 'fp_3aa7262c27'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>JSON Schema Structured Output</strong></summary>\n *\n * ```typescript\n * const llmForJsonSchema = new ChatOpenAI({\n * model: \"gpt-4o-2024-08-06\",\n * }).withStructuredOutput(\n * z.object({\n * command: z.string().describe(\"The command to execute\"),\n * expectedOutput: z.string().describe(\"The expected output of the command\"),\n * options: z\n * .array(z.string())\n * .describe(\"The options you can pass to the command\"),\n * }),\n * {\n * method: \"jsonSchema\",\n * strict: true, // Optional when using the `jsonSchema` method\n * }\n * );\n *\n * const jsonSchemaRes = await llmForJsonSchema.invoke(\n * \"What is the command to list files in a directory?\"\n * );\n * console.log(jsonSchemaRes);\n * ```\n *\n * ```txt\n * {\n * command: 'ls',\n * expectedOutput: 'A list of files and subdirectories within the specified directory.',\n * options: [\n * '-a: include directory entries whose names begin with a dot (.).',\n * '-l: use a long listing format.',\n * '-h: with -l, print sizes in human readable format (e.g., 1K, 234M, 2G).',\n * '-t: sort by time, newest first.',\n * '-r: reverse order while sorting.',\n * '-S: sort by file size, largest first.',\n * '-R: list subdirectories recursively.'\n * ]\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Audio Outputs</strong></summary>\n *\n * ```typescript\n * import { ChatOpenAI } from \"@langchain/openai\";\n *\n * const modelWithAudioOutput = new ChatOpenAI({\n * model: \"gpt-4o-audio-preview\",\n * // You may also pass these fields to `.withConfig` as a call argument.\n * modalities: [\"text\", \"audio\"], // Specifies that the model should output audio.\n * audio: {\n * voice: \"alloy\",\n * format: \"wav\",\n * },\n * });\n *\n * const audioOutputResult = await modelWithAudioOutput.invoke(\"Tell me a joke about cats.\");\n * const castMessageContent = audioOutputResult.content[0] as Record<string, any>;\n *\n * console.log({\n * ...castMessageContent,\n * data: castMessageContent.data.slice(0, 100) // Sliced for brevity\n * })\n * ```\n *\n * ```txt\n * {\n * id: 'audio_67117718c6008190a3afad3e3054b9b6',\n * data: 'UklGRqYwBgBXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAATElTVBoAAABJTkZPSVNGVA4AAABMYXZmNTguMjkuMTAwAGRhdGFg',\n * expires_at: 1729201448,\n * transcript: 'Sure! Why did the cat sit on the computer? Because it wanted to keep an eye on the mouse!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Audio Outputs</strong></summary>\n *\n * ```typescript\n * import { ChatOpenAI } from \"@langchain/openai\";\n *\n * const modelWithAudioOutput = new ChatOpenAI({\n * model: \"gpt-4o-audio-preview\",\n * // You may also pass these fields to `.withConfig` as a call argument.\n * modalities: [\"text\", \"audio\"], // Specifies that the model should output audio.\n * audio: {\n * voice: \"alloy\",\n * format: \"wav\",\n * },\n * });\n *\n * const audioOutputResult = await modelWithAudioOutput.invoke(\"Tell me a joke about cats.\");\n * const castAudioContent = audioOutputResult.additional_kwargs.audio as Record<string, any>;\n *\n * console.log({\n * ...castAudioContent,\n * data: castAudioContent.data.slice(0, 100) // Sliced for brevity\n * })\n * ```\n *\n * ```txt\n * {\n * id: 'audio_67117718c6008190a3afad3e3054b9b6',\n * data: 'UklGRqYwBgBXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAATElTVBoAAABJTkZPSVNGVA4AAABMYXZmNTguMjkuMTAwAGRhdGFg',\n * expires_at: 1729201448,\n * transcript: 'Sure! Why did the cat sit on the computer? Because it wanted to keep an eye on the mouse!'\n * }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatOpenAI<\n CallOptions extends ChatOpenAICallOptions = ChatOpenAICallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n /**\n * Whether to use the responses API for all requests. If `false` the responses API will be used\n * only when required in order to fulfill the request.\n */\n useResponsesApi = false;\n\n protected responses: ChatOpenAIResponses;\n\n protected completions: ChatOpenAICompletions;\n\n get lc_serializable_keys(): string[] {\n return [...super.lc_serializable_keys, \"useResponsesApi\"];\n }\n\n get callKeys(): string[] {\n return [...super.callKeys, \"useResponsesApi\"];\n }\n\n protected fields?: ChatOpenAIFields;\n\n constructor(model: string, fields?: Omit<ChatOpenAIFields, \"model\">);\n constructor(fields?: ChatOpenAIFields);\n constructor(\n modelOrFields?: string | ChatOpenAIFields,\n fieldsArg?: Omit<ChatOpenAIFields, \"model\">\n ) {\n const fields = getChatOpenAIModelParams(modelOrFields, fieldsArg);\n super(fields);\n this.fields = fields;\n this.useResponsesApi = fields?.useResponsesApi ?? false;\n this.responses = fields?.responses ?? new ChatOpenAIResponses(fields);\n this.completions = fields?.completions ?? new ChatOpenAICompletions(fields);\n }\n\n protected _useResponsesApi(options: this[\"ParsedCallOptions\"] | undefined) {\n const usesBuiltInTools = options?.tools?.some(isBuiltInTool);\n const hasResponsesOnlyKwargs =\n options?.previous_response_id != null ||\n options?.text != null ||\n options?.truncation != null ||\n options?.include != null ||\n options?.reasoning?.summary != null ||\n this.reasoning?.summary != null;\n const hasCustomTools =\n options?.tools?.some(isOpenAICustomTool) ||\n options?.tools?.some(isCustomTool);\n\n return (\n this.useResponsesApi ||\n usesBuiltInTools ||\n hasResponsesOnlyKwargs ||\n hasCustomTools ||\n _modelPrefersResponsesAPI(this.model)\n );\n }\n\n override getLsParams(options: this[\"ParsedCallOptions\"]) {\n const optionsWithDefaults = this._combineCallOptions(options);\n if (this._useResponsesApi(options)) {\n return this.responses.getLsParams(optionsWithDefaults);\n }\n return this.completions.getLsParams(optionsWithDefaults);\n }\n\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n const optionsWithDefaults = this._combineCallOptions(options);\n if (this._useResponsesApi(options)) {\n return this.responses.invocationParams(optionsWithDefaults);\n }\n return this.completions.invocationParams(optionsWithDefaults);\n }\n\n /** @ignore */\n override async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this._useResponsesApi(options)) {\n return this.responses._generate(messages, options, runManager);\n }\n return this.completions._generate(messages, options, runManager);\n }\n\n override async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n if (this._useResponsesApi(options)) {\n yield* this.responses._streamChatModelEvents(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n return;\n }\n yield* this.completions._streamChatModelEvents(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n }\n\n override async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this._useResponsesApi(options)) {\n yield* this.responses._streamResponseChunks(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n return;\n }\n yield* this.completions._streamResponseChunks(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n }\n\n override withConfig(\n config: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n const newModel = new ChatOpenAI<CallOptions>(this.fields);\n newModel.defaultOptions = { ...this.defaultOptions, ...config };\n return newModel;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/chat_models/index.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { type BaseLanguageModelInput } from \"@langchain/core/language_models/base\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { type OpenAICallOptions, type OpenAIChatInput } from \"../types.js\";\nimport {\n _convertToOpenAITool,\n isBuiltInTool,\n isCustomTool,\n isOpenAICustomTool,\n} from \"../utils/tools.js\";\nimport { _modelPrefersResponsesAPI } from \"../utils/misc.js\";\nimport { _convertOpenAIResponsesUsageToLangChainUsage } from \"../utils/output.js\";\nimport {\n ChatOpenAICompletions,\n ChatOpenAICompletionsCallOptions,\n} from \"./completions.js\";\nimport {\n ChatOpenAIResponses,\n ChatOpenAIResponsesCallOptions,\n} from \"./responses.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\nexport type ChatOpenAICallOptions = ChatOpenAICompletionsCallOptions &\n ChatOpenAIResponsesCallOptions;\n\nexport interface ChatOpenAIFields extends BaseChatOpenAIFields {\n /**\n * Whether to use the responses API for all requests. If `false` the responses API will be used\n * only when required in order to fulfill the request.\n */\n useResponsesApi?: boolean;\n /**\n * The completions chat instance\n * @internal\n */\n completions?: ChatOpenAICompletions;\n /**\n * The responses chat instance\n * @internal\n */\n responses?: ChatOpenAIResponses;\n}\n\n/**\n * OpenAI chat model integration.\n *\n * To use with Azure, import the `AzureChatOpenAI` class.\n *\n * Setup:\n * Install `@langchain/openai` and set an environment variable named `OPENAI_API_KEY`.\n *\n * ```bash\n * npm install @langchain/openai\n * export OPENAI_API_KEY=\"your-api-key\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain_openai.ChatOpenAI.html#constructor)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_openai.ChatOpenAICallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatOpenAI } from '@langchain/openai';\n *\n * const llm = new ChatOpenAI({\n * model: \"gpt-4o-mini\",\n * temperature: 0,\n * maxTokens: undefined,\n * timeout: undefined,\n * maxRetries: 2,\n * // apiKey: \"...\",\n * // configuration: {\n * // baseURL: \"...\",\n * // }\n * // organization: \"...\",\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessage {\n * \"id\": \"chatcmpl-9u4Mpu44CbPjwYFkTbeoZgvzB00Tz\",\n * \"content\": \"J'adore la programmation.\",\n * \"response_metadata\": {\n * \"tokenUsage\": {\n * \"completionTokens\": 5,\n * \"promptTokens\": 28,\n * \"totalTokens\": 33\n * },\n * \"finish_reason\": \"stop\",\n * \"system_fingerprint\": \"fp_3aa7262c27\"\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 28,\n * \"output_tokens\": 5,\n * \"total_tokens\": 33\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"chatcmpl-9u4NWB7yUeHCKdLr6jP3HpaOYHTqs\",\n * \"content\": \"\"\n * }\n * AIMessageChunk {\n * \"content\": \"J\"\n * }\n * AIMessageChunk {\n * \"content\": \"'adore\"\n * }\n * AIMessageChunk {\n * \"content\": \" la\"\n * }\n * AIMessageChunk {\n * \"content\": \" programmation\",,\n * }\n * AIMessageChunk {\n * \"content\": \".\",,\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"response_metadata\": {\n * \"finish_reason\": \"stop\",\n * \"system_fingerprint\": \"fp_c9aa9c0491\"\n * },\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"usage_metadata\": {\n * \"input_tokens\": 28,\n * \"output_tokens\": 5,\n * \"total_tokens\": 33\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"chatcmpl-9u4PnX6Fy7OmK46DASy0bH6cxn5Xu\",\n * \"content\": \"J'adore la programmation.\",\n * \"response_metadata\": {\n * \"prompt\": 0,\n * \"completion\": 0,\n * \"finish_reason\": \"stop\",\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 28,\n * \"output_tokens\": 5,\n * \"total_tokens\": 33\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools(\n * [GetWeather, GetPopulation],\n * {\n * // strict: true // enforce tool args schema is respected\n * }\n * );\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetWeather',\n * args: { location: 'Los Angeles, CA' },\n * type: 'tool_call',\n * id: 'call_uPU4FiFzoKAtMxfmPnfQL6UK'\n * },\n * {\n * name: 'GetWeather',\n * args: { location: 'New York, NY' },\n * type: 'tool_call',\n * id: 'call_UNkEwuQsHrGYqgDQuH9nPAtX'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'Los Angeles, CA' },\n * type: 'tool_call',\n * id: 'call_kL3OXxaq9OjIKqRTpvjaCH14'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York, NY' },\n * type: 'tool_call',\n * id: 'call_s9KQB1UWj45LLGaEnjz0179q'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().nullable().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, {\n * name: \"Joke\",\n * strict: true, // Optionally enable OpenAI structured outputs\n * });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: 'Why was the cat sitting on the computer?',\n * punchline: 'Because it wanted to keep an eye on the mouse!',\n * rating: 7\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>JSON Object Response Format</strong></summary>\n *\n * ```typescript\n * const jsonLlm = llm.withConfig({ response_format: { type: \"json_object\" } });\n * const jsonLlmAiMsg = await jsonLlm.invoke(\n * \"Return a JSON object with key 'randomInts' and a value of 10 random ints in [0-99]\"\n * );\n * console.log(jsonLlmAiMsg.content);\n * ```\n *\n * ```txt\n * {\n * \"randomInts\": [23, 87, 45, 12, 78, 34, 56, 90, 11, 67]\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Multimodal</strong></summary>\n *\n * ```typescript\n * import { HumanMessage } from '@langchain/core/messages';\n *\n * const imageUrl = \"https://example.com/image.jpg\";\n * const imageData = await fetch(imageUrl).then(res => res.arrayBuffer());\n * const base64Image = Buffer.from(imageData).toString('base64');\n *\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"describe the weather in this image\" },\n * {\n * type: \"image_url\",\n * image_url: { url: `data:image/jpeg;base64,${base64Image}` },\n * },\n * ]\n * });\n *\n * const imageDescriptionAiMsg = await llm.invoke([message]);\n * console.log(imageDescriptionAiMsg.content);\n * ```\n *\n * ```txt\n * The weather in the image appears to be clear and sunny. The sky is mostly blue with a few scattered white clouds, indicating fair weather. The bright sunlight is casting shadows on the green, grassy hill, suggesting it is a pleasant day with good visibility. There are no signs of rain or stormy conditions.\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 28, output_tokens: 5, total_tokens: 33 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Prompt Caching</strong></summary>\n *\n * The default `\"implicit\"` mode keeps OpenAI's automatic breakpoint and also\n * uses explicit breakpoints. The `\"explicit\"` mode uses only the breakpoints\n * you provide.\n *\n * For models that support explicit cache breakpoints, pass request-level cache\n * options and mark supported content blocks with `prompt_cache_breakpoint`:\n *\n * ```typescript\n * const cachingLlm = new ChatOpenAI({ model: \"gpt-5.6-sol\" });\n * const cachedMsg = await cachingLlm.invoke(\n * [\n * new SystemMessage({\n * content: [\n * {\n * type: \"text\",\n * text: \"Stable instructions and examples...\",\n * prompt_cache_breakpoint: { mode: \"explicit\" },\n * },\n * ],\n * }),\n * new HumanMessage(\"Current request\"),\n * ],\n * {\n * promptCacheKey: \"tenant:acme:support-v1\",\n * promptCacheOptions: { mode: \"explicit\", ttl: \"30m\" },\n * }\n * );\n * ```\n *\n * Set `promptCacheOptions` per invocation, as above, or persist it on the\n * model:\n *\n * ```typescript\n * const persistentCachingLlm = new ChatOpenAI({\n * model: \"gpt-5.6-sol\",\n * promptCacheOptions: { mode: \"explicit\", ttl: \"30m\" },\n * });\n * ```\n *\n * `promptCacheOptions.mode` can be `\"implicit\"` or `\"explicit\"`. OpenAI limits\n * how many breakpoints can write to the cache in a single request. In\n * `\"implicit\"` mode, the implicit breakpoint on the latest message uses one\n * write slot, so up to three explicit breakpoints can write. In `\"explicit\"`\n * mode, up to four explicit breakpoints can write.\n *\n * For models before the GPT-5.6 family that support legacy prompt cache\n * retention, pass `promptCacheRetention`. See OpenAI's\n * [prompt caching docs](https://platform.openai.com/docs/guides/prompt-caching)\n * for the current model support list and retention semantics.\n *\n * ```typescript\n * const retainedMsg = await llm.invoke(input, { promptCacheRetention: \"24h\" });\n * ```\n *\n * Cache reads are available as `usage_metadata.input_token_details.cache_read`;\n * cache writes are available as `cache_creation` when the OpenAI response\n * includes `cache_write_tokens`.\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Logprobs</strong></summary>\n *\n * ```typescript\n * const logprobsLlm = new ChatOpenAI({ model: \"gpt-4o-mini\", logprobs: true });\n * const aiMsgForLogprobs = await logprobsLlm.invoke(input);\n * console.log(aiMsgForLogprobs.response_metadata.logprobs);\n * ```\n *\n * ```txt\n * {\n * content: [\n * {\n * token: 'J',\n * logprob: -0.000050616763,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * {\n * token: \"'\",\n * logprob: -0.01868736,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * {\n * token: 'ad',\n * logprob: -0.0000030545007,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * { token: 'ore', logprob: 0, bytes: [Array], top_logprobs: [] },\n * {\n * token: ' la',\n * logprob: -0.515404,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * {\n * token: ' programm',\n * logprob: -0.0000118755715,\n * bytes: [Array],\n * top_logprobs: []\n * },\n * { token: 'ation', logprob: 0, bytes: [Array], top_logprobs: [] },\n * {\n * token: '.',\n * logprob: -0.0000037697225,\n * bytes: [Array],\n * top_logprobs: []\n * }\n * ],\n * refusal: null\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Response Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForResponseMetadata = await llm.invoke(input);\n * console.log(aiMsgForResponseMetadata.response_metadata);\n * ```\n *\n * ```txt\n * {\n * tokenUsage: { completionTokens: 5, promptTokens: 28, totalTokens: 33 },\n * finish_reason: 'stop',\n * system_fingerprint: 'fp_3aa7262c27'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>JSON Schema Structured Output</strong></summary>\n *\n * ```typescript\n * const llmForJsonSchema = new ChatOpenAI({\n * model: \"gpt-4o-2024-08-06\",\n * }).withStructuredOutput(\n * z.object({\n * command: z.string().describe(\"The command to execute\"),\n * expectedOutput: z.string().describe(\"The expected output of the command\"),\n * options: z\n * .array(z.string())\n * .describe(\"The options you can pass to the command\"),\n * }),\n * {\n * method: \"jsonSchema\",\n * strict: true, // Optional when using the `jsonSchema` method\n * }\n * );\n *\n * const jsonSchemaRes = await llmForJsonSchema.invoke(\n * \"What is the command to list files in a directory?\"\n * );\n * console.log(jsonSchemaRes);\n * ```\n *\n * ```txt\n * {\n * command: 'ls',\n * expectedOutput: 'A list of files and subdirectories within the specified directory.',\n * options: [\n * '-a: include directory entries whose names begin with a dot (.).',\n * '-l: use a long listing format.',\n * '-h: with -l, print sizes in human readable format (e.g., 1K, 234M, 2G).',\n * '-t: sort by time, newest first.',\n * '-r: reverse order while sorting.',\n * '-S: sort by file size, largest first.',\n * '-R: list subdirectories recursively.'\n * ]\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Audio Outputs</strong></summary>\n *\n * ```typescript\n * import { ChatOpenAI } from \"@langchain/openai\";\n *\n * const modelWithAudioOutput = new ChatOpenAI({\n * model: \"gpt-4o-audio-preview\",\n * // You may also pass these fields to `.withConfig` as a call argument.\n * modalities: [\"text\", \"audio\"], // Specifies that the model should output audio.\n * audio: {\n * voice: \"alloy\",\n * format: \"wav\",\n * },\n * });\n *\n * const audioOutputResult = await modelWithAudioOutput.invoke(\"Tell me a joke about cats.\");\n * const castMessageContent = audioOutputResult.content[0] as Record<string, any>;\n *\n * console.log({\n * ...castMessageContent,\n * data: castMessageContent.data.slice(0, 100) // Sliced for brevity\n * })\n * ```\n *\n * ```txt\n * {\n * id: 'audio_67117718c6008190a3afad3e3054b9b6',\n * data: 'UklGRqYwBgBXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAATElTVBoAAABJTkZPSVNGVA4AAABMYXZmNTguMjkuMTAwAGRhdGFg',\n * expires_at: 1729201448,\n * transcript: 'Sure! Why did the cat sit on the computer? Because it wanted to keep an eye on the mouse!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Audio Outputs</strong></summary>\n *\n * ```typescript\n * import { ChatOpenAI } from \"@langchain/openai\";\n *\n * const modelWithAudioOutput = new ChatOpenAI({\n * model: \"gpt-4o-audio-preview\",\n * // You may also pass these fields to `.withConfig` as a call argument.\n * modalities: [\"text\", \"audio\"], // Specifies that the model should output audio.\n * audio: {\n * voice: \"alloy\",\n * format: \"wav\",\n * },\n * });\n *\n * const audioOutputResult = await modelWithAudioOutput.invoke(\"Tell me a joke about cats.\");\n * const castAudioContent = audioOutputResult.additional_kwargs.audio as Record<string, any>;\n *\n * console.log({\n * ...castAudioContent,\n * data: castAudioContent.data.slice(0, 100) // Sliced for brevity\n * })\n * ```\n *\n * ```txt\n * {\n * id: 'audio_67117718c6008190a3afad3e3054b9b6',\n * data: 'UklGRqYwBgBXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAATElTVBoAAABJTkZPSVNGVA4AAABMYXZmNTguMjkuMTAwAGRhdGFg',\n * expires_at: 1729201448,\n * transcript: 'Sure! Why did the cat sit on the computer? Because it wanted to keep an eye on the mouse!'\n * }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatOpenAI<\n CallOptions extends ChatOpenAICallOptions = ChatOpenAICallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n /**\n * Whether to use the responses API for all requests. If `false` the responses API will be used\n * only when required in order to fulfill the request.\n */\n useResponsesApi = false;\n\n protected responses: ChatOpenAIResponses;\n\n protected completions: ChatOpenAICompletions;\n\n get lc_serializable_keys(): string[] {\n return [...super.lc_serializable_keys, \"useResponsesApi\"];\n }\n\n get callKeys(): string[] {\n return [...super.callKeys, \"useResponsesApi\"];\n }\n\n protected fields?: ChatOpenAIFields;\n\n constructor(model: string, fields?: Omit<ChatOpenAIFields, \"model\">);\n constructor(fields?: ChatOpenAIFields);\n constructor(\n modelOrFields?: string | ChatOpenAIFields,\n fieldsArg?: Omit<ChatOpenAIFields, \"model\">\n ) {\n const fields = getChatOpenAIModelParams(modelOrFields, fieldsArg);\n super(fields);\n this.fields = fields;\n this.useResponsesApi = fields?.useResponsesApi ?? false;\n this.responses = fields?.responses ?? new ChatOpenAIResponses(fields);\n this.completions = fields?.completions ?? new ChatOpenAICompletions(fields);\n }\n\n protected _useResponsesApi(options: this[\"ParsedCallOptions\"] | undefined) {\n const usesBuiltInTools = options?.tools?.some(isBuiltInTool);\n const hasResponsesOnlyKwargs =\n options?.previous_response_id != null ||\n options?.text != null ||\n options?.truncation != null ||\n options?.include != null ||\n options?.reasoning?.summary != null ||\n this.reasoning?.summary != null;\n const hasCustomTools =\n options?.tools?.some(isOpenAICustomTool) ||\n options?.tools?.some(isCustomTool);\n\n return (\n this.useResponsesApi ||\n usesBuiltInTools ||\n hasResponsesOnlyKwargs ||\n hasCustomTools ||\n _modelPrefersResponsesAPI(this.model)\n );\n }\n\n override getLsParams(options: this[\"ParsedCallOptions\"]) {\n const optionsWithDefaults = this._combineCallOptions(options);\n if (this._useResponsesApi(options)) {\n return this.responses.getLsParams(optionsWithDefaults);\n }\n return this.completions.getLsParams(optionsWithDefaults);\n }\n\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n const optionsWithDefaults = this._combineCallOptions(options);\n if (this._useResponsesApi(options)) {\n return this.responses.invocationParams(optionsWithDefaults);\n }\n return this.completions.invocationParams(optionsWithDefaults);\n }\n\n /** @ignore */\n override async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this._useResponsesApi(options)) {\n return this.responses._generate(messages, options, runManager);\n }\n return this.completions._generate(messages, options, runManager);\n }\n\n override async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n if (this._useResponsesApi(options)) {\n yield* this.responses._streamChatModelEvents(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n return;\n }\n yield* this.completions._streamChatModelEvents(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n }\n\n override async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this._useResponsesApi(options)) {\n yield* this.responses._streamResponseChunks(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n return;\n }\n yield* this.completions._streamResponseChunks(\n messages,\n this._combineCallOptions(options),\n runManager\n );\n }\n\n override withConfig(\n config: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n const newModel = new ChatOpenAI<CallOptions>(this.fields);\n newModel.defaultOptions = { ...this.defaultOptions, ...config };\n return newModel;\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  const require_client = require("../utils/client.cjs");
2
2
  const require_tools = require("../utils/tools.cjs");
3
+ const require_misc = require("../utils/misc.cjs");
3
4
  const require_base = require("./base.cjs");
4
5
  const require_responses = require("../converters/responses.cjs");
5
6
  const require_responses_stream_events = require("../utils/responses_stream_events.cjs");
@@ -75,10 +76,11 @@ var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
75
76
  })(),
76
77
  parallel_tool_calls: options?.parallel_tool_calls,
77
78
  max_output_tokens: this.maxTokens === -1 ? void 0 : this.maxTokens,
78
- prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,
79
- prompt_cache_retention: options?.promptCacheRetention ?? this.promptCacheRetention,
80
79
  ...this.zdrEnabled ? { store: false } : {},
81
- ...this.modelKwargs
80
+ ...this.modelKwargs,
81
+ prompt_cache_key: options?.promptCacheKey ?? this.modelKwargs?.prompt_cache_key ?? this.promptCacheKey,
82
+ prompt_cache_retention: require_misc.normalizePromptCacheRetention(options?.promptCacheRetention ?? this.modelKwargs?.prompt_cache_retention ?? this.promptCacheRetention),
83
+ prompt_cache_options: options?.promptCacheOptions ?? this.modelKwargs?.prompt_cache_options ?? this.promptCacheOptions
82
84
  };
83
85
  const reasoning = this._getReasoningParams(options);
84
86
  if (reasoning !== void 0) params.reasoning = reasoning;
@@ -1 +1 @@
1
- {"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","isBuiltInToolChoice","formatToOpenAIToolChoice","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","convertOpenAIResponsesStream","convertResponsesDeltaToChatGenerationChunk","wrapOpenAIClientError","isBuiltInTool","isCustomTool","isOpenAIFunctionTool","isOpenAICustomTool","convertCompletionsCustomTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n {\n signal: options?.signal,\n maxRetries: options?.maxRetries,\n ...options?.options,\n }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n try {\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n // The SDK has its own `maxRetries`; take it for our caller instead so\n // the two retry loops don't multiply.\n const { maxRetries, ...sdkOptions } = requestOptions ?? {};\n const clientOptions = this._getClientOptions(sdkOptions);\n return this.caller.callWithOptions({ maxRetries }, async () => {\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","isBuiltInToolChoice","formatToOpenAIToolChoice","normalizePromptCacheRetention","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","convertOpenAIResponsesStream","convertResponsesDeltaToChatGenerationChunk","wrapOpenAIClientError","isBuiltInTool","isCustomTool","isOpenAIFunctionTool","isOpenAICustomTool","convertCompletionsCustomTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\nimport { normalizePromptCacheRetention } from \"../utils/misc.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n prompt_cache_key:\n options?.promptCacheKey ??\n this.modelKwargs?.prompt_cache_key ??\n this.promptCacheKey,\n prompt_cache_retention: normalizePromptCacheRetention(\n options?.promptCacheRetention ??\n this.modelKwargs?.prompt_cache_retention ??\n this.promptCacheRetention\n ),\n prompt_cache_options:\n options?.promptCacheOptions ??\n this.modelKwargs?.prompt_cache_options ??\n this.promptCacheOptions,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n {\n signal: options?.signal,\n maxRetries: options?.maxRetries,\n ...options?.options,\n }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n try {\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n // The SDK has its own `maxRetries`; take it for our caller instead so\n // the two retry loops don't multiply.\n const { maxRetries, ...sdkOptions } = requestOptions ?? {};\n const clientOptions = this._getClientOptions(sdkOptions);\n return this.caller.callWithOptions({ maxRetries }, async () => {\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"responses.d.cts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;UA+BiB,uCAAuC;;;;;EAKtD,OAAO,OAAa,UAAU;;;;EAK9B,aAAa,OAAa,UAAU;;;;EAKpC,UAAU,OAAa,UAAU;;;;;EAMjC,uBAAuB,OAAa,UAAU;;;;EAK9C,YAAY;;KAGF,gCAAgC,KAC1C,OAAa,UAAU;;;;;;;;cAWZ,oBACX,oBAAoB,iCAClB,wCACM,eAAe;EACvB,YAAY,eAAe,SAAS,KAAK;EACzC,YAAY,SAAS;EAQZ,iBACP,sCACC;EAuFG,UACJ,UAAU,eACV,oCACA,aAAa,2BACZ,QAAQ;EA4DJ,uBACL,UAAU,eACV,oCACA,cAAc,2BACb,eAAe;;gBAsCJ;EAIP,sBACL,UAAU,eACV,oCACA,aAAa,2BACZ,eAAe;;;;;;;EA8CZ,oBACJ,SAAS,OAAa,UAAU,+BAChC,iBAAiB,OAAa,iBAC7B,QAAQ,cAAc,OAAa,UAAU;EAE1C,oBACJ,SAAS,OAAa,UAAU,kCAChC,iBAAiB,OAAa,iBAC7B,QAAQ,OAAa,UAAU;;YA4BxB,uBACR,OAAO,sBACP;IAAU;IAAkB;MAC3B"}
1
+ {"version":3,"file":"responses.d.cts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;UAgCiB,uCAAuC;;;;;EAKtD,OAAO,OAAa,UAAU;;;;EAK9B,aAAa,OAAa,UAAU;;;;EAKpC,UAAU,OAAa,UAAU;;;;;EAMjC,uBAAuB,OAAa,UAAU;;;;EAK9C,YAAY;;KAGF,gCAAgC,KAC1C,OAAa,UAAU;;;;;;;;cAWZ,oBACX,oBAAoB,iCAClB,wCACM,eAAe;EACvB,YAAY,eAAe,SAAS,KAAK;EACzC,YAAY,SAAS;EAQZ,iBACP,sCACC;EAiGG,UACJ,UAAU,eACV,oCACA,aAAa,2BACZ,QAAQ;EA4DJ,uBACL,UAAU,eACV,oCACA,cAAc,2BACb,eAAe;;gBAsCJ;EAIP,sBACL,UAAU,eACV,oCACA,aAAa,2BACZ,eAAe;;;;;;;EA8CZ,oBACJ,SAAS,OAAa,UAAU,+BAChC,iBAAiB,OAAa,iBAC7B,QAAQ,cAAc,OAAa,UAAU;EAE1C,oBACJ,SAAS,OAAa,UAAU,kCAChC,iBAAiB,OAAa,iBAC7B,QAAQ,OAAa,UAAU;;YA4BxB,uBACR,OAAO,sBACP;IAAU;IAAkB;MAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"responses.d.ts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;UA+BiB,uCAAuC;;;;;EAKtD,OAAO,OAAa,UAAU;;;;EAK9B,aAAa,OAAa,UAAU;;;;EAKpC,UAAU,OAAa,UAAU;;;;;EAMjC,uBAAuB,OAAa,UAAU;;;;EAK9C,YAAY;;KAGF,gCAAgC,KAC1C,OAAa,UAAU;;;;;;;;cAWZ,oBACX,oBAAoB,iCAClB,wCACM,eAAe;EACvB,YAAY,eAAe,SAAS,KAAK;EACzC,YAAY,SAAS;EAQZ,iBACP,sCACC;EAuFG,UACJ,UAAU,eACV,oCACA,aAAa,2BACZ,QAAQ;EA4DJ,uBACL,UAAU,eACV,oCACA,cAAc,2BACb,eAAe;;gBAsCJ;EAIP,sBACL,UAAU,eACV,oCACA,aAAa,2BACZ,eAAe;;;;;;;EA8CZ,oBACJ,SAAS,OAAa,UAAU,+BAChC,iBAAiB,OAAa,iBAC7B,QAAQ,cAAc,OAAa,UAAU;EAE1C,oBACJ,SAAS,OAAa,UAAU,kCAChC,iBAAiB,OAAa,iBAC7B,QAAQ,OAAa,UAAU;;YA4BxB,uBACR,OAAO,sBACP;IAAU;IAAkB;MAC3B"}
1
+ {"version":3,"file":"responses.d.ts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;UAgCiB,uCAAuC;;;;;EAKtD,OAAO,OAAa,UAAU;;;;EAK9B,aAAa,OAAa,UAAU;;;;EAKpC,UAAU,OAAa,UAAU;;;;;EAMjC,uBAAuB,OAAa,UAAU;;;;EAK9C,YAAY;;KAGF,gCAAgC,KAC1C,OAAa,UAAU;;;;;;;;cAWZ,oBACX,oBAAoB,iCAClB,wCACM,eAAe;EACvB,YAAY,eAAe,SAAS,KAAK;EACzC,YAAY,SAAS;EAQZ,iBACP,sCACC;EAiGG,UACJ,UAAU,eACV,oCACA,aAAa,2BACZ,QAAQ;EA4DJ,uBACL,UAAU,eACV,oCACA,cAAc,2BACb,eAAe;;gBAsCJ;EAIP,sBACL,UAAU,eACV,oCACA,aAAa,2BACZ,eAAe;;;;;;;EA8CZ,oBACJ,SAAS,OAAa,UAAU,+BAChC,iBAAiB,OAAa,iBAC7B,QAAQ,cAAc,OAAa,UAAU;EAE1C,oBACJ,SAAS,OAAa,UAAU,kCAChC,iBAAiB,OAAa,iBAC7B,QAAQ,OAAa,UAAU;;YA4BxB,uBACR,OAAO,sBACP;IAAU;IAAkB;MAC3B"}
@@ -1,5 +1,6 @@
1
1
  import { wrapOpenAIClientError } from "../utils/client.js";
2
2
  import { convertCompletionsCustomTool, formatToOpenAIToolChoice, isBuiltInTool, isBuiltInToolChoice, isCustomTool, isOpenAICustomTool } from "../utils/tools.js";
3
+ import { normalizePromptCacheRetention } from "../utils/misc.js";
3
4
  import { BaseChatOpenAI, getChatOpenAIModelParams } from "./base.js";
4
5
  import { convertMessagesToResponsesInput, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage } from "../converters/responses.js";
5
6
  import { convertOpenAIResponsesStream } from "../utils/responses_stream_events.js";
@@ -75,10 +76,11 @@ var ChatOpenAIResponses = class extends BaseChatOpenAI {
75
76
  })(),
76
77
  parallel_tool_calls: options?.parallel_tool_calls,
77
78
  max_output_tokens: this.maxTokens === -1 ? void 0 : this.maxTokens,
78
- prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,
79
- prompt_cache_retention: options?.promptCacheRetention ?? this.promptCacheRetention,
80
79
  ...this.zdrEnabled ? { store: false } : {},
81
- ...this.modelKwargs
80
+ ...this.modelKwargs,
81
+ prompt_cache_key: options?.promptCacheKey ?? this.modelKwargs?.prompt_cache_key ?? this.promptCacheKey,
82
+ prompt_cache_retention: normalizePromptCacheRetention(options?.promptCacheRetention ?? this.modelKwargs?.prompt_cache_retention ?? this.promptCacheRetention),
83
+ prompt_cache_options: options?.promptCacheOptions ?? this.modelKwargs?.prompt_cache_options ?? this.promptCacheOptions
82
84
  };
83
85
  const reasoning = this._getReasoningParams(options);
84
86
  if (reasoning !== void 0) params.reasoning = reasoning;
@@ -1 +1 @@
1
- {"version":3,"file":"responses.js","names":["isOpenAIFunctionTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n {\n signal: options?.signal,\n maxRetries: options?.maxRetries,\n ...options?.options,\n }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n try {\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n // The SDK has its own `maxRetries`; take it for our caller instead so\n // the two retry loops don't multiply.\n const { maxRetries, ...sdkOptions } = requestOptions ?? {};\n const clientOptions = this._getClientOptions(sdkOptions);\n return this.caller.callWithOptions({ maxRetries }, async () => {\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"responses.js","names":["isOpenAIFunctionTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\nimport { convertOpenAIResponsesStream } from \"../utils/responses_stream_events.js\";\nimport { normalizePromptCacheRetention } from \"../utils/misc.js\";\n\nexport interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions =\n ChatOpenAIResponsesCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n }\n if (strict === undefined && this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n service_tier: this.service_tier,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n prompt_cache_key:\n options?.promptCacheKey ??\n this.modelKwargs?.prompt_cache_key ??\n this.promptCacheKey,\n prompt_cache_retention: normalizePromptCacheRetention(\n options?.promptCacheRetention ??\n this.modelKwargs?.prompt_cache_retention ??\n this.promptCacheRetention\n ),\n prompt_cache_options:\n options?.promptCacheOptions ??\n this.modelKwargs?.prompt_cache_options ??\n this.promptCacheOptions,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n {\n signal: options?.signal,\n maxRetries: options?.maxRetries,\n ...options?.options,\n }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n const abortableStream = async function* (\n source: AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const data of source) {\n if (signal?.aborted) {\n return;\n }\n yield data;\n }\n };\n\n yield* convertOpenAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n {\n streamUsage: shouldStreamUsage ?? true,\n provider: this.streamEventProvider,\n }\n );\n }\n\n /** Provider id used in native stream protocol passthrough events. */\n protected get streamEventProvider(): string {\n return \"openai\";\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n try {\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n // The SDK has its own `maxRetries`; take it for our caller instead so\n // the two retry loops don't multiply.\n const { maxRetries, ...sdkOptions } = requestOptions ?? {};\n const clientOptions = this._getClientOptions(sdkOptions);\n return this.caller.callWithOptions({ maxRetries }, async () => {\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tool)) {\n if (k !== \"type\" && k !== \"function\") {\n extra[k] = v;\n }\n }\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n ...extra,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
@@ -458,16 +458,16 @@ const convertStandardContentMessageToCompletionsMessage = ({ message, model }) =
458
458
  if (role === "system" && require_misc.isReasoningModel(model)) role = "developer";
459
459
  if (role === "developer") return {
460
460
  role: "developer",
461
- content: message.contentBlocks.filter((block) => block.type === "text")
461
+ content: message.contentBlocks.filter((block) => block.type === "text").map(require_misc.liftExtrasPromptCacheBreakpoint)
462
462
  };
463
463
  else if (role === "system") return {
464
464
  role: "system",
465
- content: message.contentBlocks.filter((block) => block.type === "text")
465
+ content: message.contentBlocks.filter((block) => block.type === "text").map(require_misc.liftExtrasPromptCacheBreakpoint)
466
466
  };
467
467
  else if (role === "assistant") {
468
468
  const completionParam = {
469
469
  role: "assistant",
470
- content: message.contentBlocks.filter((block) => block.type === "text")
470
+ content: message.contentBlocks.filter((block) => block.type === "text").map(require_misc.liftExtrasPromptCacheBreakpoint)
471
471
  };
472
472
  if (_langchain_core_messages.AIMessage.isInstance(message) && !!message.tool_calls?.length) completionParam.tool_calls = message.tool_calls.map(_langchain_core_output_parsers_openai_tools.convertLangChainToolCallToOpenAI);
473
473
  else if (message.additional_kwargs.tool_calls != null) completionParam.tool_calls = message.additional_kwargs.tool_calls;
@@ -476,7 +476,7 @@ const convertStandardContentMessageToCompletionsMessage = ({ message, model }) =
476
476
  } else if (role === "tool" && _langchain_core_messages.ToolMessage.isInstance(message)) return {
477
477
  role: "tool",
478
478
  tool_call_id: message.tool_call_id,
479
- content: message.contentBlocks.filter((block) => block.type === "text")
479
+ content: message.contentBlocks.filter((block) => block.type === "text").map(require_misc.liftExtrasPromptCacheBreakpoint)
480
480
  };
481
481
  else if (role === "function") return {
482
482
  role: "function",
@@ -485,12 +485,12 @@ const convertStandardContentMessageToCompletionsMessage = ({ message, model }) =
485
485
  };
486
486
  function* iterateUserContent(blocks) {
487
487
  for (const block of blocks) {
488
- if (block.type === "text") yield {
488
+ if (block.type === "text") yield require_misc.applyPromptCacheBreakpoint(block, {
489
489
  type: "text",
490
490
  text: block.text
491
- };
491
+ });
492
492
  const data = convertStandardContentBlockToCompletionsContentPart(block);
493
- if (data) yield data;
493
+ if (data) yield require_misc.applyPromptCacheBreakpoint(block, data);
494
494
  }
495
495
  }
496
496
  return {
@@ -575,7 +575,8 @@ const convertMessagesToCompletionsMessageParams = ({ messages, model }) => {
575
575
  let role = require_misc.messageToOpenAIRole(message);
576
576
  if (role === "system" && require_misc.isReasoningModel(model)) role = "developer";
577
577
  const content = typeof message.content === "string" ? message.content : message.content.flatMap((m) => {
578
- if ((0, _langchain_core_messages.isDataContentBlock)(m)) return (0, _langchain_core_messages.convertToProviderContentBlock)(m, completionsApiContentBlockConverter);
578
+ if ((0, _langchain_core_messages.isDataContentBlock)(m)) return require_misc.applyPromptCacheBreakpoint(m, (0, _langchain_core_messages.convertToProviderContentBlock)(m, completionsApiContentBlockConverter));
579
+ if (m.type === "text") return require_misc.liftExtrasPromptCacheBreakpoint(m);
579
580
  if (typeof m === "object" && m !== null && "type" in m && (m.type === "tool_use" || m.type === "tool_call" || m.type === "functionCall" || m.type === "reasoning" || m.type === "reasoning_content" || m.type === "thinking")) return [];
580
581
  return m;
581
582
  });