@langchain/openai 1.6.2 → 1.7.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 +22 -0
- package/dist/azure/chat_models/common.d.cts +1 -2
- package/dist/azure/chat_models/common.d.cts.map +1 -1
- package/dist/azure/chat_models/common.d.ts +1 -2
- package/dist/azure/chat_models/common.d.ts.map +1 -1
- package/dist/azure/chat_models/completions.d.cts +1 -2
- package/dist/azure/chat_models/completions.d.cts.map +1 -1
- package/dist/azure/chat_models/completions.d.ts +1 -2
- package/dist/azure/chat_models/completions.d.ts.map +1 -1
- package/dist/azure/chat_models/index.cjs +5 -0
- package/dist/azure/chat_models/index.cjs.map +1 -1
- package/dist/azure/chat_models/index.d.cts +3 -2
- package/dist/azure/chat_models/index.d.cts.map +1 -1
- package/dist/azure/chat_models/index.d.ts +3 -2
- package/dist/azure/chat_models/index.d.ts.map +1 -1
- package/dist/azure/chat_models/index.js +5 -0
- package/dist/azure/chat_models/index.js.map +1 -1
- package/dist/azure/chat_models/responses.cjs +5 -0
- package/dist/azure/chat_models/responses.cjs.map +1 -1
- package/dist/azure/chat_models/responses.d.cts +3 -2
- package/dist/azure/chat_models/responses.d.cts.map +1 -1
- package/dist/azure/chat_models/responses.d.ts +3 -2
- package/dist/azure/chat_models/responses.d.ts.map +1 -1
- package/dist/azure/chat_models/responses.js +5 -0
- package/dist/azure/chat_models/responses.js.map +1 -1
- package/dist/azure/embeddings.d.cts +1 -2
- package/dist/azure/embeddings.d.cts.map +1 -1
- package/dist/azure/embeddings.d.ts +1 -2
- package/dist/azure/embeddings.d.ts.map +1 -1
- package/dist/azure/llms.d.cts +1 -2
- package/dist/azure/llms.d.cts.map +1 -1
- package/dist/azure/llms.d.ts.map +1 -1
- package/dist/chat_models/base.cjs +1 -1
- package/dist/chat_models/base.d.cts +4 -4
- package/dist/chat_models/base.d.cts.map +1 -1
- package/dist/chat_models/base.d.ts +4 -4
- package/dist/chat_models/base.d.ts.map +1 -1
- package/dist/chat_models/base.js +1 -1
- package/dist/chat_models/completions.cjs +2 -2
- package/dist/chat_models/completions.cjs.map +1 -1
- package/dist/chat_models/completions.d.cts +2 -3
- package/dist/chat_models/completions.d.cts.map +1 -1
- package/dist/chat_models/completions.d.ts +2 -3
- package/dist/chat_models/completions.d.ts.map +1 -1
- package/dist/chat_models/completions.js +2 -2
- package/dist/chat_models/completions.js.map +1 -1
- package/dist/chat_models/index.cjs +2 -2
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +4 -4
- package/dist/chat_models/index.d.cts.map +1 -1
- package/dist/chat_models/index.d.ts +4 -4
- package/dist/chat_models/index.d.ts.map +1 -1
- package/dist/chat_models/index.js +2 -2
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/profiles.cjs +350 -193
- package/dist/chat_models/profiles.cjs.map +1 -1
- package/dist/chat_models/profiles.js +350 -193
- package/dist/chat_models/profiles.js.map +1 -1
- package/dist/chat_models/responses.cjs +2 -2
- package/dist/chat_models/responses.cjs.map +1 -1
- package/dist/chat_models/responses.d.cts +3 -4
- package/dist/chat_models/responses.d.cts.map +1 -1
- package/dist/chat_models/responses.d.ts +3 -4
- package/dist/chat_models/responses.d.ts.map +1 -1
- package/dist/chat_models/responses.js +2 -2
- package/dist/chat_models/responses.js.map +1 -1
- package/dist/converters/completions.d.cts +6 -7
- package/dist/converters/completions.d.cts.map +1 -1
- package/dist/converters/completions.d.ts +6 -7
- package/dist/converters/completions.d.ts.map +1 -1
- package/dist/converters/responses.d.cts +11 -12
- package/dist/converters/responses.d.cts.map +1 -1
- package/dist/converters/responses.d.ts +11 -12
- package/dist/converters/responses.d.ts.map +1 -1
- package/dist/embeddings.d.cts +3 -4
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts +3 -4
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/llms.cjs +1 -1
- package/dist/llms.d.cts.map +1 -1
- package/dist/llms.d.ts.map +1 -1
- package/dist/llms.js +1 -1
- package/dist/tools/applyPatch.d.cts +8 -9
- package/dist/tools/applyPatch.d.cts.map +1 -1
- package/dist/tools/applyPatch.d.ts +8 -9
- package/dist/tools/applyPatch.d.ts.map +1 -1
- package/dist/tools/codeInterpreter.d.cts +5 -6
- package/dist/tools/codeInterpreter.d.cts.map +1 -1
- package/dist/tools/codeInterpreter.d.ts +5 -6
- package/dist/tools/codeInterpreter.d.ts.map +1 -1
- package/dist/tools/computerUse.d.cts +17 -18
- package/dist/tools/computerUse.d.cts.map +1 -1
- package/dist/tools/computerUse.d.ts +17 -18
- package/dist/tools/computerUse.d.ts.map +1 -1
- package/dist/tools/custom.d.cts +2 -3
- package/dist/tools/custom.d.cts.map +1 -1
- package/dist/tools/custom.d.ts +2 -3
- package/dist/tools/custom.d.ts.map +1 -1
- package/dist/tools/dalle.d.cts +3 -4
- package/dist/tools/dalle.d.cts.map +1 -1
- package/dist/tools/dalle.d.ts +3 -4
- package/dist/tools/dalle.d.ts.map +1 -1
- package/dist/tools/fileSearch.d.cts +9 -10
- package/dist/tools/fileSearch.d.cts.map +1 -1
- package/dist/tools/fileSearch.d.ts +9 -10
- package/dist/tools/fileSearch.d.ts.map +1 -1
- package/dist/tools/imageGeneration.d.cts +4 -5
- package/dist/tools/imageGeneration.d.cts.map +1 -1
- package/dist/tools/imageGeneration.d.ts +4 -5
- package/dist/tools/imageGeneration.d.ts.map +1 -1
- package/dist/tools/index.d.cts +2 -2
- package/dist/tools/index.d.cts.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/localShell.d.cts +5 -6
- package/dist/tools/localShell.d.cts.map +1 -1
- package/dist/tools/localShell.d.ts +5 -6
- package/dist/tools/localShell.d.ts.map +1 -1
- package/dist/tools/mcp.d.cts +8 -9
- package/dist/tools/mcp.d.cts.map +1 -1
- package/dist/tools/mcp.d.ts +8 -9
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/shell.d.cts +8 -9
- package/dist/tools/shell.d.cts.map +1 -1
- package/dist/tools/shell.d.ts +8 -9
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/toolSearch.d.cts +3 -4
- package/dist/tools/toolSearch.d.cts.map +1 -1
- package/dist/tools/toolSearch.d.ts +3 -4
- package/dist/tools/toolSearch.d.ts.map +1 -1
- package/dist/tools/webSearch.d.cts +5 -6
- package/dist/tools/webSearch.d.cts.map +1 -1
- package/dist/tools/webSearch.d.ts +5 -6
- package/dist/tools/webSearch.d.ts.map +1 -1
- package/dist/types.d.cts +16 -16
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +16 -16
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/azure.d.cts +7 -8
- package/dist/utils/azure.d.cts.map +1 -1
- package/dist/utils/azure.d.ts +7 -8
- package/dist/utils/azure.d.ts.map +1 -1
- package/dist/utils/client.d.cts +1 -2
- package/dist/utils/client.d.cts.map +1 -1
- package/dist/utils/client.d.ts +1 -2
- package/dist/utils/client.d.ts.map +1 -1
- package/dist/utils/misc.d.cts +1 -2
- package/dist/utils/misc.d.cts.map +1 -1
- package/dist/utils/misc.d.ts +1 -2
- package/dist/utils/misc.d.ts.map +1 -1
- package/dist/utils/profile.cjs +27 -0
- package/dist/utils/profile.cjs.map +1 -0
- package/dist/utils/profile.js +27 -0
- package/dist/utils/profile.js.map +1 -0
- package/dist/utils/prompts.d.cts +1 -2
- package/dist/utils/prompts.d.cts.map +1 -1
- package/dist/utils/prompts.d.ts +1 -2
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/responses_stream_events.cjs +25 -34
- package/dist/utils/responses_stream_events.cjs.map +1 -1
- package/dist/utils/responses_stream_events.d.cts +2 -3
- package/dist/utils/responses_stream_events.d.cts.map +1 -1
- package/dist/utils/responses_stream_events.d.ts +2 -3
- package/dist/utils/responses_stream_events.d.ts.map +1 -1
- package/dist/utils/responses_stream_events.js +25 -34
- package/dist/utils/responses_stream_events.js.map +1 -1
- package/dist/utils/tools.d.cts +4 -5
- package/dist/utils/tools.d.cts.map +1 -1
- package/dist/utils/tools.d.ts +4 -5
- package/dist/utils/tools.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/utils/file_mime_types.cjs +0 -15
- package/dist/utils/file_mime_types.cjs.map +0 -1
- package/dist/utils/file_mime_types.js +0 -15
- package/dist/utils/file_mime_types.js.map +0 -1
package/dist/utils/client.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.cts","names":[],"sources":["../../src/utils/client.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"client.d.cts","names":[],"sources":["../../src/utils/client.ts"],"mappings":";wBAqBgB,sBAAsB"}
|
package/dist/utils/client.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/utils/client.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/utils/client.ts"],"mappings":";wBAqBgB,sBAAsB"}
|
package/dist/utils/misc.d.cts
CHANGED
|
@@ -2,7 +2,6 @@ import "../types.cjs";
|
|
|
2
2
|
import { OpenAI } from "openai";
|
|
3
3
|
import { BaseMessage, ContentBlock } from "@langchain/core/messages";
|
|
4
4
|
//#region src/utils/misc.d.ts
|
|
5
|
-
declare function messageToOpenAIRole(message: BaseMessage): OpenAI.ChatCompletionRole;
|
|
5
|
+
export declare function messageToOpenAIRole(message: BaseMessage): OpenAI.ChatCompletionRole;
|
|
6
6
|
//#endregion
|
|
7
|
-
export { messageToOpenAIRole };
|
|
8
7
|
//# sourceMappingURL=misc.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.cts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"misc.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/misc.ts"],"mappings":";;;;wBA0KgB,oBACd,SAAS,cACRA,OAAa"}
|
package/dist/utils/misc.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ import "../types.js";
|
|
|
2
2
|
import { OpenAI } from "openai";
|
|
3
3
|
import { BaseMessage, ChatMessage, ContentBlock } from "@langchain/core/messages";
|
|
4
4
|
//#region src/utils/misc.d.ts
|
|
5
|
-
declare function messageToOpenAIRole(message: BaseMessage): OpenAI.ChatCompletionRole;
|
|
5
|
+
export declare function messageToOpenAIRole(message: BaseMessage): OpenAI.ChatCompletionRole;
|
|
6
6
|
//#endregion
|
|
7
|
-
export { messageToOpenAIRole };
|
|
8
7
|
//# sourceMappingURL=misc.d.ts.map
|
package/dist/utils/misc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.ts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"misc.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/misc.ts"],"mappings":";;;;wBA0KgB,oBACd,SAAS,cACRA,OAAa"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/utils/profile.ts
|
|
2
|
+
/**
|
|
3
|
+
* Narrows the static profile, which describes the Responses API, to what the
|
|
4
|
+
* API a model calls can send.
|
|
5
|
+
*
|
|
6
|
+
* - `fileMimeTypes` is reported for every model by default, so it is stripped
|
|
7
|
+
* back out when not applicable. `pdfInputs` stands in for `input_file`
|
|
8
|
+
* support, since PDFs go through the same input.
|
|
9
|
+
* - `midConversationTools` is turned off on Chat Completions, since only the
|
|
10
|
+
* Responses API carries an `additional_tools` input item.
|
|
11
|
+
*/
|
|
12
|
+
function profileForApi(profile, usesResponsesApi) {
|
|
13
|
+
let result = profile;
|
|
14
|
+
if (!usesResponsesApi || !profile.pdfInputs) {
|
|
15
|
+
const { fileMimeTypes: _fileMimeTypes, ...rest } = result;
|
|
16
|
+
result = rest;
|
|
17
|
+
}
|
|
18
|
+
if (!usesResponsesApi && result.midConversationTools) result = {
|
|
19
|
+
...result,
|
|
20
|
+
midConversationTools: false
|
|
21
|
+
};
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
exports.profileForApi = profileForApi;
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=profile.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.cjs","names":[],"sources":["../../src/utils/profile.ts"],"sourcesContent":["import type { ModelProfile } from \"@langchain/core/language_models/profile\";\n\n/**\n * Narrows the static profile, which describes the Responses API, to what the\n * API a model calls can send.\n *\n * - `fileMimeTypes` is reported for every model by default, so it is stripped\n * back out when not applicable. `pdfInputs` stands in for `input_file`\n * support, since PDFs go through the same input.\n * - `midConversationTools` is turned off on Chat Completions, since only the\n * Responses API carries an `additional_tools` input item.\n */\nexport function profileForApi(\n profile: ModelProfile,\n usesResponsesApi: boolean\n): ModelProfile {\n let result = profile;\n if (!usesResponsesApi || !profile.pdfInputs) {\n const { fileMimeTypes: _fileMimeTypes, ...rest } = result;\n result = rest;\n }\n if (!usesResponsesApi && result.midConversationTools) {\n result = { ...result, midConversationTools: false };\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,cACd,SACA,kBACc;CACd,IAAI,SAAS;CACb,IAAI,CAAC,oBAAoB,CAAC,QAAQ,WAAW;EAC3C,MAAM,EAAE,eAAe,gBAAgB,GAAG,SAAS;EACnD,SAAS;CACX;CACA,IAAI,CAAC,oBAAoB,OAAO,sBAC9B,SAAS;EAAE,GAAG;EAAQ,sBAAsB;CAAM;CAEpD,OAAO;AACT"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/utils/profile.ts
|
|
2
|
+
/**
|
|
3
|
+
* Narrows the static profile, which describes the Responses API, to what the
|
|
4
|
+
* API a model calls can send.
|
|
5
|
+
*
|
|
6
|
+
* - `fileMimeTypes` is reported for every model by default, so it is stripped
|
|
7
|
+
* back out when not applicable. `pdfInputs` stands in for `input_file`
|
|
8
|
+
* support, since PDFs go through the same input.
|
|
9
|
+
* - `midConversationTools` is turned off on Chat Completions, since only the
|
|
10
|
+
* Responses API carries an `additional_tools` input item.
|
|
11
|
+
*/
|
|
12
|
+
function profileForApi(profile, usesResponsesApi) {
|
|
13
|
+
let result = profile;
|
|
14
|
+
if (!usesResponsesApi || !profile.pdfInputs) {
|
|
15
|
+
const { fileMimeTypes: _fileMimeTypes, ...rest } = result;
|
|
16
|
+
result = rest;
|
|
17
|
+
}
|
|
18
|
+
if (!usesResponsesApi && result.midConversationTools) result = {
|
|
19
|
+
...result,
|
|
20
|
+
midConversationTools: false
|
|
21
|
+
};
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { profileForApi };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","names":[],"sources":["../../src/utils/profile.ts"],"sourcesContent":["import type { ModelProfile } from \"@langchain/core/language_models/profile\";\n\n/**\n * Narrows the static profile, which describes the Responses API, to what the\n * API a model calls can send.\n *\n * - `fileMimeTypes` is reported for every model by default, so it is stripped\n * back out when not applicable. `pdfInputs` stands in for `input_file`\n * support, since PDFs go through the same input.\n * - `midConversationTools` is turned off on Chat Completions, since only the\n * Responses API carries an `additional_tools` input item.\n */\nexport function profileForApi(\n profile: ModelProfile,\n usesResponsesApi: boolean\n): ModelProfile {\n let result = profile;\n if (!usesResponsesApi || !profile.pdfInputs) {\n const { fileMimeTypes: _fileMimeTypes, ...rest } = result;\n result = rest;\n }\n if (!usesResponsesApi && result.midConversationTools) {\n result = { ...result, midConversationTools: false };\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,cACd,SACA,kBACc;CACd,IAAI,SAAS;CACb,IAAI,CAAC,oBAAoB,CAAC,QAAQ,WAAW;EAC3C,MAAM,EAAE,eAAe,gBAAgB,GAAG,SAAS;EACnD,SAAS;CACX;CACA,IAAI,CAAC,oBAAoB,OAAO,sBAC9B,SAAS;EAAE,GAAG;EAAQ,sBAAsB;CAAM;CAEpD,OAAO;AACT"}
|
package/dist/utils/prompts.d.cts
CHANGED
|
@@ -32,9 +32,8 @@ import { BasePromptValue } from "@langchain/core/prompt_values";
|
|
|
32
32
|
* @param formattedPrompt
|
|
33
33
|
* @returns A partial OpenAI payload.
|
|
34
34
|
*/
|
|
35
|
-
declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {
|
|
35
|
+
export declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {
|
|
36
36
|
messages: OpenAI.Chat.ChatCompletionMessageParam[];
|
|
37
37
|
};
|
|
38
38
|
//#endregion
|
|
39
|
-
export { convertPromptToOpenAI };
|
|
40
39
|
//# sourceMappingURL=prompts.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.cts","names":[],"sources":["../../src/utils/prompts.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"prompts.d.cts","names":[],"sources":["../../src/utils/prompts.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAoCgB,sBAAsB,iBAAiB;EACrD,UAAU,OAAO,KAAK"}
|
package/dist/utils/prompts.d.ts
CHANGED
|
@@ -32,9 +32,8 @@ import { BasePromptValue } from "@langchain/core/prompt_values";
|
|
|
32
32
|
* @param formattedPrompt
|
|
33
33
|
* @returns A partial OpenAI payload.
|
|
34
34
|
*/
|
|
35
|
-
declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {
|
|
35
|
+
export declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {
|
|
36
36
|
messages: OpenAI.Chat.ChatCompletionMessageParam[];
|
|
37
37
|
};
|
|
38
38
|
//#endregion
|
|
39
|
-
export { convertPromptToOpenAI };
|
|
40
39
|
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","names":[],"sources":["../../src/utils/prompts.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","names":[],"sources":["../../src/utils/prompts.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAoCgB,sBAAsB,iBAAiB;EACrD,UAAU,OAAO,KAAK"}
|
|
@@ -127,30 +127,24 @@ async function* convertOpenAIResponsesStream(source, options = {}) {
|
|
|
127
127
|
index: event.output_index,
|
|
128
128
|
...isCustom ? { isCustomTool: true } : {}
|
|
129
129
|
});
|
|
130
|
-
if (isNew)
|
|
131
|
-
event: "content-block-start",
|
|
132
|
-
index,
|
|
133
|
-
content: {
|
|
134
|
-
type: "tool_call_chunk",
|
|
135
|
-
id: event.item.call_id,
|
|
136
|
-
name: event.item.name,
|
|
137
|
-
args: initialArgs,
|
|
138
|
-
index: event.output_index
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
if (initialArgs) {
|
|
142
|
-
const acc = blockAccumulators.get(index);
|
|
130
|
+
if (isNew) {
|
|
143
131
|
yield {
|
|
132
|
+
event: "content-block-start",
|
|
133
|
+
index,
|
|
134
|
+
content: {
|
|
135
|
+
type: "tool_call_chunk",
|
|
136
|
+
id: event.item.call_id,
|
|
137
|
+
name: event.item.name,
|
|
138
|
+
args: "",
|
|
139
|
+
index: event.output_index
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
if (initialArgs) yield {
|
|
144
143
|
event: "content-block-delta",
|
|
145
144
|
index,
|
|
146
145
|
delta: {
|
|
147
|
-
type: "
|
|
148
|
-
|
|
149
|
-
type: "tool_call_chunk",
|
|
150
|
-
...acc.id != null ? { id: acc.id } : {},
|
|
151
|
-
...acc.name != null ? { name: acc.name } : {},
|
|
152
|
-
args: acc.args
|
|
153
|
-
}
|
|
146
|
+
type: "tool-call-delta",
|
|
147
|
+
args: initialArgs
|
|
154
148
|
}
|
|
155
149
|
};
|
|
156
150
|
}
|
|
@@ -173,21 +167,18 @@ async function* convertOpenAIResponsesStream(source, options = {}) {
|
|
|
173
167
|
index: event.output_index
|
|
174
168
|
}
|
|
175
169
|
};
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
...acc.id != null ? { id: acc.id } : {},
|
|
186
|
-
...acc.name != null ? { name: acc.name } : {},
|
|
187
|
-
args: acc.args
|
|
170
|
+
if (event.delta) {
|
|
171
|
+
const acc = blockAccumulators.get(index);
|
|
172
|
+
acc.args = (acc.args ?? "") + event.delta;
|
|
173
|
+
yield {
|
|
174
|
+
event: "content-block-delta",
|
|
175
|
+
index,
|
|
176
|
+
delta: {
|
|
177
|
+
type: "tool-call-delta",
|
|
178
|
+
args: event.delta
|
|
188
179
|
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
191
182
|
continue;
|
|
192
183
|
}
|
|
193
184
|
if (event.type === "response.output_item.done" && (event.item.type === "function_call" || event.item.type === "custom_tool_call")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses_stream_events.cjs","names":["finalizeContentBlock","convertResponsesUsageToUsageMetadata"],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (initialArgs) {\n const acc = blockAccumulators.get(index)!;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(acc.id != null ? { id: acc.id } : {}),\n ...(acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(acc.id != null ? { id: acc.id } : {}),\n ...(acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses_stream_events.cjs","names":["finalizeContentBlock","convertResponsesUsageToUsageMetadata"],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n // The initial args go out once, as the call's first slice.\n if (initialArgs) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: initialArgs },\n };\n }\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (event.delta) {\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: event.delta },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { OpenAI } from "openai";
|
|
2
2
|
import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
|
|
3
3
|
//#region src/utils/responses_stream_events.d.ts
|
|
4
|
-
interface ConvertOpenAIResponsesStreamOptions {
|
|
4
|
+
export interface ConvertOpenAIResponsesStreamOptions {
|
|
5
5
|
streamUsage?: boolean;
|
|
6
6
|
provider?: string;
|
|
7
7
|
}
|
|
8
8
|
type RawEvent = OpenAI.Responses.ResponseStreamEvent;
|
|
9
|
-
declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
|
|
9
|
+
export declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
|
|
10
10
|
//#endregion
|
|
11
|
-
export { ConvertOpenAIResponsesStreamOptions, convertOpenAIResponsesStream };
|
|
12
11
|
//# sourceMappingURL=responses_stream_events.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses_stream_events.d.cts","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"responses_stream_events.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;iBAeiB;EACf;EACA;;KAGG,WAAWA,OAAa,UAAU;wBAMhB,6BACrB,QAAQ,cAAc,WACtB,UAAS,sCACR,eAAe"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { OpenAI } from "openai";
|
|
2
2
|
import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
|
|
3
3
|
//#region src/utils/responses_stream_events.d.ts
|
|
4
|
-
interface ConvertOpenAIResponsesStreamOptions {
|
|
4
|
+
export interface ConvertOpenAIResponsesStreamOptions {
|
|
5
5
|
streamUsage?: boolean;
|
|
6
6
|
provider?: string;
|
|
7
7
|
}
|
|
8
8
|
type RawEvent = OpenAI.Responses.ResponseStreamEvent;
|
|
9
|
-
declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
|
|
9
|
+
export declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
|
|
10
10
|
//#endregion
|
|
11
|
-
export { ConvertOpenAIResponsesStreamOptions, convertOpenAIResponsesStream };
|
|
12
11
|
//# sourceMappingURL=responses_stream_events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses_stream_events.d.ts","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"responses_stream_events.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;iBAeiB;EACf;EACA;;KAGG,WAAWA,OAAa,UAAU;wBAMhB,6BACrB,QAAQ,cAAc,WACtB,UAAS,sCACR,eAAe"}
|
|
@@ -127,30 +127,24 @@ async function* convertOpenAIResponsesStream(source, options = {}) {
|
|
|
127
127
|
index: event.output_index,
|
|
128
128
|
...isCustom ? { isCustomTool: true } : {}
|
|
129
129
|
});
|
|
130
|
-
if (isNew)
|
|
131
|
-
event: "content-block-start",
|
|
132
|
-
index,
|
|
133
|
-
content: {
|
|
134
|
-
type: "tool_call_chunk",
|
|
135
|
-
id: event.item.call_id,
|
|
136
|
-
name: event.item.name,
|
|
137
|
-
args: initialArgs,
|
|
138
|
-
index: event.output_index
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
if (initialArgs) {
|
|
142
|
-
const acc = blockAccumulators.get(index);
|
|
130
|
+
if (isNew) {
|
|
143
131
|
yield {
|
|
132
|
+
event: "content-block-start",
|
|
133
|
+
index,
|
|
134
|
+
content: {
|
|
135
|
+
type: "tool_call_chunk",
|
|
136
|
+
id: event.item.call_id,
|
|
137
|
+
name: event.item.name,
|
|
138
|
+
args: "",
|
|
139
|
+
index: event.output_index
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
if (initialArgs) yield {
|
|
144
143
|
event: "content-block-delta",
|
|
145
144
|
index,
|
|
146
145
|
delta: {
|
|
147
|
-
type: "
|
|
148
|
-
|
|
149
|
-
type: "tool_call_chunk",
|
|
150
|
-
...acc.id != null ? { id: acc.id } : {},
|
|
151
|
-
...acc.name != null ? { name: acc.name } : {},
|
|
152
|
-
args: acc.args
|
|
153
|
-
}
|
|
146
|
+
type: "tool-call-delta",
|
|
147
|
+
args: initialArgs
|
|
154
148
|
}
|
|
155
149
|
};
|
|
156
150
|
}
|
|
@@ -173,21 +167,18 @@ async function* convertOpenAIResponsesStream(source, options = {}) {
|
|
|
173
167
|
index: event.output_index
|
|
174
168
|
}
|
|
175
169
|
};
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
...acc.id != null ? { id: acc.id } : {},
|
|
186
|
-
...acc.name != null ? { name: acc.name } : {},
|
|
187
|
-
args: acc.args
|
|
170
|
+
if (event.delta) {
|
|
171
|
+
const acc = blockAccumulators.get(index);
|
|
172
|
+
acc.args = (acc.args ?? "") + event.delta;
|
|
173
|
+
yield {
|
|
174
|
+
event: "content-block-delta",
|
|
175
|
+
index,
|
|
176
|
+
delta: {
|
|
177
|
+
type: "tool-call-delta",
|
|
178
|
+
args: event.delta
|
|
188
179
|
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
191
182
|
continue;
|
|
192
183
|
}
|
|
193
184
|
if (event.type === "response.output_item.done" && (event.item.type === "function_call" || event.item.type === "custom_tool_call")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses_stream_events.js","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (initialArgs) {\n const acc = blockAccumulators.get(index)!;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(acc.id != null ? { id: acc.id } : {}),\n ...(acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(acc.id != null ? { id: acc.id } : {}),\n ...(acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses_stream_events.js","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n // The initial args go out once, as the call's first slice.\n if (initialArgs) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: initialArgs },\n };\n }\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (event.delta) {\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"tool-call-delta\" as const, args: event.delta },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":"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"}
|
package/dist/utils/tools.d.cts
CHANGED
|
@@ -4,10 +4,9 @@ import { BindToolsInput } from "@langchain/core/language_models/chat_models";
|
|
|
4
4
|
import { DynamicTool } from "@langchain/core/tools";
|
|
5
5
|
import "@langchain/core/messages/tool";
|
|
6
6
|
//#region src/utils/tools.d.ts
|
|
7
|
-
type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string;
|
|
8
|
-
type ResponsesToolChoice = NonNullable<OpenAI.Responses.ResponseCreateParams["tool_choice"]>;
|
|
9
|
-
type ChatOpenAIToolType = BindToolsInput | OpenAI.Chat.ChatCompletionTool | ResponsesTool;
|
|
10
|
-
type ResponsesTool = NonNullable<OpenAI.Responses.ResponseCreateParams["tools"]>[number];
|
|
7
|
+
export type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string;
|
|
8
|
+
export type ResponsesToolChoice = NonNullable<OpenAI.Responses.ResponseCreateParams["tool_choice"]>;
|
|
9
|
+
export type ChatOpenAIToolType = BindToolsInput | OpenAI.Chat.ChatCompletionTool | ResponsesTool;
|
|
10
|
+
export type ResponsesTool = NonNullable<OpenAI.Responses.ResponseCreateParams["tools"]>[number];
|
|
11
11
|
//#endregion
|
|
12
|
-
export { ChatOpenAIToolType, OpenAIToolChoice, ResponsesTool, ResponsesToolChoice };
|
|
13
12
|
//# sourceMappingURL=tools.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.cts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"tools.d.cts","names":["OpenAIClient"],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;YAiMY,mBACRA,OAAa;YAIL,sBAAsB,YAChCA,OAAa,UAAU;YAGb,qBACR,iBACAA,OAAa,KAAK,qBAClB;YAEQ,gBAAgB,YAC1BA,OAAa,UAAU"}
|
package/dist/utils/tools.d.ts
CHANGED
|
@@ -4,10 +4,9 @@ import "@langchain/core/language_models/base";
|
|
|
4
4
|
import { DynamicTool } from "@langchain/core/tools";
|
|
5
5
|
import "@langchain/core/messages/tool";
|
|
6
6
|
//#region src/utils/tools.d.ts
|
|
7
|
-
type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string;
|
|
8
|
-
type ResponsesToolChoice = NonNullable<OpenAI.Responses.ResponseCreateParams["tool_choice"]>;
|
|
9
|
-
type ChatOpenAIToolType = BindToolsInput | OpenAI.Chat.ChatCompletionTool | ResponsesTool;
|
|
10
|
-
type ResponsesTool = NonNullable<OpenAI.Responses.ResponseCreateParams["tools"]>[number];
|
|
7
|
+
export type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string;
|
|
8
|
+
export type ResponsesToolChoice = NonNullable<OpenAI.Responses.ResponseCreateParams["tool_choice"]>;
|
|
9
|
+
export type ChatOpenAIToolType = BindToolsInput | OpenAI.Chat.ChatCompletionTool | ResponsesTool;
|
|
10
|
+
export type ResponsesTool = NonNullable<OpenAI.Responses.ResponseCreateParams["tools"]>[number];
|
|
11
11
|
//#endregion
|
|
12
|
-
export { ChatOpenAIToolType, OpenAIToolChoice, ResponsesTool, ResponsesToolChoice };
|
|
13
12
|
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","names":["OpenAIClient"],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;YAiMY,mBACRA,OAAa;YAIL,sBAAsB,YAChCA,OAAa,UAAU;YAGb,qBACR,iBACAA,OAAa,KAAK,qBAClB;YAEQ,gBAAgB,YAC1BA,OAAa,UAAU"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "OpenAI integrations for LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,27 +15,27 @@
|
|
|
15
15
|
"homepage": "https://github.com/langchain-ai/langchainjs/tree/main/libs/providers/langchain-openai/",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"js-tiktoken": "^1.0.12",
|
|
18
|
-
"openai": "^7.
|
|
18
|
+
"openai": "^7.23.0",
|
|
19
19
|
"zod": "^3.25.76 || ^4"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@langchain/core": "^1.
|
|
22
|
+
"@langchain/core": "^1.3.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@azure/identity": "^4.13.
|
|
25
|
+
"@azure/identity": "^4.13.3",
|
|
26
26
|
"@cfworker/json-schema": "^4.1.1",
|
|
27
27
|
"@tsconfig/recommended": "^1.0.10",
|
|
28
|
-
"@types/node": "^26.
|
|
29
|
-
"@vitest/coverage-v8": "^
|
|
28
|
+
"@types/node": "^26.6.3",
|
|
29
|
+
"@vitest/coverage-v8": "^5.0.2",
|
|
30
30
|
"dotenv": "^17.4.2",
|
|
31
31
|
"dpdm": "^4.3.0",
|
|
32
32
|
"rimraf": "^6.1.3",
|
|
33
33
|
"typescript": "~7.0.2",
|
|
34
|
-
"vitest": "^
|
|
34
|
+
"vitest": "^5.0.2",
|
|
35
35
|
"zod-to-json-schema": "^3.25.2",
|
|
36
|
-
"@langchain/
|
|
36
|
+
"@langchain/core": "^1.3.0",
|
|
37
37
|
"@langchain/standard-tests": "0.0.23",
|
|
38
|
-
"@langchain/
|
|
38
|
+
"@langchain/tsconfig": "0.0.1"
|
|
39
39
|
},
|
|
40
40
|
"publishConfig": {
|
|
41
41
|
"access": "public"
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/utils/file_mime_types.ts
|
|
2
|
-
/**
|
|
3
|
-
* The static profile now reports `fileMimeTypes` for every model by default,
|
|
4
|
-
* so this strips it back out when not applicable. `pdfInputs` stands in for
|
|
5
|
-
* `input_file` support, since PDFs go through the same input.
|
|
6
|
-
*/
|
|
7
|
-
function withoutFileMimeTypesUnlessSupported(profile, usesResponsesApi) {
|
|
8
|
-
if (usesResponsesApi && profile.pdfInputs) return profile;
|
|
9
|
-
const { fileMimeTypes: _fileMimeTypes, ...rest } = profile;
|
|
10
|
-
return rest;
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
exports.withoutFileMimeTypesUnlessSupported = withoutFileMimeTypesUnlessSupported;
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=file_mime_types.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file_mime_types.cjs","names":[],"sources":["../../src/utils/file_mime_types.ts"],"sourcesContent":["import type { ModelProfile } from \"@langchain/core/language_models/profile\";\n\n/**\n * The static profile now reports `fileMimeTypes` for every model by default,\n * so this strips it back out when not applicable. `pdfInputs` stands in for\n * `input_file` support, since PDFs go through the same input.\n */\nexport function withoutFileMimeTypesUnlessSupported(\n profile: ModelProfile,\n usesResponsesApi: boolean\n): ModelProfile {\n if (usesResponsesApi && profile.pdfInputs) return profile;\n const { fileMimeTypes: _fileMimeTypes, ...rest } = profile;\n return rest;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,oCACd,SACA,kBACc;CACd,IAAI,oBAAoB,QAAQ,WAAW,OAAO;CAClD,MAAM,EAAE,eAAe,gBAAgB,GAAG,SAAS;CACnD,OAAO;AACT"}
|