@langchain/openai 1.0.0-alpha.3 → 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 +53 -0
- package/dist/azure/chat_models/common.cjs +130 -0
- package/dist/azure/chat_models/common.cjs.map +1 -0
- package/dist/azure/chat_models/common.d.cts +16 -0
- package/dist/azure/chat_models/common.d.cts.map +1 -0
- package/dist/azure/chat_models/common.d.ts +16 -0
- package/dist/azure/chat_models/common.d.ts.map +1 -0
- package/dist/azure/chat_models/common.js +124 -0
- package/dist/azure/chat_models/common.js.map +1 -0
- package/dist/azure/chat_models/completions.cjs +50 -0
- package/dist/azure/chat_models/completions.cjs.map +1 -0
- package/dist/azure/chat_models/completions.d.cts +29 -0
- package/dist/azure/chat_models/completions.d.cts.map +1 -0
- package/dist/azure/chat_models/completions.d.ts +29 -0
- package/dist/azure/chat_models/completions.d.ts.map +1 -0
- package/dist/azure/chat_models/completions.js +50 -0
- package/dist/azure/chat_models/completions.js.map +1 -0
- package/dist/azure/{chat_models.cjs → chat_models/index.cjs} +14 -214
- package/dist/azure/chat_models/index.cjs.map +1 -0
- package/dist/azure/{chat_models.d.ts → chat_models/index.d.cts} +6 -11
- package/dist/azure/chat_models/index.d.cts.map +1 -0
- package/dist/azure/{chat_models.d.cts → chat_models/index.d.ts} +6 -11
- package/dist/azure/chat_models/index.d.ts.map +1 -0
- package/dist/azure/{chat_models.js → chat_models/index.js} +6 -205
- package/dist/azure/chat_models/index.js.map +1 -0
- package/dist/azure/chat_models/responses.cjs +50 -0
- package/dist/azure/chat_models/responses.cjs.map +1 -0
- package/dist/azure/chat_models/responses.d.cts +29 -0
- package/dist/azure/chat_models/responses.d.cts.map +1 -0
- package/dist/azure/chat_models/responses.d.ts +29 -0
- package/dist/azure/chat_models/responses.d.ts.map +1 -0
- package/dist/azure/chat_models/responses.js +50 -0
- package/dist/azure/chat_models/responses.js.map +1 -0
- package/dist/chat_models/base.cjs +533 -0
- package/dist/chat_models/base.cjs.map +1 -0
- package/dist/chat_models/base.d.cts +272 -0
- package/dist/chat_models/base.d.cts.map +1 -0
- package/dist/chat_models/base.d.ts +272 -0
- package/dist/chat_models/base.d.ts.map +1 -0
- package/dist/chat_models/base.js +532 -0
- package/dist/chat_models/base.js.map +1 -0
- package/dist/chat_models/completions.cjs +258 -0
- package/dist/chat_models/completions.cjs.map +1 -0
- package/dist/chat_models/completions.d.cts +44 -0
- package/dist/chat_models/completions.d.cts.map +1 -0
- package/dist/chat_models/completions.d.ts +44 -0
- package/dist/chat_models/completions.d.ts.map +1 -0
- package/dist/chat_models/completions.js +257 -0
- package/dist/chat_models/completions.js.map +1 -0
- package/dist/chat_models/index.cjs +608 -0
- package/dist/chat_models/index.cjs.map +1 -0
- package/dist/chat_models/index.d.cts +593 -0
- package/dist/chat_models/index.d.cts.map +1 -0
- package/dist/chat_models/index.d.ts +593 -0
- package/dist/chat_models/index.d.ts.map +1 -0
- package/dist/chat_models/index.js +608 -0
- package/dist/chat_models/index.js.map +1 -0
- package/dist/chat_models/responses.cjs +189 -0
- package/dist/chat_models/responses.cjs.map +1 -0
- package/dist/chat_models/responses.d.cts +62 -0
- package/dist/chat_models/responses.d.cts.map +1 -0
- package/dist/chat_models/responses.d.ts +62 -0
- package/dist/chat_models/responses.d.ts.map +1 -0
- package/dist/chat_models/responses.js +188 -0
- package/dist/chat_models/responses.js.map +1 -0
- 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 +14 -9
- package/dist/index.d.cts +9 -4
- package/dist/index.d.ts +9 -4
- package/dist/index.js +8 -4
- package/dist/langchain-core/dist/callbacks/base.d.ts +1 -0
- package/dist/langchain-core/dist/callbacks/manager.d.ts +2 -0
- package/dist/langchain-core/dist/language_models/base.d.ts +5 -0
- package/dist/langchain-core/dist/language_models/chat_models.d.cts +13 -0
- package/dist/langchain-core/dist/language_models/chat_models.d.cts.map +1 -0
- package/dist/langchain-core/dist/language_models/chat_models.d.ts +20 -0
- package/dist/langchain-core/dist/language_models/chat_models.d.ts.map +1 -0
- package/dist/langchain-core/dist/runnables/base.d.ts +7 -0
- package/dist/langchain-core/dist/runnables/graph.d.ts +1 -0
- package/dist/langchain-core/dist/runnables/types.d.ts +2 -0
- package/dist/langchain-core/dist/tools/types.d.ts +5 -0
- package/dist/langchain-core/dist/tracers/base.d.ts +2 -0
- package/dist/langchain-core/dist/tracers/event_stream.d.ts +1 -0
- package/dist/langchain-core/dist/tracers/log_stream.d.ts +3 -0
- package/dist/langchain-core/dist/utils/types/index.d.ts +1 -0
- package/dist/langchain-core/dist/utils/types/zod.d.ts +1 -0
- package/dist/llms.cjs +1 -1
- package/dist/llms.d.cts +1 -1
- package/dist/llms.js +1 -1
- 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 +10 -7
- package/dist/azure/chat_models.cjs.map +0 -1
- package/dist/azure/chat_models.d.cts.map +0 -1
- package/dist/azure/chat_models.d.ts.map +0 -1
- package/dist/azure/chat_models.js.map +0 -1
- package/dist/chat_models.cjs +0 -1967
- package/dist/chat_models.cjs.map +0 -1
- package/dist/chat_models.d.cts +0 -933
- package/dist/chat_models.d.cts.map +0 -1
- package/dist/chat_models.d.ts +0 -933
- package/dist/chat_models.d.ts.map +0 -1
- package/dist/chat_models.js +0 -1963
- package/dist/chat_models.js.map +0 -1
- 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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_tools = require('../utils/tools.cjs');
|
|
3
|
+
const require_base = require('./base.cjs');
|
|
4
|
+
const require_client = require('../utils/client.cjs');
|
|
5
|
+
const require_responses = require('../converters/responses.cjs');
|
|
6
|
+
const __langchain_core_language_models_base = require_rolldown_runtime.__toESM(require("@langchain/core/language_models/base"));
|
|
7
|
+
|
|
8
|
+
//#region src/chat_models/responses.ts
|
|
9
|
+
/**
|
|
10
|
+
* OpenAI Responses API implementation.
|
|
11
|
+
*
|
|
12
|
+
* Will be exported in a later version of @langchain/openai.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
var ChatOpenAIResponses = class extends require_base.BaseChatOpenAI {
|
|
17
|
+
invocationParams(options) {
|
|
18
|
+
let strict;
|
|
19
|
+
if (options?.strict !== void 0) strict = options.strict;
|
|
20
|
+
else if (this.supportsStrictToolCalling !== void 0) strict = this.supportsStrictToolCalling;
|
|
21
|
+
const params = {
|
|
22
|
+
model: this.model,
|
|
23
|
+
temperature: this.temperature,
|
|
24
|
+
top_p: this.topP,
|
|
25
|
+
user: this.user,
|
|
26
|
+
stream: this.streaming,
|
|
27
|
+
previous_response_id: options?.previous_response_id,
|
|
28
|
+
truncation: options?.truncation,
|
|
29
|
+
include: options?.include,
|
|
30
|
+
tools: options?.tools?.length ? this._reduceChatOpenAITools(options.tools, {
|
|
31
|
+
stream: this.streaming,
|
|
32
|
+
strict
|
|
33
|
+
}) : void 0,
|
|
34
|
+
tool_choice: require_tools.isBuiltInToolChoice(options?.tool_choice) ? options?.tool_choice : (() => {
|
|
35
|
+
const formatted = require_tools.formatToOpenAIToolChoice(options?.tool_choice);
|
|
36
|
+
if (typeof formatted === "object" && "type" in formatted) {
|
|
37
|
+
if (formatted.type === "function") return {
|
|
38
|
+
type: "function",
|
|
39
|
+
name: formatted.function.name
|
|
40
|
+
};
|
|
41
|
+
else if (formatted.type === "allowed_tools") return {
|
|
42
|
+
type: "allowed_tools",
|
|
43
|
+
mode: formatted.allowed_tools.mode,
|
|
44
|
+
tools: formatted.allowed_tools.tools
|
|
45
|
+
};
|
|
46
|
+
else if (formatted.type === "custom") return {
|
|
47
|
+
type: "custom",
|
|
48
|
+
name: formatted.custom.name
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return void 0;
|
|
52
|
+
})(),
|
|
53
|
+
text: (() => {
|
|
54
|
+
if (options?.text) return options.text;
|
|
55
|
+
const format = this._getResponseFormat(options?.response_format);
|
|
56
|
+
if (format?.type === "json_schema") {
|
|
57
|
+
if (format.json_schema.schema != null) return {
|
|
58
|
+
format: {
|
|
59
|
+
type: "json_schema",
|
|
60
|
+
schema: format.json_schema.schema,
|
|
61
|
+
description: format.json_schema.description,
|
|
62
|
+
name: format.json_schema.name,
|
|
63
|
+
strict: format.json_schema.strict
|
|
64
|
+
},
|
|
65
|
+
verbosity: options?.verbosity
|
|
66
|
+
};
|
|
67
|
+
return void 0;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
format,
|
|
71
|
+
verbosity: options?.verbosity
|
|
72
|
+
};
|
|
73
|
+
})(),
|
|
74
|
+
parallel_tool_calls: options?.parallel_tool_calls,
|
|
75
|
+
max_output_tokens: this.maxTokens === -1 ? void 0 : this.maxTokens,
|
|
76
|
+
prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,
|
|
77
|
+
...this.zdrEnabled ? { store: false } : {},
|
|
78
|
+
...this.modelKwargs
|
|
79
|
+
};
|
|
80
|
+
const reasoning = this._getReasoningParams(options);
|
|
81
|
+
if (reasoning !== void 0) params.reasoning = reasoning;
|
|
82
|
+
return params;
|
|
83
|
+
}
|
|
84
|
+
async _generate(messages, options) {
|
|
85
|
+
const invocationParams = this.invocationParams(options);
|
|
86
|
+
if (invocationParams.stream) {
|
|
87
|
+
const stream = this._streamResponseChunks(messages, options);
|
|
88
|
+
let finalChunk;
|
|
89
|
+
for await (const chunk of stream) {
|
|
90
|
+
chunk.message.response_metadata = {
|
|
91
|
+
...chunk.generationInfo,
|
|
92
|
+
...chunk.message.response_metadata
|
|
93
|
+
};
|
|
94
|
+
finalChunk = finalChunk?.concat(chunk) ?? chunk;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
generations: finalChunk ? [finalChunk] : [],
|
|
98
|
+
llmOutput: { estimatedTokenUsage: (finalChunk?.message)?.usage_metadata }
|
|
99
|
+
};
|
|
100
|
+
} else {
|
|
101
|
+
const data = await this.completionWithRetry({
|
|
102
|
+
input: require_responses.convertMessagesToResponsesInput({
|
|
103
|
+
messages,
|
|
104
|
+
zdrEnabled: this.zdrEnabled ?? false,
|
|
105
|
+
model: this.model
|
|
106
|
+
}),
|
|
107
|
+
...invocationParams,
|
|
108
|
+
stream: false
|
|
109
|
+
}, {
|
|
110
|
+
signal: options?.signal,
|
|
111
|
+
...options?.options
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
generations: [{
|
|
115
|
+
text: data.output_text,
|
|
116
|
+
message: require_responses.convertResponsesMessageToAIMessage(data)
|
|
117
|
+
}],
|
|
118
|
+
llmOutput: {
|
|
119
|
+
id: data.id,
|
|
120
|
+
estimatedTokenUsage: data.usage ? {
|
|
121
|
+
promptTokens: data.usage.input_tokens,
|
|
122
|
+
completionTokens: data.usage.output_tokens,
|
|
123
|
+
totalTokens: data.usage.total_tokens
|
|
124
|
+
} : void 0
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
130
|
+
const streamIterable = await this.completionWithRetry({
|
|
131
|
+
...this.invocationParams(options),
|
|
132
|
+
input: require_responses.convertMessagesToResponsesInput({
|
|
133
|
+
messages,
|
|
134
|
+
zdrEnabled: this.zdrEnabled ?? false,
|
|
135
|
+
model: this.model
|
|
136
|
+
}),
|
|
137
|
+
stream: true
|
|
138
|
+
}, options);
|
|
139
|
+
for await (const data of streamIterable) {
|
|
140
|
+
const chunk = require_responses.convertResponsesDeltaToChatGenerationChunk(data);
|
|
141
|
+
if (chunk == null) continue;
|
|
142
|
+
yield chunk;
|
|
143
|
+
await runManager?.handleLLMNewToken(chunk.text || "", {
|
|
144
|
+
prompt: options.promptIndex ?? 0,
|
|
145
|
+
completion: 0
|
|
146
|
+
}, void 0, void 0, void 0, { chunk });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async completionWithRetry(request, requestOptions) {
|
|
150
|
+
return this.caller.call(async () => {
|
|
151
|
+
const clientOptions = this._getClientOptions(requestOptions);
|
|
152
|
+
try {
|
|
153
|
+
if (request.text?.format?.type === "json_schema" && !request.stream) return await this.client.responses.parse(request, clientOptions);
|
|
154
|
+
return await this.client.responses.create(request, clientOptions);
|
|
155
|
+
} catch (e) {
|
|
156
|
+
const error = require_client.wrapOpenAIClientError(e);
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/** @internal */
|
|
162
|
+
_reduceChatOpenAITools(tools, fields) {
|
|
163
|
+
const reducedTools = [];
|
|
164
|
+
for (const tool of tools) if (require_tools.isBuiltInTool(tool)) {
|
|
165
|
+
if (tool.type === "image_generation" && fields?.stream) tool.partial_images = 1;
|
|
166
|
+
reducedTools.push(tool);
|
|
167
|
+
} else if (require_tools.isCustomTool(tool)) {
|
|
168
|
+
const customToolData = tool.metadata.customTool;
|
|
169
|
+
reducedTools.push({
|
|
170
|
+
type: "custom",
|
|
171
|
+
name: customToolData.name,
|
|
172
|
+
description: customToolData.description,
|
|
173
|
+
format: customToolData.format
|
|
174
|
+
});
|
|
175
|
+
} else if ((0, __langchain_core_language_models_base.isOpenAITool)(tool)) reducedTools.push({
|
|
176
|
+
type: "function",
|
|
177
|
+
name: tool.function.name,
|
|
178
|
+
parameters: tool.function.parameters,
|
|
179
|
+
description: tool.function.description,
|
|
180
|
+
strict: fields?.strict ?? null
|
|
181
|
+
});
|
|
182
|
+
else if (require_tools.isOpenAICustomTool(tool)) reducedTools.push(require_tools.convertCompletionsCustomTool(tool));
|
|
183
|
+
return reducedTools;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
//#endregion
|
|
188
|
+
exports.ChatOpenAIResponses = ChatOpenAIResponses;
|
|
189
|
+
//# sourceMappingURL=responses.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.cjs","names":["BaseChatOpenAI","options?: this[\"ParsedCallOptions\"]","strict: boolean | undefined","params: ChatResponsesInvocationParams","isBuiltInToolChoice","formatToOpenAIToolChoice","messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","finalChunk: ChatGenerationChunk | undefined","convertMessagesToResponsesInput","convertResponsesMessageToAIMessage","runManager?: CallbackManagerForLLMRun","convertResponsesDeltaToChatGenerationChunk","request: OpenAIClient.Responses.ResponseCreateParams","requestOptions?: OpenAIClient.RequestOptions","wrapOpenAIClientError","tools: ChatOpenAIToolType[]","fields: { stream?: boolean; strict?: boolean }","reducedTools: ResponsesTool[]","isBuiltInTool","isCustomTool","isOpenAICustomTool","convertCompletionsCustomTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport { BaseChatOpenAI, BaseChatOpenAICallOptions } from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\n\nexport interface ChatOpenAIResponsesCallOptions\n extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions = ChatOpenAIResponsesCallOptions\n> extends BaseChatOpenAI<CallOptions> {\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"]\n ): Promise<ChatResult> {\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n { signal: options?.signal, ...options?.options }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n for await (const data of streamIterable) {\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n return this.caller.call(async () => {\n const clientOptions = this._getClientOptions(requestOptions);\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkEA,IAAa,sBAAb,cAEUA,4BAA4B;CACpC,AAAS,iBACPC,SAC+B;EAC/B,IAAIC;AACJ,MAAI,SAAS,WAAW,QACtB,SAAS,QAAQ;WACR,KAAK,8BAA8B,QAC5C,SAAS,KAAK;EAGhB,MAAMC,SAAwC;GAC5C,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,OAAO,KAAK;GACZ,MAAM,KAAK;GAGX,QAAQ,KAAK;GACb,sBAAsB,SAAS;GAC/B,YAAY,SAAS;GACrB,SAAS,SAAS;GAClB,OAAO,SAAS,OAAO,SACnB,KAAK,uBAAuB,QAAQ,OAAO;IACzC,QAAQ,KAAK;IACb;GACD,EAAC,GACF;GACJ,aAAaC,kCAAoB,SAAS,YAAY,GAClD,SAAS,eACR,MAAM;IACL,MAAM,YAAYC,uCAAyB,SAAS,YAAY;AAChE,QAAI,OAAO,cAAc,YAAY,UAAU,WAC7C;SAAI,UAAU,SAAS,WACrB,QAAO;MAAE,MAAM;MAAY,MAAM,UAAU,SAAS;KAAM;cACjD,UAAU,SAAS,gBAC5B,QAAO;MACL,MAAM;MACN,MAAM,UAAU,cAAc;MAC9B,OAAO,UAAU,cAAc;KAChC;cACQ,UAAU,SAAS,SAC5B,QAAO;MACL,MAAM;MACN,MAAM,UAAU,OAAO;KACxB;IACF;AAEH,WAAO;GACR,IAAG;GACR,OAAO,MAAM;AACX,QAAI,SAAS,KAAM,QAAO,QAAQ;IAClC,MAAM,SAAS,KAAK,mBAAmB,SAAS,gBAAgB;AAChE,QAAI,QAAQ,SAAS,eAAe;AAClC,SAAI,OAAO,YAAY,UAAU,KAC/B,QAAO;MACL,QAAQ;OACN,MAAM;OACN,QAAQ,OAAO,YAAY;OAC3B,aAAa,OAAO,YAAY;OAChC,MAAM,OAAO,YAAY;OACzB,QAAQ,OAAO,YAAY;MAC5B;MACD,WAAW,SAAS;KACrB;AAEH,YAAO;IACR;AACD,WAAO;KAAE;KAAQ,WAAW,SAAS;IAAW;GACjD,IAAG;GACJ,qBAAqB,SAAS;GAC9B,mBAAmB,KAAK,cAAc,KAAK,SAAY,KAAK;GAC5D,kBAAkB,SAAS,kBAAkB,KAAK;GAClD,GAAI,KAAK,aAAa,EAAE,OAAO,MAAO,IAAG,CAAE;GAC3C,GAAG,KAAK;EACT;EAED,MAAM,YAAY,KAAK,oBAAoB,QAAQ;AAEnD,MAAI,cAAc,QAChB,OAAO,YAAY;AAGrB,SAAO;CACR;CAED,MAAM,UACJC,UACAC,SACqB;EACrB,MAAM,mBAAmB,KAAK,iBAAiB,QAAQ;AACvD,MAAI,iBAAiB,QAAQ;GAC3B,MAAM,SAAS,KAAK,sBAAsB,UAAU,QAAQ;GAC5D,IAAIC;AACJ,cAAW,MAAM,SAAS,QAAQ;IAChC,MAAM,QAAQ,oBAAoB;KAChC,GAAG,MAAM;KACT,GAAG,MAAM,QAAQ;IAClB;IACD,aAAa,YAAY,OAAO,MAAM,IAAI;GAC3C;AAED,UAAO;IACL,aAAa,aAAa,CAAC,UAAW,IAAG,CAAE;IAC3C,WAAW,EACT,sBAAsB,YAAY,UAC9B,eACL;GACF;EACF,OAAM;GACL,MAAM,OAAO,MAAM,KAAK,oBACtB;IACE,OAAOC,kDAAgC;KACrC;KACA,YAAY,KAAK,cAAc;KAC/B,OAAO,KAAK;IACb,EAAC;IACF,GAAG;IACH,QAAQ;GACT,GACD;IAAE,QAAQ,SAAS;IAAQ,GAAG,SAAS;GAAS,EACjD;AAED,UAAO;IACL,aAAa,CACX;KACE,MAAM,KAAK;KACX,SAASC,qDAAmC,KAAK;IAClD,CACF;IACD,WAAW;KACT,IAAI,KAAK;KACT,qBAAqB,KAAK,QACtB;MACE,cAAc,KAAK,MAAM;MACzB,kBAAkB,KAAK,MAAM;MAC7B,aAAa,KAAK,MAAM;KACzB,IACD;IACL;GACF;EACF;CACF;CAED,OAAO,sBACLJ,UACAC,SACAI,YACqC;EACrC,MAAM,iBAAiB,MAAM,KAAK,oBAChC;GACE,GAAG,KAAK,iBAAiB,QAAQ;GACjC,OAAOF,kDAAgC;IACrC;IACA,YAAY,KAAK,cAAc;IAC/B,OAAO,KAAK;GACb,EAAC;GACF,QAAQ;EACT,GACD,QACD;AAED,aAAW,MAAM,QAAQ,gBAAgB;GACvC,MAAM,QAAQG,6DAA2C,KAAK;AAC9D,OAAI,SAAS,KAAM;GACnB,MAAM;GACN,MAAM,YAAY,kBAChB,MAAM,QAAQ,IACd;IACE,QAAQ,QAAQ,eAAe;IAC/B,YAAY;GACb,GACD,QACA,QACA,QACA,EAAE,MAAO,EACV;EACF;CACF;CAkBD,MAAM,oBACJC,SACAC,gBAIA;AACA,SAAO,KAAK,OAAO,KAAK,YAAY;GAClC,MAAM,gBAAgB,KAAK,kBAAkB,eAAe;AAC5D,OAAI;AAEF,QAAI,QAAQ,MAAM,QAAQ,SAAS,iBAAiB,CAAC,QAAQ,OAC3D,QAAO,MAAM,KAAK,OAAO,UAAU,MAAM,SAAS,cAAc;AAElE,WAAO,MAAM,KAAK,OAAO,UAAU,OAAO,SAAS,cAAc;GAClE,SAAQ,GAAG;IACV,MAAM,QAAQC,qCAAsB,EAAE;AACtC,UAAM;GACP;EACF,EAAC;CACH;;CAGD,AAAU,uBACRC,OACAC,QACiB;EACjB,MAAMC,eAAgC,CAAE;AACxC,OAAK,MAAM,QAAQ,MACjB,KAAIC,4BAAc,KAAK,EAAE;AACvB,OAAI,KAAK,SAAS,sBAAsB,QAAQ,QAG9C,KAAK,iBAAiB;GAExB,aAAa,KAAK,KAAK;EACxB,WAAUC,2BAAa,KAAK,EAAE;GAC7B,MAAM,iBAAiB,KAAK,SAAS;GACrC,aAAa,KAAK;IAChB,MAAM;IACN,MAAM,eAAe;IACrB,aAAa,eAAe;IAC5B,QAAQ,eAAe;GACxB,EAAkB;EACpB,mEAA+B,KAAK,EACnC,aAAa,KAAK;GAChB,MAAM;GACN,MAAM,KAAK,SAAS;GACpB,YAAY,KAAK,SAAS;GAC1B,aAAa,KAAK,SAAS;GAC3B,QAAQ,QAAQ,UAAU;EAC3B,EAAC;WACOC,iCAAmB,KAAK,EACjC,aAAa,KAAKC,2CAA6B,KAAK,CAAC;AAGzD,SAAO;CACR;AACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { OpenAIVerbosityParam } from "../types.cjs";
|
|
2
|
+
import { ChatOpenAIToolType, ResponsesTool } from "../utils/tools.cjs";
|
|
3
|
+
import { BaseChatOpenAI, BaseChatOpenAICallOptions } from "./base.cjs";
|
|
4
|
+
import { OpenAI as OpenAI$1 } from "openai";
|
|
5
|
+
import { BaseMessage } from "@langchain/core/messages";
|
|
6
|
+
import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
|
|
7
|
+
import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
|
|
8
|
+
|
|
9
|
+
//#region src/chat_models/responses.d.ts
|
|
10
|
+
interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Configuration options for a text response from the model. Can be plain text or
|
|
13
|
+
* structured JSON data.
|
|
14
|
+
*/
|
|
15
|
+
text?: OpenAI$1.Responses.ResponseCreateParams["text"];
|
|
16
|
+
/**
|
|
17
|
+
* The truncation strategy to use for the model response.
|
|
18
|
+
*/
|
|
19
|
+
truncation?: OpenAI$1.Responses.ResponseCreateParams["truncation"];
|
|
20
|
+
/**
|
|
21
|
+
* Specify additional output data to include in the model response.
|
|
22
|
+
*/
|
|
23
|
+
include?: OpenAI$1.Responses.ResponseCreateParams["include"];
|
|
24
|
+
/**
|
|
25
|
+
* The unique ID of the previous response to the model. Use this to create multi-turn
|
|
26
|
+
* conversations.
|
|
27
|
+
*/
|
|
28
|
+
previous_response_id?: OpenAI$1.Responses.ResponseCreateParams["previous_response_id"];
|
|
29
|
+
/**
|
|
30
|
+
* The verbosity of the model's response.
|
|
31
|
+
*/
|
|
32
|
+
verbosity?: OpenAIVerbosityParam;
|
|
33
|
+
}
|
|
34
|
+
type ChatResponsesInvocationParams = Omit<OpenAI$1.Responses.ResponseCreateParams, "input">;
|
|
35
|
+
/**
|
|
36
|
+
* OpenAI Responses API implementation.
|
|
37
|
+
*
|
|
38
|
+
* Will be exported in a later version of @langchain/openai.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
declare class ChatOpenAIResponses<CallOptions extends ChatOpenAIResponsesCallOptions = ChatOpenAIResponsesCallOptions> extends BaseChatOpenAI<CallOptions> {
|
|
43
|
+
invocationParams(options?: this["ParsedCallOptions"]): ChatResponsesInvocationParams;
|
|
44
|
+
_generate(messages: BaseMessage[], options: this["ParsedCallOptions"]): Promise<ChatResult>;
|
|
45
|
+
_streamResponseChunks(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
|
|
46
|
+
/**
|
|
47
|
+
* Calls the Responses API with retry logic in case of failures.
|
|
48
|
+
* @param request The request to send to the OpenAI API.
|
|
49
|
+
* @param options Optional configuration for the API call.
|
|
50
|
+
* @returns The response from the OpenAI API.
|
|
51
|
+
*/
|
|
52
|
+
completionWithRetry(request: OpenAI$1.Responses.ResponseCreateParamsStreaming, requestOptions?: OpenAI$1.RequestOptions): Promise<AsyncIterable<OpenAI$1.Responses.ResponseStreamEvent>>;
|
|
53
|
+
completionWithRetry(request: OpenAI$1.Responses.ResponseCreateParamsNonStreaming, requestOptions?: OpenAI$1.RequestOptions): Promise<OpenAI$1.Responses.Response>;
|
|
54
|
+
/** @internal */
|
|
55
|
+
protected _reduceChatOpenAITools(tools: ChatOpenAIToolType[], fields: {
|
|
56
|
+
stream?: boolean;
|
|
57
|
+
strict?: boolean;
|
|
58
|
+
}): ResponsesTool[];
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { ChatOpenAIResponses, ChatOpenAIResponsesCallOptions };
|
|
62
|
+
//# sourceMappingURL=responses.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { OpenAIVerbosityParam } from "../types.js";
|
|
2
|
+
import { ChatOpenAIToolType, ResponsesTool } from "../utils/tools.js";
|
|
3
|
+
import { BaseChatOpenAI, BaseChatOpenAICallOptions } from "./base.js";
|
|
4
|
+
import { OpenAI as OpenAI$1 } from "openai";
|
|
5
|
+
import { BaseMessage } from "@langchain/core/messages";
|
|
6
|
+
import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
|
|
7
|
+
import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
|
|
8
|
+
|
|
9
|
+
//#region src/chat_models/responses.d.ts
|
|
10
|
+
interface ChatOpenAIResponsesCallOptions extends BaseChatOpenAICallOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Configuration options for a text response from the model. Can be plain text or
|
|
13
|
+
* structured JSON data.
|
|
14
|
+
*/
|
|
15
|
+
text?: OpenAI$1.Responses.ResponseCreateParams["text"];
|
|
16
|
+
/**
|
|
17
|
+
* The truncation strategy to use for the model response.
|
|
18
|
+
*/
|
|
19
|
+
truncation?: OpenAI$1.Responses.ResponseCreateParams["truncation"];
|
|
20
|
+
/**
|
|
21
|
+
* Specify additional output data to include in the model response.
|
|
22
|
+
*/
|
|
23
|
+
include?: OpenAI$1.Responses.ResponseCreateParams["include"];
|
|
24
|
+
/**
|
|
25
|
+
* The unique ID of the previous response to the model. Use this to create multi-turn
|
|
26
|
+
* conversations.
|
|
27
|
+
*/
|
|
28
|
+
previous_response_id?: OpenAI$1.Responses.ResponseCreateParams["previous_response_id"];
|
|
29
|
+
/**
|
|
30
|
+
* The verbosity of the model's response.
|
|
31
|
+
*/
|
|
32
|
+
verbosity?: OpenAIVerbosityParam;
|
|
33
|
+
}
|
|
34
|
+
type ChatResponsesInvocationParams = Omit<OpenAI$1.Responses.ResponseCreateParams, "input">;
|
|
35
|
+
/**
|
|
36
|
+
* OpenAI Responses API implementation.
|
|
37
|
+
*
|
|
38
|
+
* Will be exported in a later version of @langchain/openai.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
declare class ChatOpenAIResponses<CallOptions extends ChatOpenAIResponsesCallOptions = ChatOpenAIResponsesCallOptions> extends BaseChatOpenAI<CallOptions> {
|
|
43
|
+
invocationParams(options?: this["ParsedCallOptions"]): ChatResponsesInvocationParams;
|
|
44
|
+
_generate(messages: BaseMessage[], options: this["ParsedCallOptions"]): Promise<ChatResult>;
|
|
45
|
+
_streamResponseChunks(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
|
|
46
|
+
/**
|
|
47
|
+
* Calls the Responses API with retry logic in case of failures.
|
|
48
|
+
* @param request The request to send to the OpenAI API.
|
|
49
|
+
* @param options Optional configuration for the API call.
|
|
50
|
+
* @returns The response from the OpenAI API.
|
|
51
|
+
*/
|
|
52
|
+
completionWithRetry(request: OpenAI$1.Responses.ResponseCreateParamsStreaming, requestOptions?: OpenAI$1.RequestOptions): Promise<AsyncIterable<OpenAI$1.Responses.ResponseStreamEvent>>;
|
|
53
|
+
completionWithRetry(request: OpenAI$1.Responses.ResponseCreateParamsNonStreaming, requestOptions?: OpenAI$1.RequestOptions): Promise<OpenAI$1.Responses.Response>;
|
|
54
|
+
/** @internal */
|
|
55
|
+
protected _reduceChatOpenAITools(tools: ChatOpenAIToolType[], fields: {
|
|
56
|
+
stream?: boolean;
|
|
57
|
+
strict?: boolean;
|
|
58
|
+
}): ResponsesTool[];
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { ChatOpenAIResponses, ChatOpenAIResponsesCallOptions };
|
|
62
|
+
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { convertCompletionsCustomTool, formatToOpenAIToolChoice, isBuiltInTool, isBuiltInToolChoice, isCustomTool, isOpenAICustomTool } from "../utils/tools.js";
|
|
2
|
+
import { BaseChatOpenAI } from "./base.js";
|
|
3
|
+
import { wrapOpenAIClientError } from "../utils/client.js";
|
|
4
|
+
import { convertMessagesToResponsesInput, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage } from "../converters/responses.js";
|
|
5
|
+
import { isOpenAITool } from "@langchain/core/language_models/base";
|
|
6
|
+
|
|
7
|
+
//#region src/chat_models/responses.ts
|
|
8
|
+
/**
|
|
9
|
+
* OpenAI Responses API implementation.
|
|
10
|
+
*
|
|
11
|
+
* Will be exported in a later version of @langchain/openai.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
var ChatOpenAIResponses = class extends BaseChatOpenAI {
|
|
16
|
+
invocationParams(options) {
|
|
17
|
+
let strict;
|
|
18
|
+
if (options?.strict !== void 0) strict = options.strict;
|
|
19
|
+
else if (this.supportsStrictToolCalling !== void 0) strict = this.supportsStrictToolCalling;
|
|
20
|
+
const params = {
|
|
21
|
+
model: this.model,
|
|
22
|
+
temperature: this.temperature,
|
|
23
|
+
top_p: this.topP,
|
|
24
|
+
user: this.user,
|
|
25
|
+
stream: this.streaming,
|
|
26
|
+
previous_response_id: options?.previous_response_id,
|
|
27
|
+
truncation: options?.truncation,
|
|
28
|
+
include: options?.include,
|
|
29
|
+
tools: options?.tools?.length ? this._reduceChatOpenAITools(options.tools, {
|
|
30
|
+
stream: this.streaming,
|
|
31
|
+
strict
|
|
32
|
+
}) : void 0,
|
|
33
|
+
tool_choice: isBuiltInToolChoice(options?.tool_choice) ? options?.tool_choice : (() => {
|
|
34
|
+
const formatted = formatToOpenAIToolChoice(options?.tool_choice);
|
|
35
|
+
if (typeof formatted === "object" && "type" in formatted) {
|
|
36
|
+
if (formatted.type === "function") return {
|
|
37
|
+
type: "function",
|
|
38
|
+
name: formatted.function.name
|
|
39
|
+
};
|
|
40
|
+
else if (formatted.type === "allowed_tools") return {
|
|
41
|
+
type: "allowed_tools",
|
|
42
|
+
mode: formatted.allowed_tools.mode,
|
|
43
|
+
tools: formatted.allowed_tools.tools
|
|
44
|
+
};
|
|
45
|
+
else if (formatted.type === "custom") return {
|
|
46
|
+
type: "custom",
|
|
47
|
+
name: formatted.custom.name
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return void 0;
|
|
51
|
+
})(),
|
|
52
|
+
text: (() => {
|
|
53
|
+
if (options?.text) return options.text;
|
|
54
|
+
const format = this._getResponseFormat(options?.response_format);
|
|
55
|
+
if (format?.type === "json_schema") {
|
|
56
|
+
if (format.json_schema.schema != null) return {
|
|
57
|
+
format: {
|
|
58
|
+
type: "json_schema",
|
|
59
|
+
schema: format.json_schema.schema,
|
|
60
|
+
description: format.json_schema.description,
|
|
61
|
+
name: format.json_schema.name,
|
|
62
|
+
strict: format.json_schema.strict
|
|
63
|
+
},
|
|
64
|
+
verbosity: options?.verbosity
|
|
65
|
+
};
|
|
66
|
+
return void 0;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
format,
|
|
70
|
+
verbosity: options?.verbosity
|
|
71
|
+
};
|
|
72
|
+
})(),
|
|
73
|
+
parallel_tool_calls: options?.parallel_tool_calls,
|
|
74
|
+
max_output_tokens: this.maxTokens === -1 ? void 0 : this.maxTokens,
|
|
75
|
+
prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,
|
|
76
|
+
...this.zdrEnabled ? { store: false } : {},
|
|
77
|
+
...this.modelKwargs
|
|
78
|
+
};
|
|
79
|
+
const reasoning = this._getReasoningParams(options);
|
|
80
|
+
if (reasoning !== void 0) params.reasoning = reasoning;
|
|
81
|
+
return params;
|
|
82
|
+
}
|
|
83
|
+
async _generate(messages, options) {
|
|
84
|
+
const invocationParams = this.invocationParams(options);
|
|
85
|
+
if (invocationParams.stream) {
|
|
86
|
+
const stream = this._streamResponseChunks(messages, options);
|
|
87
|
+
let finalChunk;
|
|
88
|
+
for await (const chunk of stream) {
|
|
89
|
+
chunk.message.response_metadata = {
|
|
90
|
+
...chunk.generationInfo,
|
|
91
|
+
...chunk.message.response_metadata
|
|
92
|
+
};
|
|
93
|
+
finalChunk = finalChunk?.concat(chunk) ?? chunk;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
generations: finalChunk ? [finalChunk] : [],
|
|
97
|
+
llmOutput: { estimatedTokenUsage: (finalChunk?.message)?.usage_metadata }
|
|
98
|
+
};
|
|
99
|
+
} else {
|
|
100
|
+
const data = await this.completionWithRetry({
|
|
101
|
+
input: convertMessagesToResponsesInput({
|
|
102
|
+
messages,
|
|
103
|
+
zdrEnabled: this.zdrEnabled ?? false,
|
|
104
|
+
model: this.model
|
|
105
|
+
}),
|
|
106
|
+
...invocationParams,
|
|
107
|
+
stream: false
|
|
108
|
+
}, {
|
|
109
|
+
signal: options?.signal,
|
|
110
|
+
...options?.options
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
generations: [{
|
|
114
|
+
text: data.output_text,
|
|
115
|
+
message: convertResponsesMessageToAIMessage(data)
|
|
116
|
+
}],
|
|
117
|
+
llmOutput: {
|
|
118
|
+
id: data.id,
|
|
119
|
+
estimatedTokenUsage: data.usage ? {
|
|
120
|
+
promptTokens: data.usage.input_tokens,
|
|
121
|
+
completionTokens: data.usage.output_tokens,
|
|
122
|
+
totalTokens: data.usage.total_tokens
|
|
123
|
+
} : void 0
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
129
|
+
const streamIterable = await this.completionWithRetry({
|
|
130
|
+
...this.invocationParams(options),
|
|
131
|
+
input: convertMessagesToResponsesInput({
|
|
132
|
+
messages,
|
|
133
|
+
zdrEnabled: this.zdrEnabled ?? false,
|
|
134
|
+
model: this.model
|
|
135
|
+
}),
|
|
136
|
+
stream: true
|
|
137
|
+
}, options);
|
|
138
|
+
for await (const data of streamIterable) {
|
|
139
|
+
const chunk = convertResponsesDeltaToChatGenerationChunk(data);
|
|
140
|
+
if (chunk == null) continue;
|
|
141
|
+
yield chunk;
|
|
142
|
+
await runManager?.handleLLMNewToken(chunk.text || "", {
|
|
143
|
+
prompt: options.promptIndex ?? 0,
|
|
144
|
+
completion: 0
|
|
145
|
+
}, void 0, void 0, void 0, { chunk });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async completionWithRetry(request, requestOptions) {
|
|
149
|
+
return this.caller.call(async () => {
|
|
150
|
+
const clientOptions = this._getClientOptions(requestOptions);
|
|
151
|
+
try {
|
|
152
|
+
if (request.text?.format?.type === "json_schema" && !request.stream) return await this.client.responses.parse(request, clientOptions);
|
|
153
|
+
return await this.client.responses.create(request, clientOptions);
|
|
154
|
+
} catch (e) {
|
|
155
|
+
const error = wrapOpenAIClientError(e);
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/** @internal */
|
|
161
|
+
_reduceChatOpenAITools(tools, fields) {
|
|
162
|
+
const reducedTools = [];
|
|
163
|
+
for (const tool of tools) if (isBuiltInTool(tool)) {
|
|
164
|
+
if (tool.type === "image_generation" && fields?.stream) tool.partial_images = 1;
|
|
165
|
+
reducedTools.push(tool);
|
|
166
|
+
} else if (isCustomTool(tool)) {
|
|
167
|
+
const customToolData = tool.metadata.customTool;
|
|
168
|
+
reducedTools.push({
|
|
169
|
+
type: "custom",
|
|
170
|
+
name: customToolData.name,
|
|
171
|
+
description: customToolData.description,
|
|
172
|
+
format: customToolData.format
|
|
173
|
+
});
|
|
174
|
+
} else if (isOpenAITool(tool)) reducedTools.push({
|
|
175
|
+
type: "function",
|
|
176
|
+
name: tool.function.name,
|
|
177
|
+
parameters: tool.function.parameters,
|
|
178
|
+
description: tool.function.description,
|
|
179
|
+
strict: fields?.strict ?? null
|
|
180
|
+
});
|
|
181
|
+
else if (isOpenAICustomTool(tool)) reducedTools.push(convertCompletionsCustomTool(tool));
|
|
182
|
+
return reducedTools;
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
//#endregion
|
|
187
|
+
export { ChatOpenAIResponses };
|
|
188
|
+
//# sourceMappingURL=responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","names":["options?: this[\"ParsedCallOptions\"]","strict: boolean | undefined","params: ChatResponsesInvocationParams","messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","finalChunk: ChatGenerationChunk | undefined","runManager?: CallbackManagerForLLMRun","request: OpenAIClient.Responses.ResponseCreateParams","requestOptions?: OpenAIClient.RequestOptions","tools: ChatOpenAIToolType[]","fields: { stream?: boolean; strict?: boolean }","reducedTools: ResponsesTool[]","isOpenAIFunctionTool"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { isOpenAITool as isOpenAIFunctionTool } from \"@langchain/core/language_models/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n ChatOpenAIToolType,\n convertCompletionsCustomTool,\n formatToOpenAIToolChoice,\n isBuiltInTool,\n isBuiltInToolChoice,\n isCustomTool,\n isOpenAICustomTool,\n ResponsesTool,\n} from \"../utils/tools.js\";\nimport { BaseChatOpenAI, BaseChatOpenAICallOptions } from \"./base.js\";\nimport {\n convertMessagesToResponsesInput,\n convertResponsesDeltaToChatGenerationChunk,\n convertResponsesMessageToAIMessage,\n} from \"../converters/responses.js\";\nimport { OpenAIVerbosityParam } from \"../types.js\";\n\nexport interface ChatOpenAIResponsesCallOptions\n extends BaseChatOpenAICallOptions {\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data.\n */\n text?: OpenAIClient.Responses.ResponseCreateParams[\"text\"];\n\n /**\n * The truncation strategy to use for the model response.\n */\n truncation?: OpenAIClient.Responses.ResponseCreateParams[\"truncation\"];\n\n /**\n * Specify additional output data to include in the model response.\n */\n include?: OpenAIClient.Responses.ResponseCreateParams[\"include\"];\n\n /**\n * The unique ID of the previous response to the model. Use this to create multi-turn\n * conversations.\n */\n previous_response_id?: OpenAIClient.Responses.ResponseCreateParams[\"previous_response_id\"];\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport type ChatResponsesInvocationParams = Omit<\n OpenAIClient.Responses.ResponseCreateParams,\n \"input\"\n>;\n\n/**\n * OpenAI Responses API implementation.\n *\n * Will be exported in a later version of @langchain/openai.\n *\n * @internal\n */\nexport class ChatOpenAIResponses<\n CallOptions extends ChatOpenAIResponsesCallOptions = ChatOpenAIResponsesCallOptions\n> extends BaseChatOpenAI<CallOptions> {\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatResponsesInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n const params: ChatResponsesInvocationParams = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n user: this.user,\n\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n truncation: options?.truncation,\n include: options?.include,\n tools: options?.tools?.length\n ? this._reduceChatOpenAITools(options.tools, {\n stream: this.streaming,\n strict,\n })\n : undefined,\n tool_choice: isBuiltInToolChoice(options?.tool_choice)\n ? options?.tool_choice\n : (() => {\n const formatted = formatToOpenAIToolChoice(options?.tool_choice);\n if (typeof formatted === \"object\" && \"type\" in formatted) {\n if (formatted.type === \"function\") {\n return { type: \"function\", name: formatted.function.name };\n } else if (formatted.type === \"allowed_tools\") {\n return {\n type: \"allowed_tools\",\n mode: formatted.allowed_tools.mode,\n tools: formatted.allowed_tools.tools,\n };\n } else if (formatted.type === \"custom\") {\n return {\n type: \"custom\",\n name: formatted.custom.name,\n };\n }\n }\n return undefined;\n })(),\n text: (() => {\n if (options?.text) return options.text;\n const format = this._getResponseFormat(options?.response_format);\n if (format?.type === \"json_schema\") {\n if (format.json_schema.schema != null) {\n return {\n format: {\n type: \"json_schema\",\n schema: format.json_schema.schema,\n description: format.json_schema.description,\n name: format.json_schema.name,\n strict: format.json_schema.strict,\n },\n verbosity: options?.verbosity,\n };\n }\n return undefined;\n }\n return { format, verbosity: options?.verbosity };\n })(),\n parallel_tool_calls: options?.parallel_tool_calls,\n max_output_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n ...(this.zdrEnabled ? { store: false } : {}),\n ...this.modelKwargs,\n };\n\n const reasoning = this._getReasoningParams(options);\n\n if (reasoning !== undefined) {\n params.reasoning = reasoning;\n }\n\n return params;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"]\n ): Promise<ChatResult> {\n const invocationParams = this.invocationParams(options);\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options);\n let finalChunk: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n ...invocationParams,\n stream: false,\n },\n { signal: options?.signal, ...options?.options }\n );\n\n return {\n generations: [\n {\n text: data.output_text,\n message: convertResponsesMessageToAIMessage(data),\n },\n ],\n llmOutput: {\n id: data.id,\n estimatedTokenUsage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamIterable = await this.completionWithRetry(\n {\n ...this.invocationParams(options),\n input: convertMessagesToResponsesInput({\n messages,\n zdrEnabled: this.zdrEnabled ?? false,\n model: this.model,\n }),\n stream: true,\n },\n options\n );\n\n for await (const data of streamIterable) {\n const chunk = convertResponsesDeltaToChatGenerationChunk(data);\n if (chunk == null) continue;\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || \"\",\n {\n prompt: options.promptIndex ?? 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n\n /**\n * Calls the Responses API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Responses.Response>;\n\n async completionWithRetry(\n request: OpenAIClient.Responses.ResponseCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>\n | OpenAIClient.Responses.Response\n > {\n return this.caller.call(async () => {\n const clientOptions = this._getClientOptions(requestOptions);\n try {\n // use parse if dealing with json_schema\n if (request.text?.format?.type === \"json_schema\" && !request.stream) {\n return await this.client.responses.parse(request, clientOptions);\n }\n return await this.client.responses.create(request, clientOptions);\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /** @internal */\n protected _reduceChatOpenAITools(\n tools: ChatOpenAIToolType[],\n fields: { stream?: boolean; strict?: boolean }\n ): ResponsesTool[] {\n const reducedTools: ResponsesTool[] = [];\n for (const tool of tools) {\n if (isBuiltInTool(tool)) {\n if (tool.type === \"image_generation\" && fields?.stream) {\n // OpenAI sends a 400 error if partial_images is not set and we want to stream.\n // We also set it to 1 since we don't support partial images yet.\n tool.partial_images = 1;\n }\n reducedTools.push(tool);\n } else if (isCustomTool(tool)) {\n const customToolData = tool.metadata.customTool;\n reducedTools.push({\n type: \"custom\",\n name: customToolData.name,\n description: customToolData.description,\n format: customToolData.format,\n } as ResponsesTool);\n } else if (isOpenAIFunctionTool(tool)) {\n reducedTools.push({\n type: \"function\",\n name: tool.function.name,\n parameters: tool.function.parameters,\n description: tool.function.description,\n strict: fields?.strict ?? null,\n });\n } else if (isOpenAICustomTool(tool)) {\n reducedTools.push(convertCompletionsCustomTool(tool));\n }\n }\n return reducedTools;\n }\n}\n"],"mappings":"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"}
|