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