@langchain/openai 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/azure/chat_models/completions.d.cts +1 -1
- package/dist/azure/chat_models/index.cjs +1 -1
- package/dist/azure/chat_models/index.d.cts +2 -2
- package/dist/azure/chat_models/index.js +1 -1
- package/dist/azure/chat_models/responses.cjs +1 -1
- package/dist/azure/chat_models/responses.d.cts +1 -1
- package/dist/azure/chat_models/responses.js +1 -1
- package/dist/azure/embeddings.cjs +1 -1
- package/dist/azure/embeddings.js +1 -1
- package/dist/chat_models/base.cjs +24 -3
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.d.cts +20 -1
- package/dist/chat_models/base.d.cts.map +1 -1
- package/dist/chat_models/base.d.ts +23 -4
- package/dist/chat_models/base.d.ts.map +1 -1
- package/dist/chat_models/base.js +24 -3
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/completions.cjs +36 -106
- package/dist/chat_models/completions.cjs.map +1 -1
- package/dist/chat_models/completions.d.cts +18 -7
- package/dist/chat_models/completions.d.cts.map +1 -1
- package/dist/chat_models/completions.d.ts +17 -6
- package/dist/chat_models/completions.d.ts.map +1 -1
- package/dist/chat_models/completions.js +37 -107
- package/dist/chat_models/completions.js.map +1 -1
- package/dist/chat_models/index.cjs +1 -1
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +3 -3
- package/dist/chat_models/index.d.ts +4 -4
- package/dist/chat_models/index.js +1 -1
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/profiles.cjs +567 -0
- package/dist/chat_models/profiles.cjs.map +1 -0
- package/dist/chat_models/profiles.js +566 -0
- package/dist/chat_models/profiles.js.map +1 -0
- package/dist/chat_models/responses.cjs +14 -375
- package/dist/chat_models/responses.cjs.map +1 -1
- package/dist/chat_models/responses.d.cts +2 -17
- package/dist/chat_models/responses.d.cts.map +1 -1
- package/dist/chat_models/responses.d.ts +1 -16
- package/dist/chat_models/responses.d.ts.map +1 -1
- package/dist/chat_models/responses.js +15 -376
- package/dist/chat_models/responses.js.map +1 -1
- package/dist/converters/completions.cjs +605 -0
- package/dist/converters/completions.cjs.map +1 -0
- package/dist/converters/completions.d.cts +319 -0
- package/dist/converters/completions.d.cts.map +1 -0
- package/dist/converters/completions.d.ts +319 -0
- package/dist/converters/completions.d.ts.map +1 -0
- package/dist/converters/completions.js +599 -0
- package/dist/converters/completions.js.map +1 -0
- package/dist/converters/index.cjs +2 -0
- package/dist/converters/index.js +2 -0
- package/dist/converters/responses.cjs +895 -0
- package/dist/converters/responses.cjs.map +1 -0
- package/dist/converters/responses.d.cts +310 -0
- package/dist/converters/responses.d.cts.map +1 -0
- package/dist/converters/responses.d.ts +310 -0
- package/dist/converters/responses.d.ts.map +1 -0
- package/dist/converters/responses.js +889 -0
- package/dist/converters/responses.js.map +1 -0
- package/dist/embeddings.cjs +1 -1
- package/dist/embeddings.js +1 -1
- package/dist/index.cjs +24 -11
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +7 -5
- package/dist/llms.cjs +2 -2
- package/dist/llms.d.cts +1 -1
- package/dist/llms.js +2 -2
- package/dist/types.d.cts +2 -2
- package/dist/types.d.ts +2 -2
- package/dist/utils/errors.cjs +1 -1
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/misc.js +2 -2
- package/dist/utils/misc.js.map +1 -1
- package/dist/utils/output.cjs +0 -12
- package/dist/utils/output.cjs.map +1 -1
- package/dist/utils/output.js +1 -12
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/prompts.cjs +2 -2
- package/dist/utils/prompts.cjs.map +1 -1
- package/dist/utils/prompts.d.cts +1 -0
- package/dist/utils/prompts.d.cts.map +1 -1
- package/dist/utils/prompts.d.ts +1 -0
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +2 -2
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/tools.cjs +1 -1
- package/dist/utils/tools.js +1 -1
- package/package.json +9 -6
- 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
package/dist/utils/prompts.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_completions = require('../converters/completions.cjs');
|
|
2
2
|
|
|
3
3
|
//#region src/utils/prompts.ts
|
|
4
4
|
/**
|
|
@@ -34,7 +34,7 @@ const require_message_inputs = require('./message_inputs.cjs');
|
|
|
34
34
|
*/
|
|
35
35
|
function convertPromptToOpenAI(formattedPrompt) {
|
|
36
36
|
const messages = formattedPrompt.toChatMessages();
|
|
37
|
-
return { messages:
|
|
37
|
+
return { messages: require_completions.convertMessagesToCompletionsMessageParams({ messages }) };
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.cjs","names":["formattedPrompt: BasePromptValue","
|
|
1
|
+
{"version":3,"file":"prompts.cjs","names":["formattedPrompt: BasePromptValue","convertMessagesToCompletionsMessageParams"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\nimport { convertMessagesToCompletionsMessageParams } from \"../converters/completions.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n} {\n const messages = formattedPrompt.toChatMessages();\n return {\n messages: convertMessagesToCompletionsMessageParams({\n messages,\n }) as OpenAI.Chat.ChatCompletionMessageParam[],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,sBAAsBA,iBAEpC;CACA,MAAM,WAAW,gBAAgB,gBAAgB;AACjD,QAAO,EACL,UAAUC,8DAA0C,EAClD,SACD,EAAC,CACH;AACF"}
|
package/dist/utils/prompts.d.cts
CHANGED
|
@@ -34,6 +34,7 @@ import { BasePromptValue } from "@langchain/core/prompt_values";
|
|
|
34
34
|
* @param formattedPrompt
|
|
35
35
|
* @returns A partial OpenAI payload.
|
|
36
36
|
*/
|
|
37
|
+
// TODO: make this a converter
|
|
37
38
|
declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {
|
|
38
39
|
messages: OpenAI$1.Chat.ChatCompletionMessageParam[];
|
|
39
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.cts","names":["BasePromptValue","OpenAI","convertPromptToOpenAI","Chat","ChatCompletionMessageParam"],"sources":["../../src/utils/prompts.d.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\nexport declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n};\n"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"prompts.d.cts","names":["BasePromptValue","OpenAI","convertPromptToOpenAI","Chat","ChatCompletionMessageParam"],"sources":["../../src/utils/prompts.d.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n};\n"],"mappings":";;;;;;;AAkCA;;;;AACoD;;;;;;;;;;;;;;;;;;;;;;;;;;iBAD5BE,qBAAAA,kBAAuCF;YACjDC,QAAAA,CAAOE,IAAAA,CAAKC"}
|
package/dist/utils/prompts.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ import { BasePromptValue } from "@langchain/core/prompt_values";
|
|
|
34
34
|
* @param formattedPrompt
|
|
35
35
|
* @returns A partial OpenAI payload.
|
|
36
36
|
*/
|
|
37
|
+
// TODO: make this a converter
|
|
37
38
|
declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {
|
|
38
39
|
messages: OpenAI$1.Chat.ChatCompletionMessageParam[];
|
|
39
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","names":["BasePromptValue","OpenAI","convertPromptToOpenAI","Chat","ChatCompletionMessageParam"],"sources":["../../src/utils/prompts.d.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\nexport declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n};\n"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","names":["BasePromptValue","OpenAI","convertPromptToOpenAI","Chat","ChatCompletionMessageParam"],"sources":["../../src/utils/prompts.d.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n};\n"],"mappings":";;;;;;;AAkCA;;;;AACoD;;;;;;;;;;;;;;;;;;;;;;;;;;iBAD5BE,qBAAAA,kBAAuCF;YACjDC,QAAAA,CAAOE,IAAAA,CAAKC"}
|
package/dist/utils/prompts.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { convertMessagesToCompletionsMessageParams } from "../converters/completions.js";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/prompts.ts
|
|
4
4
|
/**
|
|
@@ -34,7 +34,7 @@ import { _convertMessagesToOpenAIParams } from "./message_inputs.js";
|
|
|
34
34
|
*/
|
|
35
35
|
function convertPromptToOpenAI(formattedPrompt) {
|
|
36
36
|
const messages = formattedPrompt.toChatMessages();
|
|
37
|
-
return { messages:
|
|
37
|
+
return { messages: convertMessagesToCompletionsMessageParams({ messages }) };
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","names":["formattedPrompt: BasePromptValue"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\
|
|
1
|
+
{"version":3,"file":"prompts.js","names":["formattedPrompt: BasePromptValue"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\nimport { convertMessagesToCompletionsMessageParams } from \"../converters/completions.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n} {\n const messages = formattedPrompt.toChatMessages();\n return {\n messages: convertMessagesToCompletionsMessageParams({\n messages,\n }) as OpenAI.Chat.ChatCompletionMessageParam[],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,sBAAsBA,iBAEpC;CACA,MAAM,WAAW,gBAAgB,gBAAgB;AACjD,QAAO,EACL,UAAU,0CAA0C,EAClD,SACD,EAAC,CACH;AACF"}
|
package/dist/utils/tools.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const __langchain_core_utils_function_calling = require_rolldown_runtime.__toESM(require("@langchain/core/utils/function_calling"));
|
|
2
3
|
const __langchain_core_utils_types = require_rolldown_runtime.__toESM(require("@langchain/core/utils/types"));
|
|
3
4
|
const __langchain_core_utils_json_schema = require_rolldown_runtime.__toESM(require("@langchain/core/utils/json_schema"));
|
|
4
|
-
const __langchain_core_utils_function_calling = require_rolldown_runtime.__toESM(require("@langchain/core/utils/function_calling"));
|
|
5
5
|
|
|
6
6
|
//#region src/utils/tools.ts
|
|
7
7
|
/**
|
package/dist/utils/tools.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { convertToOpenAITool, isLangChainTool } from "@langchain/core/utils/function_calling";
|
|
1
2
|
import { isInteropZodSchema } from "@langchain/core/utils/types";
|
|
2
3
|
import { toJsonSchema } from "@langchain/core/utils/json_schema";
|
|
3
|
-
import { convertToOpenAITool, isLangChainTool } from "@langchain/core/utils/function_calling";
|
|
4
4
|
|
|
5
5
|
//#region src/utils/tools.ts
|
|
6
6
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "OpenAI integrations for LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,7 +15,7 @@
|
|
|
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": "^6.
|
|
18
|
+
"openai": "^6.9.0",
|
|
19
19
|
"zod": "^3.25.76 || ^4"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"vitest": "^3.2.4",
|
|
37
37
|
"zod-to-json-schema": "^3.24.6",
|
|
38
38
|
"@langchain/eslint": "0.1.0",
|
|
39
|
-
"@langchain/standard-tests": "0.0.
|
|
40
|
-
"@langchain/core": "1.0.
|
|
39
|
+
"@langchain/standard-tests": "0.0.1",
|
|
40
|
+
"@langchain/core": "1.0.5"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"access": "public"
|
|
@@ -79,7 +79,8 @@
|
|
|
79
79
|
"LICENSE"
|
|
80
80
|
],
|
|
81
81
|
"scripts": {
|
|
82
|
-
"build": "
|
|
82
|
+
"build": "turbo build:compile --filter @langchain/openai",
|
|
83
|
+
"build:compile": "pnpm --filter @langchain/build compile @langchain/openai",
|
|
83
84
|
"lint:eslint": "eslint --cache src/",
|
|
84
85
|
"lint:dpdm": "dpdm --skip-dynamic-imports circular --exit-code circular:1 --no-warning --no-tree src/*.ts src/**/*.ts",
|
|
85
86
|
"lint": "pnpm lint:eslint && pnpm lint:dpdm",
|
|
@@ -92,6 +93,8 @@
|
|
|
92
93
|
"test:standard:int": "vitest run --mode standard-int",
|
|
93
94
|
"test:standard": "pnpm test:standard:unit && pnpm test:standard:int",
|
|
94
95
|
"format": "prettier --config .prettierrc --write \"src\"",
|
|
95
|
-
"format:check": "prettier --config .prettierrc --check \"src\""
|
|
96
|
+
"format:check": "prettier --config .prettierrc --check \"src\"",
|
|
97
|
+
"typegen": "pnpm run typegen:profiles",
|
|
98
|
+
"typegen:profiles": "pnpm --filter @langchain/model-profiles make --config profiles.toml"
|
|
96
99
|
}
|
|
97
100
|
}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
const require_misc = require('./misc.cjs');
|
|
3
|
-
const require_standard = require('./standard.cjs');
|
|
4
|
-
const __langchain_core_output_parsers_openai_tools = require_rolldown_runtime.__toESM(require("@langchain/core/output_parsers/openai_tools"));
|
|
5
|
-
const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
|
|
6
|
-
|
|
7
|
-
//#region src/utils/message_inputs.ts
|
|
8
|
-
const completionsApiContentBlockConverter = {
|
|
9
|
-
providerName: "ChatOpenAI",
|
|
10
|
-
fromStandardTextBlock(block) {
|
|
11
|
-
return {
|
|
12
|
-
type: "text",
|
|
13
|
-
text: block.text
|
|
14
|
-
};
|
|
15
|
-
},
|
|
16
|
-
fromStandardImageBlock(block) {
|
|
17
|
-
if (block.source_type === "url") return {
|
|
18
|
-
type: "image_url",
|
|
19
|
-
image_url: {
|
|
20
|
-
url: block.url,
|
|
21
|
-
...block.metadata?.detail ? { detail: block.metadata.detail } : {}
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
if (block.source_type === "base64") {
|
|
25
|
-
const url = `data:${block.mime_type ?? ""};base64,${block.data}`;
|
|
26
|
-
return {
|
|
27
|
-
type: "image_url",
|
|
28
|
-
image_url: {
|
|
29
|
-
url,
|
|
30
|
-
...block.metadata?.detail ? { detail: block.metadata.detail } : {}
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
throw new Error(`Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`);
|
|
35
|
-
},
|
|
36
|
-
fromStandardAudioBlock(block) {
|
|
37
|
-
if (block.source_type === "url") {
|
|
38
|
-
const data = (0, __langchain_core_messages.parseBase64DataUrl)({ dataUrl: block.url });
|
|
39
|
-
if (!data) throw new Error(`URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`);
|
|
40
|
-
const rawMimeType = data.mime_type || block.mime_type || "";
|
|
41
|
-
let mimeType;
|
|
42
|
-
try {
|
|
43
|
-
mimeType = (0, __langchain_core_messages.parseMimeType)(rawMimeType);
|
|
44
|
-
} catch {
|
|
45
|
-
throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
46
|
-
}
|
|
47
|
-
if (mimeType.type !== "audio" || mimeType.subtype !== "wav" && mimeType.subtype !== "mp3") throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
48
|
-
return {
|
|
49
|
-
type: "input_audio",
|
|
50
|
-
input_audio: {
|
|
51
|
-
format: mimeType.subtype,
|
|
52
|
-
data: data.data
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
if (block.source_type === "base64") {
|
|
57
|
-
let mimeType;
|
|
58
|
-
try {
|
|
59
|
-
mimeType = (0, __langchain_core_messages.parseMimeType)(block.mime_type ?? "");
|
|
60
|
-
} catch {
|
|
61
|
-
throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
62
|
-
}
|
|
63
|
-
if (mimeType.type !== "audio" || mimeType.subtype !== "wav" && mimeType.subtype !== "mp3") throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
64
|
-
return {
|
|
65
|
-
type: "input_audio",
|
|
66
|
-
input_audio: {
|
|
67
|
-
format: mimeType.subtype,
|
|
68
|
-
data: block.data
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
throw new Error(`Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`);
|
|
73
|
-
},
|
|
74
|
-
fromStandardFileBlock(block) {
|
|
75
|
-
if (block.source_type === "url") {
|
|
76
|
-
const data = (0, __langchain_core_messages.parseBase64DataUrl)({ dataUrl: block.url });
|
|
77
|
-
if (!data) throw new Error(`URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`);
|
|
78
|
-
return {
|
|
79
|
-
type: "file",
|
|
80
|
-
file: {
|
|
81
|
-
file_data: block.url,
|
|
82
|
-
...block.metadata?.filename || block.metadata?.name ? { filename: block.metadata?.filename || block.metadata?.name } : {}
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
if (block.source_type === "base64") return {
|
|
87
|
-
type: "file",
|
|
88
|
-
file: {
|
|
89
|
-
file_data: `data:${block.mime_type ?? ""};base64,${block.data}`,
|
|
90
|
-
...block.metadata?.filename || block.metadata?.name || block.metadata?.title ? { filename: block.metadata?.filename || block.metadata?.name || block.metadata?.title } : {}
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
if (block.source_type === "id") return {
|
|
94
|
-
type: "file",
|
|
95
|
-
file: { file_id: block.id }
|
|
96
|
-
};
|
|
97
|
-
throw new Error(`File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
function _convertMessagesToOpenAIParams(messages, model) {
|
|
101
|
-
return messages.flatMap((message) => {
|
|
102
|
-
if ("output_version" in message.response_metadata && message.response_metadata?.output_version === "v1") return require_standard._convertToCompletionsMessageFromV1(message);
|
|
103
|
-
let role = require_misc.messageToOpenAIRole(message);
|
|
104
|
-
if (role === "system" && require_misc.isReasoningModel(model)) role = "developer";
|
|
105
|
-
const content = typeof message.content === "string" ? message.content : message.content.map((m) => {
|
|
106
|
-
if ((0, __langchain_core_messages.isDataContentBlock)(m)) return (0, __langchain_core_messages.convertToProviderContentBlock)(m, completionsApiContentBlockConverter);
|
|
107
|
-
return m;
|
|
108
|
-
});
|
|
109
|
-
const completionParam = {
|
|
110
|
-
role,
|
|
111
|
-
content
|
|
112
|
-
};
|
|
113
|
-
if (message.name != null) completionParam.name = message.name;
|
|
114
|
-
if (message.additional_kwargs.function_call != null) {
|
|
115
|
-
completionParam.function_call = message.additional_kwargs.function_call;
|
|
116
|
-
completionParam.content = "";
|
|
117
|
-
}
|
|
118
|
-
if ((0, __langchain_core_messages.isAIMessage)(message) && !!message.tool_calls?.length) {
|
|
119
|
-
completionParam.tool_calls = message.tool_calls.map(__langchain_core_output_parsers_openai_tools.convertLangChainToolCallToOpenAI);
|
|
120
|
-
completionParam.content = "";
|
|
121
|
-
} else {
|
|
122
|
-
if (message.additional_kwargs.tool_calls != null) completionParam.tool_calls = message.additional_kwargs.tool_calls;
|
|
123
|
-
if (message.tool_call_id != null) completionParam.tool_call_id = message.tool_call_id;
|
|
124
|
-
}
|
|
125
|
-
if (message.additional_kwargs.audio && typeof message.additional_kwargs.audio === "object" && "id" in message.additional_kwargs.audio) {
|
|
126
|
-
const audioMessage = {
|
|
127
|
-
role: "assistant",
|
|
128
|
-
audio: { id: message.additional_kwargs.audio.id }
|
|
129
|
-
};
|
|
130
|
-
return [completionParam, audioMessage];
|
|
131
|
-
}
|
|
132
|
-
return completionParam;
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
//#endregion
|
|
137
|
-
exports._convertMessagesToOpenAIParams = _convertMessagesToOpenAIParams;
|
|
138
|
-
exports.completionsApiContentBlockConverter = completionsApiContentBlockConverter;
|
|
139
|
-
//# sourceMappingURL=message_inputs.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message_inputs.cjs","names":["completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}>","mimeType: { type: string; subtype: string }","messages: BaseMessage[]","model?: string","_convertToCompletionsMessageFromV1","messageToOpenAIRole","isReasoningModel","completionParam: Record<string, any>","convertLangChainToolCallToOpenAI"],"sources":["../../src/utils/message_inputs.ts"],"sourcesContent":["import {\n BaseMessage,\n convertToProviderContentBlock,\n isAIMessage,\n isDataContentBlock,\n parseBase64DataUrl,\n parseMimeType,\n StandardContentBlockConverter,\n ToolMessage,\n} from \"@langchain/core/messages\";\nimport { convertLangChainToolCallToOpenAI } from \"@langchain/core/output_parsers/openai_tools\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from \"openai/resources/chat/completions\";\nimport { _convertToCompletionsMessageFromV1 } from \"./standard.js\";\nimport { isReasoningModel, messageToOpenAIRole } from \"./misc.js\";\n\nexport const completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}> = {\n providerName: \"ChatOpenAI\",\n\n fromStandardTextBlock(block): ChatCompletionContentPartText {\n return { type: \"text\", text: block.text };\n },\n\n fromStandardImageBlock(block): ChatCompletionContentPartImage {\n if (block.source_type === \"url\") {\n return {\n type: \"image_url\",\n image_url: {\n url: block.url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as \"auto\" | \"low\" | \"high\" }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n const url = `data:${block.mime_type ?? \"\"};base64,${block.data}`;\n return {\n type: \"image_url\",\n image_url: {\n url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as \"auto\" | \"low\" | \"high\" }\n : {}),\n },\n };\n }\n\n throw new Error(\n `Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardAudioBlock(block): ChatCompletionContentPartInputAudio {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n const rawMimeType = data.mime_type || block.mime_type || \"\";\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(rawMimeType);\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== \"audio\" ||\n (mimeType.subtype !== \"wav\" && mimeType.subtype !== \"mp3\")\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: \"input_audio\",\n input_audio: {\n format: mimeType.subtype,\n data: data.data,\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(block.mime_type ?? \"\");\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== \"audio\" ||\n (mimeType.subtype !== \"wav\" && mimeType.subtype !== \"mp3\")\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: \"input_audio\",\n input_audio: {\n format: mimeType.subtype,\n data: block.data,\n },\n };\n }\n\n throw new Error(\n `Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardFileBlock(block): ChatCompletionContentPart.File {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n return {\n type: \"file\",\n file: {\n file_data: block.url, // formatted as base64 data URL\n ...(block.metadata?.filename || block.metadata?.name\n ? {\n filename: (block.metadata?.filename ||\n block.metadata?.name) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mime_type ?? \"\"};base64,${block.data}`,\n ...(block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title\n ? {\n filename: (block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"id\") {\n return {\n type: \"file\",\n file: {\n file_id: block.id,\n },\n };\n }\n\n throw new Error(\n `File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n};\n\nexport function _convertMessagesToOpenAIParams(\n messages: BaseMessage[],\n model?: string\n): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {\n return messages.flatMap((message) => {\n if (\n \"output_version\" in message.response_metadata &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return _convertToCompletionsMessageFromV1(message);\n }\n let role = messageToOpenAIRole(message);\n if (role === \"system\" && isReasoningModel(model)) {\n role = \"developer\";\n }\n\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((m) => {\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n return m;\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const completionParam: Record<string, any> = {\n role,\n content,\n };\n if (message.name != null) {\n completionParam.name = message.name;\n }\n if (message.additional_kwargs.function_call != null) {\n completionParam.function_call = message.additional_kwargs.function_call;\n completionParam.content = \"\";\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n completionParam.content = \"\";\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if ((message as ToolMessage).tool_call_id != null) {\n completionParam.tool_call_id = (message as ToolMessage).tool_call_id;\n }\n }\n\n if (\n message.additional_kwargs.audio &&\n typeof message.additional_kwargs.audio === \"object\" &&\n \"id\" in message.additional_kwargs.audio\n ) {\n const audioMessage = {\n role: \"assistant\",\n audio: {\n id: message.additional_kwargs.audio.id,\n },\n };\n return [\n completionParam,\n audioMessage,\n ] as OpenAIClient.Chat.Completions.ChatCompletionMessageParam[];\n }\n\n return completionParam as OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { OpenAI as OpenAI$1 } from "openai";
|
|
2
|
-
import { BaseMessage } from "@langchain/core/messages";
|
|
3
|
-
|
|
4
|
-
//#region src/utils/message_inputs.d.ts
|
|
5
|
-
|
|
6
|
-
declare function _convertMessagesToOpenAIParams(messages: BaseMessage[], model?: string): OpenAI$1.Chat.Completions.ChatCompletionMessageParam[];
|
|
7
|
-
//#endregion
|
|
8
|
-
export { _convertMessagesToOpenAIParams };
|
|
9
|
-
//# sourceMappingURL=message_inputs.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message_inputs.d.cts","names":["BaseMessage","StandardContentBlockConverter","OpenAI","OpenAIClient","ChatCompletionContentPartText","ChatCompletionContentPartImage","ChatCompletionContentPartInputAudio","ChatCompletionContentPart","completionsApiContentBlockConverter","File","_convertMessagesToOpenAIParams","Chat","Completions","ChatCompletionMessageParam"],"sources":["../../src/utils/message_inputs.d.ts"],"sourcesContent":["import { BaseMessage, StandardContentBlockConverter } from \"@langchain/core/messages\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type { ChatCompletionContentPartText, ChatCompletionContentPartImage, ChatCompletionContentPartInputAudio, ChatCompletionContentPart } from \"openai/resources/chat/completions\";\nexport declare const completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}>;\nexport declare function _convertMessagesToOpenAIParams(messages: BaseMessage[], model?: string): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[];\n"],"mappings":";;;;;iBASwBU,8BAAAA,WAAyCV,gCAAgCG,QAAAA,CAAaQ,IAAAA,CAAKC,WAAAA,CAAYC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { OpenAI as OpenAI$1 } from "openai";
|
|
2
|
-
import { BaseMessage } from "@langchain/core/messages";
|
|
3
|
-
|
|
4
|
-
//#region src/utils/message_inputs.d.ts
|
|
5
|
-
|
|
6
|
-
declare function _convertMessagesToOpenAIParams(messages: BaseMessage[], model?: string): OpenAI$1.Chat.Completions.ChatCompletionMessageParam[];
|
|
7
|
-
//#endregion
|
|
8
|
-
export { _convertMessagesToOpenAIParams };
|
|
9
|
-
//# sourceMappingURL=message_inputs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message_inputs.d.ts","names":["BaseMessage","StandardContentBlockConverter","OpenAI","OpenAIClient","ChatCompletionContentPartText","ChatCompletionContentPartImage","ChatCompletionContentPartInputAudio","ChatCompletionContentPart","completionsApiContentBlockConverter","File","_convertMessagesToOpenAIParams","Chat","Completions","ChatCompletionMessageParam"],"sources":["../../src/utils/message_inputs.d.ts"],"sourcesContent":["import { BaseMessage, StandardContentBlockConverter } from \"@langchain/core/messages\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type { ChatCompletionContentPartText, ChatCompletionContentPartImage, ChatCompletionContentPartInputAudio, ChatCompletionContentPart } from \"openai/resources/chat/completions\";\nexport declare const completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}>;\nexport declare function _convertMessagesToOpenAIParams(messages: BaseMessage[], model?: string): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[];\n"],"mappings":";;;;;iBASwBU,8BAAAA,WAAyCV,gCAAgCG,QAAAA,CAAaQ,IAAAA,CAAKC,WAAAA,CAAYC"}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { isReasoningModel, messageToOpenAIRole } from "./misc.js";
|
|
2
|
-
import { _convertToCompletionsMessageFromV1 } from "./standard.js";
|
|
3
|
-
import { convertLangChainToolCallToOpenAI } from "@langchain/core/output_parsers/openai_tools";
|
|
4
|
-
import { convertToProviderContentBlock, isAIMessage, isDataContentBlock, parseBase64DataUrl, parseMimeType } from "@langchain/core/messages";
|
|
5
|
-
|
|
6
|
-
//#region src/utils/message_inputs.ts
|
|
7
|
-
const completionsApiContentBlockConverter = {
|
|
8
|
-
providerName: "ChatOpenAI",
|
|
9
|
-
fromStandardTextBlock(block) {
|
|
10
|
-
return {
|
|
11
|
-
type: "text",
|
|
12
|
-
text: block.text
|
|
13
|
-
};
|
|
14
|
-
},
|
|
15
|
-
fromStandardImageBlock(block) {
|
|
16
|
-
if (block.source_type === "url") return {
|
|
17
|
-
type: "image_url",
|
|
18
|
-
image_url: {
|
|
19
|
-
url: block.url,
|
|
20
|
-
...block.metadata?.detail ? { detail: block.metadata.detail } : {}
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
if (block.source_type === "base64") {
|
|
24
|
-
const url = `data:${block.mime_type ?? ""};base64,${block.data}`;
|
|
25
|
-
return {
|
|
26
|
-
type: "image_url",
|
|
27
|
-
image_url: {
|
|
28
|
-
url,
|
|
29
|
-
...block.metadata?.detail ? { detail: block.metadata.detail } : {}
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
throw new Error(`Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`);
|
|
34
|
-
},
|
|
35
|
-
fromStandardAudioBlock(block) {
|
|
36
|
-
if (block.source_type === "url") {
|
|
37
|
-
const data = parseBase64DataUrl({ dataUrl: block.url });
|
|
38
|
-
if (!data) throw new Error(`URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`);
|
|
39
|
-
const rawMimeType = data.mime_type || block.mime_type || "";
|
|
40
|
-
let mimeType;
|
|
41
|
-
try {
|
|
42
|
-
mimeType = parseMimeType(rawMimeType);
|
|
43
|
-
} catch {
|
|
44
|
-
throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
45
|
-
}
|
|
46
|
-
if (mimeType.type !== "audio" || mimeType.subtype !== "wav" && mimeType.subtype !== "mp3") throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
47
|
-
return {
|
|
48
|
-
type: "input_audio",
|
|
49
|
-
input_audio: {
|
|
50
|
-
format: mimeType.subtype,
|
|
51
|
-
data: data.data
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
if (block.source_type === "base64") {
|
|
56
|
-
let mimeType;
|
|
57
|
-
try {
|
|
58
|
-
mimeType = parseMimeType(block.mime_type ?? "");
|
|
59
|
-
} catch {
|
|
60
|
-
throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
61
|
-
}
|
|
62
|
-
if (mimeType.type !== "audio" || mimeType.subtype !== "wav" && mimeType.subtype !== "mp3") throw new Error(`Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`);
|
|
63
|
-
return {
|
|
64
|
-
type: "input_audio",
|
|
65
|
-
input_audio: {
|
|
66
|
-
format: mimeType.subtype,
|
|
67
|
-
data: block.data
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
throw new Error(`Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`);
|
|
72
|
-
},
|
|
73
|
-
fromStandardFileBlock(block) {
|
|
74
|
-
if (block.source_type === "url") {
|
|
75
|
-
const data = parseBase64DataUrl({ dataUrl: block.url });
|
|
76
|
-
if (!data) throw new Error(`URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`);
|
|
77
|
-
return {
|
|
78
|
-
type: "file",
|
|
79
|
-
file: {
|
|
80
|
-
file_data: block.url,
|
|
81
|
-
...block.metadata?.filename || block.metadata?.name ? { filename: block.metadata?.filename || block.metadata?.name } : {}
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
if (block.source_type === "base64") return {
|
|
86
|
-
type: "file",
|
|
87
|
-
file: {
|
|
88
|
-
file_data: `data:${block.mime_type ?? ""};base64,${block.data}`,
|
|
89
|
-
...block.metadata?.filename || block.metadata?.name || block.metadata?.title ? { filename: block.metadata?.filename || block.metadata?.name || block.metadata?.title } : {}
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
if (block.source_type === "id") return {
|
|
93
|
-
type: "file",
|
|
94
|
-
file: { file_id: block.id }
|
|
95
|
-
};
|
|
96
|
-
throw new Error(`File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
function _convertMessagesToOpenAIParams(messages, model) {
|
|
100
|
-
return messages.flatMap((message) => {
|
|
101
|
-
if ("output_version" in message.response_metadata && message.response_metadata?.output_version === "v1") return _convertToCompletionsMessageFromV1(message);
|
|
102
|
-
let role = messageToOpenAIRole(message);
|
|
103
|
-
if (role === "system" && isReasoningModel(model)) role = "developer";
|
|
104
|
-
const content = typeof message.content === "string" ? message.content : message.content.map((m) => {
|
|
105
|
-
if (isDataContentBlock(m)) return convertToProviderContentBlock(m, completionsApiContentBlockConverter);
|
|
106
|
-
return m;
|
|
107
|
-
});
|
|
108
|
-
const completionParam = {
|
|
109
|
-
role,
|
|
110
|
-
content
|
|
111
|
-
};
|
|
112
|
-
if (message.name != null) completionParam.name = message.name;
|
|
113
|
-
if (message.additional_kwargs.function_call != null) {
|
|
114
|
-
completionParam.function_call = message.additional_kwargs.function_call;
|
|
115
|
-
completionParam.content = "";
|
|
116
|
-
}
|
|
117
|
-
if (isAIMessage(message) && !!message.tool_calls?.length) {
|
|
118
|
-
completionParam.tool_calls = message.tool_calls.map(convertLangChainToolCallToOpenAI);
|
|
119
|
-
completionParam.content = "";
|
|
120
|
-
} else {
|
|
121
|
-
if (message.additional_kwargs.tool_calls != null) completionParam.tool_calls = message.additional_kwargs.tool_calls;
|
|
122
|
-
if (message.tool_call_id != null) completionParam.tool_call_id = message.tool_call_id;
|
|
123
|
-
}
|
|
124
|
-
if (message.additional_kwargs.audio && typeof message.additional_kwargs.audio === "object" && "id" in message.additional_kwargs.audio) {
|
|
125
|
-
const audioMessage = {
|
|
126
|
-
role: "assistant",
|
|
127
|
-
audio: { id: message.additional_kwargs.audio.id }
|
|
128
|
-
};
|
|
129
|
-
return [completionParam, audioMessage];
|
|
130
|
-
}
|
|
131
|
-
return completionParam;
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
//#endregion
|
|
136
|
-
export { _convertMessagesToOpenAIParams, completionsApiContentBlockConverter };
|
|
137
|
-
//# sourceMappingURL=message_inputs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message_inputs.js","names":["completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}>","mimeType: { type: string; subtype: string }","messages: BaseMessage[]","model?: string","completionParam: Record<string, any>"],"sources":["../../src/utils/message_inputs.ts"],"sourcesContent":["import {\n BaseMessage,\n convertToProviderContentBlock,\n isAIMessage,\n isDataContentBlock,\n parseBase64DataUrl,\n parseMimeType,\n StandardContentBlockConverter,\n ToolMessage,\n} from \"@langchain/core/messages\";\nimport { convertLangChainToolCallToOpenAI } from \"@langchain/core/output_parsers/openai_tools\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from \"openai/resources/chat/completions\";\nimport { _convertToCompletionsMessageFromV1 } from \"./standard.js\";\nimport { isReasoningModel, messageToOpenAIRole } from \"./misc.js\";\n\nexport const completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}> = {\n providerName: \"ChatOpenAI\",\n\n fromStandardTextBlock(block): ChatCompletionContentPartText {\n return { type: \"text\", text: block.text };\n },\n\n fromStandardImageBlock(block): ChatCompletionContentPartImage {\n if (block.source_type === \"url\") {\n return {\n type: \"image_url\",\n image_url: {\n url: block.url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as \"auto\" | \"low\" | \"high\" }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n const url = `data:${block.mime_type ?? \"\"};base64,${block.data}`;\n return {\n type: \"image_url\",\n image_url: {\n url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as \"auto\" | \"low\" | \"high\" }\n : {}),\n },\n };\n }\n\n throw new Error(\n `Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardAudioBlock(block): ChatCompletionContentPartInputAudio {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n const rawMimeType = data.mime_type || block.mime_type || \"\";\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(rawMimeType);\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== \"audio\" ||\n (mimeType.subtype !== \"wav\" && mimeType.subtype !== \"mp3\")\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: \"input_audio\",\n input_audio: {\n format: mimeType.subtype,\n data: data.data,\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(block.mime_type ?? \"\");\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== \"audio\" ||\n (mimeType.subtype !== \"wav\" && mimeType.subtype !== \"mp3\")\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: \"input_audio\",\n input_audio: {\n format: mimeType.subtype,\n data: block.data,\n },\n };\n }\n\n throw new Error(\n `Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardFileBlock(block): ChatCompletionContentPart.File {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n return {\n type: \"file\",\n file: {\n file_data: block.url, // formatted as base64 data URL\n ...(block.metadata?.filename || block.metadata?.name\n ? {\n filename: (block.metadata?.filename ||\n block.metadata?.name) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mime_type ?? \"\"};base64,${block.data}`,\n ...(block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title\n ? {\n filename: (block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"id\") {\n return {\n type: \"file\",\n file: {\n file_id: block.id,\n },\n };\n }\n\n throw new Error(\n `File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n};\n\nexport function _convertMessagesToOpenAIParams(\n messages: BaseMessage[],\n model?: string\n): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {\n return messages.flatMap((message) => {\n if (\n \"output_version\" in message.response_metadata &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return _convertToCompletionsMessageFromV1(message);\n }\n let role = messageToOpenAIRole(message);\n if (role === \"system\" && isReasoningModel(model)) {\n role = \"developer\";\n }\n\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((m) => {\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n return m;\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const completionParam: Record<string, any> = {\n role,\n content,\n };\n if (message.name != null) {\n completionParam.name = message.name;\n }\n if (message.additional_kwargs.function_call != null) {\n completionParam.function_call = message.additional_kwargs.function_call;\n completionParam.content = \"\";\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n completionParam.content = \"\";\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if ((message as ToolMessage).tool_call_id != null) {\n completionParam.tool_call_id = (message as ToolMessage).tool_call_id;\n }\n }\n\n if (\n message.additional_kwargs.audio &&\n typeof message.additional_kwargs.audio === \"object\" &&\n \"id\" in message.additional_kwargs.audio\n ) {\n const audioMessage = {\n role: \"assistant\",\n audio: {\n id: message.additional_kwargs.audio.id,\n },\n };\n return [\n completionParam,\n audioMessage,\n ] as OpenAIClient.Chat.Completions.ChatCompletionMessageParam[];\n }\n\n return completionParam as OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\n });\n}\n"],"mappings":"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"}
|