@langchain/openai
Advanced tools
| import { completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage } from "./completions.cjs"; | ||
| import { ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, convertMessagesToResponsesInput, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentMessageToResponsesInput } from "./responses.cjs"; |
+9
-0
| # @langchain/openai | ||
| ## 1.4.2 | ||
| ### Patch Changes | ||
| - [#10614](https://github.com/langchain-ai/langchainjs/pull/10614) [`d6bf4fc`](https://github.com/langchain-ai/langchainjs/commit/d6bf4fc91b2c2eb931bf3bc7606b1817632bc8c1) Thanks [@colifran](https://github.com/colifran)! - feat(openai): imput placeholder filenames for openai file inputs | ||
| - Updated dependencies [[`d3d0922`](https://github.com/langchain-ai/langchainjs/commit/d3d0922c24afcd3006fb94dcadd3ebe08fbf2383)]: | ||
| - @langchain/core@1.1.39 | ||
| ## 1.4.1 | ||
@@ -4,0 +13,0 @@ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"common.d.cts","names":[],"sources":["../../../src/azure/chat_models/common.ts"],"mappings":";;;;;UA0CiB,qBAAA,SACP,oBAAA,EAAsB,OAAA,CAAQ,oBAAA;;;;;EAKtC,eAAA;AAAA"} | ||
| {"version":3,"file":"common.d.cts","names":[],"sources":["../../../src/azure/chat_models/common.ts"],"mappings":";;;;;UA0CiB,qBAAA,SACP,oBAAA,EAAsB,OAAA,CAAQ,oBAAA;EAKvB;;;;EAAf,eAAA;AAAA"} |
@@ -21,3 +21,3 @@ import { AzureOpenAIInput } from "../types.cjs"; | ||
| protected embeddingWithRetry(request: OpenAI.EmbeddingCreateParams): Promise<OpenAI.CreateEmbeddingResponse & { | ||
| _request_id?: string | null | undefined; | ||
| _request_id?: string | null; | ||
| }>; | ||
@@ -24,0 +24,0 @@ } |
@@ -21,3 +21,3 @@ import { AzureOpenAIInput } from "../types.js"; | ||
| protected embeddingWithRetry(request: OpenAI.EmbeddingCreateParams): Promise<OpenAI.CreateEmbeddingResponse & { | ||
| _request_id?: string | null | undefined; | ||
| _request_id?: string | null; | ||
| }>; | ||
@@ -24,0 +24,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llms.cjs","names":["OpenAI","getEndpoint","getHeadersWithUserAgent","AzureOpenAIClient"],"sources":["../../src/azure/llms.ts"],"sourcesContent":["import { type ClientOptions, AzureOpenAI as AzureOpenAIClient } from \"openai\";\nimport { type BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI } from \"../llms.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport type {\n OpenAIInput,\n AzureOpenAIInput,\n OpenAICoreRequestOptions,\n} from \"../types.js\";\n\nexport class AzureOpenAI extends OpenAI {\n azureOpenAIApiVersion?: string;\n\n azureOpenAIApiKey?: string;\n\n azureADTokenProvider?: () => Promise<string>;\n\n azureOpenAIApiInstanceName?: string;\n\n azureOpenAIApiDeploymentName?: string;\n\n azureOpenAIBasePath?: string;\n\n azureOpenAIEndpoint?: string;\n\n get lc_aliases(): Record<string, string> {\n return {\n ...super.lc_aliases,\n openAIApiKey: \"openai_api_key\",\n openAIApiVersion: \"openai_api_version\",\n openAIBasePath: \"openai_api_base\",\n deploymentName: \"deployment_name\",\n azureOpenAIEndpoint: \"azure_endpoint\",\n azureOpenAIApiVersion: \"openai_api_version\",\n azureOpenAIBasePath: \"openai_api_base\",\n azureOpenAIApiDeploymentName: \"deployment_name\",\n };\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n ...super.lc_secrets,\n azureOpenAIApiKey: \"AZURE_OPENAI_API_KEY\",\n };\n }\n\n constructor(\n fields?: Partial<OpenAIInput> & {\n openAIApiKey?: string;\n openAIApiVersion?: string;\n openAIBasePath?: string;\n deploymentName?: string;\n } & Partial<AzureOpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields);\n\n this.azureOpenAIApiDeploymentName =\n (fields?.azureOpenAIApiCompletionsDeploymentName ||\n fields?.azureOpenAIApiDeploymentName) ??\n (getEnvironmentVariable(\"AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME\") ||\n getEnvironmentVariable(\"AZURE_OPENAI_API_DEPLOYMENT_NAME\"));\n\n this.azureOpenAIApiKey =\n fields?.azureOpenAIApiKey ??\n (typeof fields?.openAIApiKey === \"string\"\n ? fields?.openAIApiKey\n : undefined) ??\n (typeof fields?.apiKey === \"string\" ? fields?.apiKey : undefined) ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_KEY\");\n\n this.azureOpenAIApiInstanceName =\n fields?.azureOpenAIApiInstanceName ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_INSTANCE_NAME\");\n\n this.azureOpenAIApiVersion =\n fields?.azureOpenAIApiVersion ??\n fields?.openAIApiVersion ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_VERSION\");\n\n this.azureOpenAIBasePath =\n fields?.azureOpenAIBasePath ??\n getEnvironmentVariable(\"AZURE_OPENAI_BASE_PATH\");\n\n this.azureOpenAIEndpoint =\n fields?.azureOpenAIEndpoint ??\n getEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\");\n\n this.azureADTokenProvider = fields?.azureADTokenProvider;\n\n if (!this.azureOpenAIApiKey && !this.apiKey && !this.azureADTokenProvider) {\n throw new Error(\"Azure OpenAI API key or Token Provider not found\");\n }\n }\n\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const { apiKey: existingApiKey, ...clientConfigRest } = this.clientConfig;\n const params: Omit<ClientOptions, \"apiKey\"> & { apiKey?: string } = {\n ...clientConfigRest,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(\n params.defaultHeaders,\n true,\n \"2.0.0\"\n );\n\n this.client = new AzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...params,\n });\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey) {\n requestOptions.headers = {\n \"api-key\": this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n \"api-version\": this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): any {\n const json = super.toJSON() as unknown;\n\n function isRecord(obj: unknown): obj is Record<string, unknown> {\n return typeof obj === \"object\" && obj != null;\n }\n\n if (isRecord(json) && isRecord(json.kwargs)) {\n delete json.kwargs.azure_openai_base_path;\n delete json.kwargs.azure_openai_api_deployment_name;\n delete json.kwargs.azure_openai_api_key;\n delete json.kwargs.azure_openai_api_version;\n delete json.kwargs.azure_open_ai_base_path;\n }\n\n return json;\n }\n}\n"],"mappings":";;;;;AAeA,IAAa,cAAb,cAAiCA,aAAAA,OAAO;CACtC;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,IAAI,aAAqC;AACvC,SAAO;GACL,GAAG,MAAM;GACT,cAAc;GACd,kBAAkB;GAClB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,uBAAuB;GACvB,qBAAqB;GACrB,8BAA8B;GAC/B;;CAGH,IAAI,aAAoD;AACtD,SAAO;GACL,GAAG,MAAM;GACT,mBAAmB;GACpB;;CAGH,YACE,QASA;AACA,QAAM,OAAO;AAEb,OAAK,gCACF,QAAQ,2CACP,QAAQ,mCAAA,GAAA,0BAAA,wBACc,+CAA+C,KAAA,GAAA,0BAAA,wBAC9C,mCAAmC;AAE9D,OAAK,oBACH,QAAQ,sBACP,OAAO,QAAQ,iBAAiB,WAC7B,QAAQ,eACR,KAAA,OACH,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA,OAAA,GAAA,0BAAA,wBAChC,uBAAuB;AAEhD,OAAK,6BACH,QAAQ,+BAAA,GAAA,0BAAA,wBACe,iCAAiC;AAE1D,OAAK,wBACH,QAAQ,yBACR,QAAQ,qBAAA,GAAA,0BAAA,wBACe,2BAA2B;AAEpD,OAAK,sBACH,QAAQ,wBAAA,GAAA,0BAAA,wBACe,yBAAyB;AAElD,OAAK,sBACH,QAAQ,wBAAA,GAAA,0BAAA,wBACe,wBAAwB;AAEjD,OAAK,uBAAuB,QAAQ;AAEpC,MAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,UAAU,CAAC,KAAK,qBACnD,OAAM,IAAI,MAAM,mDAAmD;;CAIvE,kBACE,SAC0B;AAC1B,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAM,uBAA6C;IACjD,8BAA8B,KAAK;IACnC,4BAA4B,KAAK;IACjC,mBAAmB,KAAK;IACxB,qBAAqB,KAAK;IAC1B,sBAAsB,KAAK;IAC3B,SAAS,KAAK,aAAa;IAC5B;GAED,MAAM,WAAWC,cAAAA,YAAY,qBAAqB;GAElD,MAAM,EAAE,QAAQ,gBAAgB,GAAG,qBAAqB,KAAK;GAC7D,MAAM,SAA8D;IAClE,GAAG;IACH,SAAS;IACT,SAAS,KAAK;IACd,YAAY;IACb;AAED,OAAI,CAAC,KAAK,qBACR,QAAO,SAAS,qBAAqB;AAGvC,OAAI,CAAC,OAAO,QACV,QAAO,OAAO;AAGhB,UAAO,iBAAiBC,cAAAA,wBACtB,OAAO,gBACP,MACA,QACD;AAED,QAAK,SAAS,IAAIC,OAAAA,YAAkB;IAClC,YAAY,KAAK;IACjB,sBAAsB,KAAK;IAC3B,GAAG;IACJ,CAAC;;EAGJ,MAAM,iBAAiB;GACrB,GAAG,KAAK;GACR,GAAG;GACJ;AACD,MAAI,KAAK,mBAAmB;AAC1B,kBAAe,UAAU;IACvB,WAAW,KAAK;IAChB,GAAG,eAAe;IACnB;AACD,kBAAe,QAAQ;IACrB,eAAe,KAAK;IACpB,GAAG,eAAe;IACnB;;AAEH,SAAO;;CAIT,SAAc;EACZ,MAAM,OAAO,MAAM,QAAQ;EAE3B,SAAS,SAAS,KAA8C;AAC9D,UAAO,OAAO,QAAQ,YAAY,OAAO;;AAG3C,MAAI,SAAS,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE;AAC3C,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;;AAGrB,SAAO"} | ||
| {"version":3,"file":"llms.cjs","names":["OpenAI","getEndpoint","getHeadersWithUserAgent","AzureOpenAIClient"],"sources":["../../src/azure/llms.ts"],"sourcesContent":["import { type ClientOptions, AzureOpenAI as AzureOpenAIClient } from \"openai\";\nimport { type BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI } from \"../llms.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport type {\n OpenAIInput,\n AzureOpenAIInput,\n OpenAICoreRequestOptions,\n} from \"../types.js\";\n\nexport class AzureOpenAI extends OpenAI {\n azureOpenAIApiVersion?: string;\n\n azureOpenAIApiKey?: string;\n\n azureADTokenProvider?: () => Promise<string>;\n\n azureOpenAIApiInstanceName?: string;\n\n azureOpenAIApiDeploymentName?: string;\n\n azureOpenAIBasePath?: string;\n\n azureOpenAIEndpoint?: string;\n\n get lc_aliases(): Record<string, string> {\n return {\n ...super.lc_aliases,\n openAIApiKey: \"openai_api_key\",\n openAIApiVersion: \"openai_api_version\",\n openAIBasePath: \"openai_api_base\",\n deploymentName: \"deployment_name\",\n azureOpenAIEndpoint: \"azure_endpoint\",\n azureOpenAIApiVersion: \"openai_api_version\",\n azureOpenAIBasePath: \"openai_api_base\",\n azureOpenAIApiDeploymentName: \"deployment_name\",\n };\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n ...super.lc_secrets,\n azureOpenAIApiKey: \"AZURE_OPENAI_API_KEY\",\n };\n }\n\n constructor(\n fields?: Partial<OpenAIInput> & {\n openAIApiKey?: string;\n openAIApiVersion?: string;\n openAIBasePath?: string;\n deploymentName?: string;\n } & Partial<AzureOpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields);\n\n this.azureOpenAIApiDeploymentName =\n (fields?.azureOpenAIApiCompletionsDeploymentName ||\n fields?.azureOpenAIApiDeploymentName) ??\n (getEnvironmentVariable(\"AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME\") ||\n getEnvironmentVariable(\"AZURE_OPENAI_API_DEPLOYMENT_NAME\"));\n\n this.azureOpenAIApiKey =\n fields?.azureOpenAIApiKey ??\n (typeof fields?.openAIApiKey === \"string\"\n ? fields?.openAIApiKey\n : undefined) ??\n (typeof fields?.apiKey === \"string\" ? fields?.apiKey : undefined) ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_KEY\");\n\n this.azureOpenAIApiInstanceName =\n fields?.azureOpenAIApiInstanceName ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_INSTANCE_NAME\");\n\n this.azureOpenAIApiVersion =\n fields?.azureOpenAIApiVersion ??\n fields?.openAIApiVersion ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_VERSION\");\n\n this.azureOpenAIBasePath =\n fields?.azureOpenAIBasePath ??\n getEnvironmentVariable(\"AZURE_OPENAI_BASE_PATH\");\n\n this.azureOpenAIEndpoint =\n fields?.azureOpenAIEndpoint ??\n getEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\");\n\n this.azureADTokenProvider = fields?.azureADTokenProvider;\n\n if (!this.azureOpenAIApiKey && !this.apiKey && !this.azureADTokenProvider) {\n throw new Error(\"Azure OpenAI API key or Token Provider not found\");\n }\n }\n\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const { apiKey: existingApiKey, ...clientConfigRest } = this.clientConfig;\n const params: Omit<ClientOptions, \"apiKey\"> & { apiKey?: string } = {\n ...clientConfigRest,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(\n params.defaultHeaders,\n true,\n \"2.0.0\"\n );\n\n this.client = new AzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...params,\n });\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey) {\n requestOptions.headers = {\n \"api-key\": this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n \"api-version\": this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): any {\n const json = super.toJSON() as unknown;\n\n function isRecord(obj: unknown): obj is Record<string, unknown> {\n return typeof obj === \"object\" && obj != null;\n }\n\n if (isRecord(json) && isRecord(json.kwargs)) {\n delete json.kwargs.azure_openai_base_path;\n delete json.kwargs.azure_openai_api_deployment_name;\n delete json.kwargs.azure_openai_api_key;\n delete json.kwargs.azure_openai_api_version;\n delete json.kwargs.azure_open_ai_base_path;\n }\n\n return json;\n }\n}\n"],"mappings":";;;;;AAeA,IAAa,cAAb,cAAiCA,aAAAA,OAAO;CACtC;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,IAAI,aAAqC;AACvC,SAAO;GACL,GAAG,MAAM;GACT,cAAc;GACd,kBAAkB;GAClB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,uBAAuB;GACvB,qBAAqB;GACrB,8BAA8B;GAC/B;;CAGH,IAAI,aAAoD;AACtD,SAAO;GACL,GAAG,MAAM;GACT,mBAAmB;GACpB;;CAGH,YACE,QASA;AACA,QAAM,OAAO;AAEb,OAAK,gCACF,QAAQ,2CACP,QAAQ,mCAAA,GAAA,0BAAA,wBACc,+CAA+C,KAAA,GAAA,0BAAA,wBAC9C,mCAAmC;AAE9D,OAAK,oBACH,QAAQ,sBACP,OAAO,QAAQ,iBAAiB,WAC7B,QAAQ,eACR,KAAA,OACH,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA,OAAA,GAAA,0BAAA,wBAChC,uBAAuB;AAEhD,OAAK,6BACH,QAAQ,+BAAA,GAAA,0BAAA,wBACe,iCAAiC;AAE1D,OAAK,wBACH,QAAQ,yBACR,QAAQ,qBAAA,GAAA,0BAAA,wBACe,2BAA2B;AAEpD,OAAK,sBACH,QAAQ,wBAAA,GAAA,0BAAA,wBACe,yBAAyB;AAElD,OAAK,sBACH,QAAQ,wBAAA,GAAA,0BAAA,wBACe,wBAAwB;AAEjD,OAAK,uBAAuB,QAAQ;AAEpC,MAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,UAAU,CAAC,KAAK,qBACnD,OAAM,IAAI,MAAM,mDAAmD;;CAIvE,kBACE,SAC0B;AAC1B,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAM,uBAA6C;IACjD,8BAA8B,KAAK;IACnC,4BAA4B,KAAK;IACjC,mBAAmB,KAAK;IACxB,qBAAqB,KAAK;IAC1B,sBAAsB,KAAK;IAC3B,SAAS,KAAK,aAAa;IAC5B;GAED,MAAM,WAAWC,cAAAA,YAAY,qBAAqB;GAElD,MAAM,EAAE,QAAQ,gBAAgB,GAAG,qBAAqB,KAAK;GAC7D,MAAM,SAA8D;IAClE,GAAG;IACH,SAAS;IACT,SAAS,KAAK;IACd,YAAY;IACb;AAED,OAAI,CAAC,KAAK,qBACR,QAAO,SAAS,qBAAqB;AAGvC,OAAI,CAAC,OAAO,QACV,QAAO,OAAO;AAGhB,UAAO,iBAAiBC,cAAAA,wBACtB,OAAO,gBACP,MACA,QACD;AAED,QAAK,SAAS,IAAIC,OAAAA,YAAkB;IAClC,YAAY,KAAK;IACjB,sBAAsB,KAAK;IAC3B,GAAG;IACJ,CAAC;;EAGJ,MAAM,iBAAiB;GACrB,GAAG,KAAK;GACR,GAAG;GACJ;AACD,MAAI,KAAK,mBAAmB;AAC1B,kBAAe,UAAU;IACvB,WAAW,KAAK;IAChB,GAAG,eAAe;IACnB;AACD,kBAAe,QAAQ;IACrB,eAAe,KAAK;IACpB,GAAG,eAAe;IACnB;;AAEH,SAAO;;CAIT,SAAc;EACZ,MAAM,OAAO,MAAM,QAAQ;EAE3B,SAAS,SAAS,KAA8C;AAC9D,UAAO,OAAO,QAAQ,YAAY,OAAO;;AAG3C,MAAI,SAAS,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE;AAC3C,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;;AAGrB,SAAO"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llms.js","names":["AzureOpenAI","OpenAI","AzureOpenAIClient"],"sources":["../../src/azure/llms.ts"],"sourcesContent":["import { type ClientOptions, AzureOpenAI as AzureOpenAIClient } from \"openai\";\nimport { type BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI } from \"../llms.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport type {\n OpenAIInput,\n AzureOpenAIInput,\n OpenAICoreRequestOptions,\n} from \"../types.js\";\n\nexport class AzureOpenAI extends OpenAI {\n azureOpenAIApiVersion?: string;\n\n azureOpenAIApiKey?: string;\n\n azureADTokenProvider?: () => Promise<string>;\n\n azureOpenAIApiInstanceName?: string;\n\n azureOpenAIApiDeploymentName?: string;\n\n azureOpenAIBasePath?: string;\n\n azureOpenAIEndpoint?: string;\n\n get lc_aliases(): Record<string, string> {\n return {\n ...super.lc_aliases,\n openAIApiKey: \"openai_api_key\",\n openAIApiVersion: \"openai_api_version\",\n openAIBasePath: \"openai_api_base\",\n deploymentName: \"deployment_name\",\n azureOpenAIEndpoint: \"azure_endpoint\",\n azureOpenAIApiVersion: \"openai_api_version\",\n azureOpenAIBasePath: \"openai_api_base\",\n azureOpenAIApiDeploymentName: \"deployment_name\",\n };\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n ...super.lc_secrets,\n azureOpenAIApiKey: \"AZURE_OPENAI_API_KEY\",\n };\n }\n\n constructor(\n fields?: Partial<OpenAIInput> & {\n openAIApiKey?: string;\n openAIApiVersion?: string;\n openAIBasePath?: string;\n deploymentName?: string;\n } & Partial<AzureOpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields);\n\n this.azureOpenAIApiDeploymentName =\n (fields?.azureOpenAIApiCompletionsDeploymentName ||\n fields?.azureOpenAIApiDeploymentName) ??\n (getEnvironmentVariable(\"AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME\") ||\n getEnvironmentVariable(\"AZURE_OPENAI_API_DEPLOYMENT_NAME\"));\n\n this.azureOpenAIApiKey =\n fields?.azureOpenAIApiKey ??\n (typeof fields?.openAIApiKey === \"string\"\n ? fields?.openAIApiKey\n : undefined) ??\n (typeof fields?.apiKey === \"string\" ? fields?.apiKey : undefined) ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_KEY\");\n\n this.azureOpenAIApiInstanceName =\n fields?.azureOpenAIApiInstanceName ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_INSTANCE_NAME\");\n\n this.azureOpenAIApiVersion =\n fields?.azureOpenAIApiVersion ??\n fields?.openAIApiVersion ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_VERSION\");\n\n this.azureOpenAIBasePath =\n fields?.azureOpenAIBasePath ??\n getEnvironmentVariable(\"AZURE_OPENAI_BASE_PATH\");\n\n this.azureOpenAIEndpoint =\n fields?.azureOpenAIEndpoint ??\n getEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\");\n\n this.azureADTokenProvider = fields?.azureADTokenProvider;\n\n if (!this.azureOpenAIApiKey && !this.apiKey && !this.azureADTokenProvider) {\n throw new Error(\"Azure OpenAI API key or Token Provider not found\");\n }\n }\n\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const { apiKey: existingApiKey, ...clientConfigRest } = this.clientConfig;\n const params: Omit<ClientOptions, \"apiKey\"> & { apiKey?: string } = {\n ...clientConfigRest,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(\n params.defaultHeaders,\n true,\n \"2.0.0\"\n );\n\n this.client = new AzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...params,\n });\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey) {\n requestOptions.headers = {\n \"api-key\": this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n \"api-version\": this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): any {\n const json = super.toJSON() as unknown;\n\n function isRecord(obj: unknown): obj is Record<string, unknown> {\n return typeof obj === \"object\" && obj != null;\n }\n\n if (isRecord(json) && isRecord(json.kwargs)) {\n delete json.kwargs.azure_openai_base_path;\n delete json.kwargs.azure_openai_api_deployment_name;\n delete json.kwargs.azure_openai_api_key;\n delete json.kwargs.azure_openai_api_version;\n delete json.kwargs.azure_open_ai_base_path;\n }\n\n return json;\n }\n}\n"],"mappings":";;;;;AAeA,IAAaA,gBAAb,cAAiCC,SAAO;CACtC;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,IAAI,aAAqC;AACvC,SAAO;GACL,GAAG,MAAM;GACT,cAAc;GACd,kBAAkB;GAClB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,uBAAuB;GACvB,qBAAqB;GACrB,8BAA8B;GAC/B;;CAGH,IAAI,aAAoD;AACtD,SAAO;GACL,GAAG,MAAM;GACT,mBAAmB;GACpB;;CAGH,YACE,QASA;AACA,QAAM,OAAO;AAEb,OAAK,gCACF,QAAQ,2CACP,QAAQ,kCACT,uBAAuB,+CAA+C,IACrE,uBAAuB,mCAAmC;AAE9D,OAAK,oBACH,QAAQ,sBACP,OAAO,QAAQ,iBAAiB,WAC7B,QAAQ,eACR,KAAA,OACH,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA,MACvD,uBAAuB,uBAAuB;AAEhD,OAAK,6BACH,QAAQ,8BACR,uBAAuB,iCAAiC;AAE1D,OAAK,wBACH,QAAQ,yBACR,QAAQ,oBACR,uBAAuB,2BAA2B;AAEpD,OAAK,sBACH,QAAQ,uBACR,uBAAuB,yBAAyB;AAElD,OAAK,sBACH,QAAQ,uBACR,uBAAuB,wBAAwB;AAEjD,OAAK,uBAAuB,QAAQ;AAEpC,MAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,UAAU,CAAC,KAAK,qBACnD,OAAM,IAAI,MAAM,mDAAmD;;CAIvE,kBACE,SAC0B;AAC1B,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAM,uBAA6C;IACjD,8BAA8B,KAAK;IACnC,4BAA4B,KAAK;IACjC,mBAAmB,KAAK;IACxB,qBAAqB,KAAK;IAC1B,sBAAsB,KAAK;IAC3B,SAAS,KAAK,aAAa;IAC5B;GAED,MAAM,WAAW,YAAY,qBAAqB;GAElD,MAAM,EAAE,QAAQ,gBAAgB,GAAG,qBAAqB,KAAK;GAC7D,MAAM,SAA8D;IAClE,GAAG;IACH,SAAS;IACT,SAAS,KAAK;IACd,YAAY;IACb;AAED,OAAI,CAAC,KAAK,qBACR,QAAO,SAAS,qBAAqB;AAGvC,OAAI,CAAC,OAAO,QACV,QAAO,OAAO;AAGhB,UAAO,iBAAiB,wBACtB,OAAO,gBACP,MACA,QACD;AAED,QAAK,SAAS,IAAIC,YAAkB;IAClC,YAAY,KAAK;IACjB,sBAAsB,KAAK;IAC3B,GAAG;IACJ,CAAC;;EAGJ,MAAM,iBAAiB;GACrB,GAAG,KAAK;GACR,GAAG;GACJ;AACD,MAAI,KAAK,mBAAmB;AAC1B,kBAAe,UAAU;IACvB,WAAW,KAAK;IAChB,GAAG,eAAe;IACnB;AACD,kBAAe,QAAQ;IACrB,eAAe,KAAK;IACpB,GAAG,eAAe;IACnB;;AAEH,SAAO;;CAIT,SAAc;EACZ,MAAM,OAAO,MAAM,QAAQ;EAE3B,SAAS,SAAS,KAA8C;AAC9D,UAAO,OAAO,QAAQ,YAAY,OAAO;;AAG3C,MAAI,SAAS,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE;AAC3C,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;;AAGrB,SAAO"} | ||
| {"version":3,"file":"llms.js","names":["AzureOpenAI","OpenAI","AzureOpenAIClient"],"sources":["../../src/azure/llms.ts"],"sourcesContent":["import { type ClientOptions, AzureOpenAI as AzureOpenAIClient } from \"openai\";\nimport { type BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI } from \"../llms.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport type {\n OpenAIInput,\n AzureOpenAIInput,\n OpenAICoreRequestOptions,\n} from \"../types.js\";\n\nexport class AzureOpenAI extends OpenAI {\n azureOpenAIApiVersion?: string;\n\n azureOpenAIApiKey?: string;\n\n azureADTokenProvider?: () => Promise<string>;\n\n azureOpenAIApiInstanceName?: string;\n\n azureOpenAIApiDeploymentName?: string;\n\n azureOpenAIBasePath?: string;\n\n azureOpenAIEndpoint?: string;\n\n get lc_aliases(): Record<string, string> {\n return {\n ...super.lc_aliases,\n openAIApiKey: \"openai_api_key\",\n openAIApiVersion: \"openai_api_version\",\n openAIBasePath: \"openai_api_base\",\n deploymentName: \"deployment_name\",\n azureOpenAIEndpoint: \"azure_endpoint\",\n azureOpenAIApiVersion: \"openai_api_version\",\n azureOpenAIBasePath: \"openai_api_base\",\n azureOpenAIApiDeploymentName: \"deployment_name\",\n };\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n ...super.lc_secrets,\n azureOpenAIApiKey: \"AZURE_OPENAI_API_KEY\",\n };\n }\n\n constructor(\n fields?: Partial<OpenAIInput> & {\n openAIApiKey?: string;\n openAIApiVersion?: string;\n openAIBasePath?: string;\n deploymentName?: string;\n } & Partial<AzureOpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields);\n\n this.azureOpenAIApiDeploymentName =\n (fields?.azureOpenAIApiCompletionsDeploymentName ||\n fields?.azureOpenAIApiDeploymentName) ??\n (getEnvironmentVariable(\"AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME\") ||\n getEnvironmentVariable(\"AZURE_OPENAI_API_DEPLOYMENT_NAME\"));\n\n this.azureOpenAIApiKey =\n fields?.azureOpenAIApiKey ??\n (typeof fields?.openAIApiKey === \"string\"\n ? fields?.openAIApiKey\n : undefined) ??\n (typeof fields?.apiKey === \"string\" ? fields?.apiKey : undefined) ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_KEY\");\n\n this.azureOpenAIApiInstanceName =\n fields?.azureOpenAIApiInstanceName ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_INSTANCE_NAME\");\n\n this.azureOpenAIApiVersion =\n fields?.azureOpenAIApiVersion ??\n fields?.openAIApiVersion ??\n getEnvironmentVariable(\"AZURE_OPENAI_API_VERSION\");\n\n this.azureOpenAIBasePath =\n fields?.azureOpenAIBasePath ??\n getEnvironmentVariable(\"AZURE_OPENAI_BASE_PATH\");\n\n this.azureOpenAIEndpoint =\n fields?.azureOpenAIEndpoint ??\n getEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\");\n\n this.azureADTokenProvider = fields?.azureADTokenProvider;\n\n if (!this.azureOpenAIApiKey && !this.apiKey && !this.azureADTokenProvider) {\n throw new Error(\"Azure OpenAI API key or Token Provider not found\");\n }\n }\n\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const { apiKey: existingApiKey, ...clientConfigRest } = this.clientConfig;\n const params: Omit<ClientOptions, \"apiKey\"> & { apiKey?: string } = {\n ...clientConfigRest,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(\n params.defaultHeaders,\n true,\n \"2.0.0\"\n );\n\n this.client = new AzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...params,\n });\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey) {\n requestOptions.headers = {\n \"api-key\": this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n \"api-version\": this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): any {\n const json = super.toJSON() as unknown;\n\n function isRecord(obj: unknown): obj is Record<string, unknown> {\n return typeof obj === \"object\" && obj != null;\n }\n\n if (isRecord(json) && isRecord(json.kwargs)) {\n delete json.kwargs.azure_openai_base_path;\n delete json.kwargs.azure_openai_api_deployment_name;\n delete json.kwargs.azure_openai_api_key;\n delete json.kwargs.azure_openai_api_version;\n delete json.kwargs.azure_open_ai_base_path;\n }\n\n return json;\n }\n}\n"],"mappings":";;;;;AAeA,IAAaA,gBAAb,cAAiCC,SAAO;CACtC;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,IAAI,aAAqC;AACvC,SAAO;GACL,GAAG,MAAM;GACT,cAAc;GACd,kBAAkB;GAClB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,uBAAuB;GACvB,qBAAqB;GACrB,8BAA8B;GAC/B;;CAGH,IAAI,aAAoD;AACtD,SAAO;GACL,GAAG,MAAM;GACT,mBAAmB;GACpB;;CAGH,YACE,QASA;AACA,QAAM,OAAO;AAEb,OAAK,gCACF,QAAQ,2CACP,QAAQ,kCACT,uBAAuB,+CAA+C,IACrE,uBAAuB,mCAAmC;AAE9D,OAAK,oBACH,QAAQ,sBACP,OAAO,QAAQ,iBAAiB,WAC7B,QAAQ,eACR,KAAA,OACH,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA,MACvD,uBAAuB,uBAAuB;AAEhD,OAAK,6BACH,QAAQ,8BACR,uBAAuB,iCAAiC;AAE1D,OAAK,wBACH,QAAQ,yBACR,QAAQ,oBACR,uBAAuB,2BAA2B;AAEpD,OAAK,sBACH,QAAQ,uBACR,uBAAuB,yBAAyB;AAElD,OAAK,sBACH,QAAQ,uBACR,uBAAuB,wBAAwB;AAEjD,OAAK,uBAAuB,QAAQ;AAEpC,MAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,UAAU,CAAC,KAAK,qBACnD,OAAM,IAAI,MAAM,mDAAmD;;CAIvE,kBACE,SAC0B;AAC1B,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAM,uBAA6C;IACjD,8BAA8B,KAAK;IACnC,4BAA4B,KAAK;IACjC,mBAAmB,KAAK;IACxB,qBAAqB,KAAK;IAC1B,sBAAsB,KAAK;IAC3B,SAAS,KAAK,aAAa;IAC5B;GAED,MAAM,WAAW,YAAY,qBAAqB;GAElD,MAAM,EAAE,QAAQ,gBAAgB,GAAG,qBAAqB,KAAK;GAC7D,MAAM,SAA8D;IAClE,GAAG;IACH,SAAS;IACT,SAAS,KAAK;IACd,YAAY;IACb;AAED,OAAI,CAAC,KAAK,qBACR,QAAO,SAAS,qBAAqB;AAGvC,OAAI,CAAC,OAAO,QACV,QAAO,OAAO;AAGhB,UAAO,iBAAiB,wBACtB,OAAO,gBACP,MACA,QACD;AAED,QAAK,SAAS,IAAIC,YAAkB;IAClC,YAAY,KAAK;IACjB,sBAAsB,KAAK;IAC3B,GAAG;IACJ,CAAC;;EAGJ,MAAM,iBAAiB;GACrB,GAAG,KAAK;GACR,GAAG;GACJ;AACD,MAAI,KAAK,mBAAmB;AAC1B,kBAAe,UAAU;IACvB,WAAW,KAAK;IAChB,GAAG,eAAe;IACnB;AACD,kBAAe,QAAQ;IACrB,eAAe,KAAK;IACpB,GAAG,eAAe;IACnB;;AAEH,SAAO;;CAIT,SAAc;EACZ,MAAM,OAAO,MAAM,QAAQ;EAE3B,SAAS,SAAS,KAA8C;AAC9D,UAAO,OAAO,QAAQ,YAAY,OAAO;;AAG3C,MAAI,SAAS,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE;AAC3C,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;AACnB,UAAO,KAAK,OAAO;;AAGrB,SAAO"} |
@@ -236,3 +236,3 @@ const require_client = require("../utils/client.cjs"); | ||
| this.zdrEnabled = fields?.zdrEnabled ?? false; | ||
| this._addVersion("@langchain/openai", "1.4.1"); | ||
| this._addVersion("@langchain/openai", "1.4.2"); | ||
| } | ||
@@ -239,0 +239,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"base.cjs","names":["BaseChatModel","isReasoningModel","interopZodResponseFormat","getEndpoint","getHeadersWithUserAgent","OpenAIClient","isCustomTool","convertResponsesCustomTool","_convertToOpenAITool","isBuiltInTool","hasProviderToolDefinition","messageToOpenAIRole","formatFunctionDefinitions","wrapOpenAIClientError","PROFILES","getStructuredOutputMethod","RunnableLambda","JsonOutputParser"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import OpenAI, { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { type ChatGeneration } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n type BaseChatModelParams,\n BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n isOpenAITool as isOpenAIFunctionTool,\n type BaseFunctionCallOptions,\n type BaseLanguageModelInput,\n type FunctionDefinition,\n type StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport { JsonOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n getSchemaDescription,\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport {\n type OpenAICallOptions,\n type OpenAIChatInput,\n type OpenAICoreRequestOptions,\n type ChatOpenAIResponseFormat,\n ResponseFormatConfiguration,\n OpenAIVerbosityParam,\n type OpenAIApiKey,\n OpenAICacheRetentionParam,\n} from \"../types.js\";\nimport {\n type OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport {\n type FunctionDef,\n formatFunctionDefinitions,\n OpenAIToolChoice,\n _convertToOpenAITool,\n ChatOpenAIToolType,\n convertResponsesCustomTool,\n isBuiltInTool,\n isCustomTool,\n hasProviderToolDefinition,\n ResponsesToolChoice,\n} from \"../utils/tools.js\";\nimport {\n getStructuredOutputMethod,\n interopZodResponseFormat,\n _convertOpenAIResponsesUsageToLangChainUsage,\n} from \"../utils/output.js\";\nimport { isReasoningModel, messageToOpenAIRole } from \"../utils/misc.js\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\ninterface OpenAILLMOutput {\n tokenUsage: {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n };\n}\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\nexport interface BaseChatOpenAICallOptions\n extends BaseChatModelCallOptions, BaseFunctionCallOptions {\n /**\n * Additional options to pass to the underlying axios request.\n */\n options?: OpenAICoreRequestOptions;\n\n /**\n * A list of tools that the model may use to generate responses.\n * Each tool can be a function, a built-in tool, or a custom tool definition.\n * If not provided, the model will not use any tools.\n */\n tools?: ChatOpenAIToolType[];\n\n /**\n * Specifies which tool the model should use to respond.\n * Can be an {@link OpenAIToolChoice} or a {@link ResponsesToolChoice}.\n * If not set, the model will decide which tool to use automatically.\n */\n // TODO: break OpenAIToolChoice and ResponsesToolChoice into options sub classes\n tool_choice?: OpenAIToolChoice | ResponsesToolChoice;\n\n /**\n * Adds a prompt index to prompts passed to the model to track\n * what prompt is being used for a given generation.\n */\n promptIndex?: number;\n\n /**\n * An object specifying the format that the model must output.\n */\n response_format?: ChatOpenAIResponseFormat;\n\n /**\n * When provided, the completions API will make a best effort to sample\n * deterministically, such that repeated requests with the same `seed`\n * and parameters should return the same result.\n */\n seed?: number;\n\n /**\n * Additional options to pass to streamed completions.\n * If provided, this takes precedence over \"streamUsage\" set at\n * initialization time.\n */\n stream_options?: OpenAIClient.Chat.ChatCompletionStreamOptions;\n\n /**\n * The model may choose to call multiple functions in a single turn. You can\n * set parallel_tool_calls to false which ensures only one tool is called at most.\n * [Learn more](https://platform.openai.com/docs/guides/function-calling#parallel-function-calling)\n */\n parallel_tool_calls?: boolean;\n\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the tool definition. If `true`, the input schema will also be\n * validated according to\n * https://platform.openai.com/docs/guides/structured-outputs/supported-schemas.\n *\n * If `false`, input schema will not be validated and model output will not\n * be validated.\n *\n * If `undefined`, `strict` argument will not be passed to the model.\n */\n strict?: boolean;\n\n /**\n * Output types that you would like the model to generate for this request. Most\n * models are capable of generating text, which is the default:\n *\n * `[\"text\"]`\n *\n * The `gpt-4o-audio-preview` model can also be used to\n * [generate audio](https://platform.openai.com/docs/guides/audio). To request that\n * this model generate both text and audio responses, you can use:\n *\n * `[\"text\", \"audio\"]`\n */\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n /**\n * Parameters for audio output. Required when audio output is requested with\n * `modalities: [\"audio\"]`.\n * [Learn more](https://platform.openai.com/docs/guides/audio).\n */\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n /**\n * Static predicted output content, such as the content of a text file that is being regenerated.\n * [Learn more](https://platform.openai.com/docs/guides/latency-optimization#use-predicted-outputs).\n */\n prediction?: OpenAIClient.ChatCompletionPredictionContent;\n\n /**\n * Options for reasoning models.\n *\n * Note that some options, like reasoning summaries, are only available when using the responses\n * API. If these options are set, the responses API will be used to fulfill the request.\n *\n * These options will be ignored when not using a reasoning model.\n */\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Constrains effort on reasoning for reasoning models. Reduces reasoning in responses,\n * which can reduce latency and cost at the expense of quality.\n *\n * Accepts values: \"low\", \"medium\", or \"high\".\n *\n * @deprecated This is a convenience option that will be merged into the `reasoning` object.\n * Use `reasoning.effort` instead.\n */\n reasoningEffort?: OpenAIClient.Reasoning[\"effort\"];\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\"\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates. Replaces the `user` field.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey?: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport interface BaseChatOpenAIFields\n extends Partial<OpenAIChatInput>, BaseChatModelParams {\n /**\n * Optional configuration options for the OpenAI client.\n */\n configuration?: ClientOptions;\n}\n\nexport function getChatOpenAIModelParams<TParams extends BaseChatOpenAIFields>(\n modelOrParams?: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams | undefined {\n if (typeof modelOrParams === \"string\") {\n return { model: modelOrParams, ...(paramsArg ?? {}) } as TParams;\n }\n if (modelOrParams == null) {\n return paramsArg as TParams | undefined;\n }\n return modelOrParams;\n}\n\n/** @internal */\nexport abstract class BaseChatOpenAI<\n CallOptions extends BaseChatOpenAICallOptions,\n>\n extends BaseChatModel<CallOptions, AIMessageChunk>\n implements Partial<OpenAIChatInput>\n{\n temperature?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo\";\n\n modelKwargs?: OpenAIChatInput[\"modelKwargs\"];\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n timeout?: number;\n\n streaming = false;\n\n streamUsage = true;\n\n maxTokens?: number;\n\n logprobs?: boolean;\n\n topLogprobs?: number;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n __includeRawResponse?: boolean;\n\n /** @internal */\n client: OpenAIClient;\n\n /** @internal */\n clientConfig: ClientOptions;\n\n /**\n * Whether the model supports the `strict` argument when passing in tools.\n * If `undefined` the `strict` argument will not be passed to OpenAI.\n */\n supportsStrictToolCalling?: boolean;\n\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Must be set to `true` in tenancies with Zero Data Retention. Setting to `true` will disable\n * output storage in the Responses API, but this DOES NOT enable Zero Data Retention in your\n * OpenAI organization or project. This must be configured directly with OpenAI.\n *\n * See:\n * https://platform.openai.com/docs/guides/your-data\n * https://platform.openai.com/docs/api-reference/responses/create#responses-create-store\n *\n * @default false\n */\n zdrEnabled?: boolean | undefined;\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\" or \"priority\".\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n\n protected defaultOptions: CallOptions;\n\n _llmType() {\n return \"openai\";\n }\n\n static lc_name() {\n return \"ChatOpenAI\";\n }\n\n get callKeys() {\n return [\n ...super.callKeys,\n \"options\",\n \"function_call\",\n \"functions\",\n \"tools\",\n \"tool_choice\",\n \"promptIndex\",\n \"response_format\",\n \"seed\",\n \"reasoning\",\n \"reasoning_effort\",\n \"service_tier\",\n ];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n apiKey: \"openai_api_key\",\n modelName: \"model\",\n };\n }\n\n get lc_serializable_keys(): string[] {\n return [\n \"configuration\",\n \"logprobs\",\n \"topLogprobs\",\n \"prefixMessages\",\n \"supportsStrictToolCalling\",\n \"modalities\",\n \"audio\",\n \"temperature\",\n \"maxTokens\",\n \"topP\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"n\",\n \"logitBias\",\n \"user\",\n \"streaming\",\n \"streamUsage\",\n \"model\",\n \"modelName\",\n \"modelKwargs\",\n \"stop\",\n \"stopSequences\",\n \"timeout\",\n \"apiKey\",\n \"cache\",\n \"maxConcurrency\",\n \"maxRetries\",\n \"verbose\",\n \"callbacks\",\n \"tags\",\n \"metadata\",\n \"disableStreaming\",\n \"zdrEnabled\",\n \"reasoning\",\n \"promptCacheKey\",\n \"promptCacheRetention\",\n \"verbosity\",\n ];\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"openai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<\n OpenAIClient.Chat.ChatCompletionCreateParams,\n \"messages\"\n > & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams() {\n return this._identifyingParams();\n }\n\n constructor(fields?: BaseChatOpenAIFields) {\n super(fields ?? {});\n\n const configApiKey =\n typeof fields?.configuration?.apiKey === \"string\" ||\n typeof fields?.configuration?.apiKey === \"function\"\n ? fields?.configuration?.apiKey\n : undefined;\n this.apiKey =\n fields?.apiKey ??\n configApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.logprobs = fields?.logprobs;\n this.topLogprobs = fields?.topLogprobs;\n this.n = fields?.n ?? this.n;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n this.__includeRawResponse = fields?.__includeRawResponse;\n this.audio = fields?.audio;\n this.modalities = fields?.modalities;\n this.reasoning = fields?.reasoning;\n this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens;\n this.promptCacheKey = fields?.promptCacheKey ?? this.promptCacheKey;\n this.promptCacheRetention =\n fields?.promptCacheRetention ?? this.promptCacheRetention;\n this.verbosity = fields?.verbosity ?? this.verbosity;\n\n this.disableStreaming = fields?.disableStreaming === true;\n this.streaming = fields?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (fields?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n\n // If `supportsStrictToolCalling` is explicitly set, use that value.\n // Else leave undefined so it's not passed to OpenAI.\n if (fields?.supportsStrictToolCalling !== undefined) {\n this.supportsStrictToolCalling = fields.supportsStrictToolCalling;\n }\n\n if (fields?.service_tier !== undefined) {\n this.service_tier = fields.service_tier;\n }\n\n this.zdrEnabled = fields?.zdrEnabled ?? false;\n\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n }\n\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n protected _getReasoningParams(\n options?: this[\"ParsedCallOptions\"]\n ): OpenAIClient.Reasoning | undefined {\n if (!isReasoningModel(this.model)) {\n return;\n }\n\n // apply options in reverse order of importance -- newer options supersede older options\n let reasoning: OpenAIClient.Reasoning | undefined;\n if (this.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...this.reasoning,\n };\n }\n if (options?.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...options.reasoning,\n };\n }\n\n // Coalesce reasoningEffort into reasoning.effort if reasoning.effort is not already set\n if (\n options?.reasoningEffort !== undefined &&\n reasoning?.effort === undefined\n ) {\n reasoning = {\n ...reasoning,\n effort: options.reasoningEffort,\n };\n }\n\n return reasoning;\n }\n\n /**\n * Returns an openai compatible response format from a set of options\n * @internal\n */\n protected _getResponseFormat(\n resFormat?: CallOptions[\"response_format\"]\n ): ResponseFormatConfiguration | undefined {\n if (\n resFormat &&\n resFormat.type === \"json_schema\" &&\n resFormat.json_schema.schema &&\n isInteropZodSchema(resFormat.json_schema.schema)\n ) {\n return interopZodResponseFormat(\n resFormat.json_schema.schema,\n resFormat.json_schema.name,\n {\n description: resFormat.json_schema.description,\n }\n );\n }\n return resFormat as ResponseFormatConfiguration | undefined;\n }\n\n protected _combineCallOptions(\n additionalOptions?: this[\"ParsedCallOptions\"]\n ): this[\"ParsedCallOptions\"] {\n return {\n ...this.defaultOptions,\n ...(additionalOptions ?? {}),\n };\n }\n\n /** @internal */\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n // TODO: move to completions class\n protected _convertChatOpenAIToolToCompletionsTool(\n tool: ChatOpenAIToolType,\n fields?: { strict?: boolean }\n ): OpenAIClient.ChatCompletionTool {\n if (isCustomTool(tool)) {\n return convertResponsesCustomTool(tool.metadata.customTool);\n }\n if (isOpenAIFunctionTool(tool)) {\n if (fields?.strict !== undefined) {\n return {\n ...tool,\n function: {\n ...tool.function,\n strict: fields.strict,\n },\n };\n }\n\n return tool;\n }\n return _convertToOpenAITool(tool, fields);\n }\n\n override bindTools(\n tools: ChatOpenAIToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n let strict: boolean | undefined;\n if (kwargs?.strict !== undefined) {\n strict = kwargs.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n return this.withConfig({\n tools: tools.map((tool) => {\n // Built-in tools and custom tools pass through as-is\n if (isBuiltInTool(tool) || isCustomTool(tool)) {\n return tool;\n }\n // Tools with providerToolDefinition (e.g., localShell, shell, computerUse, applyPatch)\n // should use their provider-specific definition\n if (hasProviderToolDefinition(tool)) {\n return tool.extras.providerToolDefinition;\n }\n // Regular tools get converted to OpenAI function format\n const converted = this._convertChatOpenAIToolToCompletionsTool(tool, {\n strict,\n });\n if (isLangChainTool(tool) && tool.extras?.defer_loading === true) {\n return { ...converted, defer_loading: true };\n }\n return converted;\n }),\n ...kwargs,\n } as Partial<CallOptions>);\n }\n\n override async stream(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.stream(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n override async invoke(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.invoke(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n /** @ignore */\n _combineLLMOutput(...llmOutputs: OpenAILLMOutput[]): OpenAILLMOutput {\n return llmOutputs.reduce<{\n [key in keyof OpenAILLMOutput]: Required<OpenAILLMOutput[key]>;\n }>(\n (acc, llmOutput) => {\n if (llmOutput && llmOutput.tokenUsage) {\n acc.tokenUsage.completionTokens +=\n llmOutput.tokenUsage.completionTokens ?? 0;\n acc.tokenUsage.promptTokens += llmOutput.tokenUsage.promptTokens ?? 0;\n acc.tokenUsage.totalTokens += llmOutput.tokenUsage.totalTokens ?? 0;\n }\n return acc;\n },\n {\n tokenUsage: {\n completionTokens: 0,\n promptTokens: 0,\n totalTokens: 0,\n },\n }\n );\n }\n\n async getNumTokensFromMessages(messages: BaseMessage[]) {\n let totalCount = 0;\n let tokensPerMessage = 0;\n let tokensPerName = 0;\n\n // From: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb\n if (this.model === \"gpt-3.5-turbo-0301\") {\n tokensPerMessage = 4;\n tokensPerName = -1;\n } else {\n tokensPerMessage = 3;\n tokensPerName = 1;\n }\n\n const countPerMessage = await Promise.all(\n messages.map(async (message) => {\n const [textCount, roleCount] = await Promise.all([\n this.getNumTokens(message.content),\n this.getNumTokens(messageToOpenAIRole(message)),\n ]);\n const nameCount =\n message.name !== undefined\n ? tokensPerName + (await this.getNumTokens(message.name))\n : 0;\n let count = textCount + tokensPerMessage + roleCount + nameCount;\n\n // From: https://github.com/hmarr/openai-chat-tokens/blob/main/src/index.ts messageTokenEstimate\n const openAIMessage = message;\n if (openAIMessage._getType() === \"function\") {\n count -= 2;\n }\n if (openAIMessage.additional_kwargs?.function_call) {\n count += 3;\n }\n if (openAIMessage?.additional_kwargs.function_call?.name) {\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.name\n );\n }\n if (openAIMessage.additional_kwargs.function_call?.arguments) {\n try {\n count += await this.getNumTokens(\n // Remove newlines and spaces\n JSON.stringify(\n JSON.parse(\n openAIMessage.additional_kwargs.function_call?.arguments\n )\n )\n );\n } catch (error) {\n console.error(\n \"Error parsing function arguments\",\n error,\n JSON.stringify(openAIMessage.additional_kwargs.function_call)\n );\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.arguments\n );\n }\n }\n\n totalCount += count;\n return count;\n })\n );\n\n totalCount += 3; // every reply is primed with <|start|>assistant<|message|>\n\n return { totalCount, countPerMessage };\n }\n\n /** @internal */\n protected async _getNumTokensFromGenerations(generations: ChatGeneration[]) {\n const generationUsages = await Promise.all(\n generations.map(async (generation) => {\n if (generation.message.additional_kwargs?.function_call) {\n return (await this.getNumTokensFromMessages([generation.message]))\n .countPerMessage[0];\n } else {\n return await this.getNumTokens(generation.message.content);\n }\n })\n );\n\n return generationUsages.reduce((a, b) => a + b, 0);\n }\n\n /** @internal */\n protected async _getEstimatedTokenCountFromPrompt(\n messages: BaseMessage[],\n functions?: OpenAIClient.Chat.ChatCompletionCreateParams.Function[],\n function_call?:\n | \"none\"\n | \"auto\"\n | OpenAIClient.Chat.ChatCompletionFunctionCallOption\n ): Promise<number> {\n // It appears that if functions are present, the first system message is padded with a trailing newline. This\n // was inferred by trying lots of combinations of messages and functions and seeing what the token counts were.\n\n let tokens = (await this.getNumTokensFromMessages(messages)).totalCount;\n\n // If there are functions, add the function definitions as they count towards token usage\n if (functions && function_call !== \"auto\") {\n const promptDefinitions = formatFunctionDefinitions(\n functions as unknown as FunctionDef[]\n );\n tokens += await this.getNumTokens(promptDefinitions);\n tokens += 9; // Add nine per completion\n }\n\n // If there's a system message _and_ functions are present, subtract four tokens. I assume this is because\n // functions typically add a system message, but reuse the first one if it's already there. This offsets\n // the extra 9 tokens added by the function definitions.\n if (functions && messages.find((m) => m._getType() === \"system\")) {\n tokens -= 4;\n }\n\n // If function_call is 'none', add one token.\n // If it's a FunctionCall object, add 4 + the number of tokens in the function name.\n // If it's undefined or 'auto', don't add anything.\n if (function_call === \"none\") {\n tokens += 1;\n } else if (typeof function_call === \"object\") {\n tokens += (await this.getNumTokens(function_call.name)) + 4;\n }\n\n return tokens;\n }\n\n /**\n * Moderate content using OpenAI's Moderation API.\n *\n * This method checks whether content violates OpenAI's content policy by\n * analyzing text for categories such as hate, harassment, self-harm,\n * sexual content, violence, and more.\n *\n * @param input - The text or array of texts to moderate\n * @param params - Optional parameters for the moderation request\n * @param params.model - The moderation model to use. Defaults to \"omni-moderation-latest\".\n * @param params.options - Additional options to pass to the underlying request\n * @returns A promise that resolves to the moderation response containing results for each input\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n *\n * // Moderate a single text\n * const result = await model.moderateContent(\"This is a test message\");\n * console.log(result.results[0].flagged); // false\n * console.log(result.results[0].categories); // { hate: false, harassment: false, ... }\n *\n * // Moderate multiple texts\n * const results = await model.moderateContent([\n * \"Hello, how are you?\",\n * \"This is inappropriate content\"\n * ]);\n * results.results.forEach((result, index) => {\n * console.log(`Text ${index + 1} flagged:`, result.flagged);\n * });\n *\n * // Use a specific moderation model\n * const stableResult = await model.moderateContent(\n * \"Test content\",\n * { model: \"omni-moderation-latest\" }\n * );\n * ```\n */\n async moderateContent(\n input: string | string[],\n params?: {\n model?: OpenAI.ModerationModel;\n options?: OpenAICoreRequestOptions;\n }\n ): Promise<OpenAIClient.ModerationCreateResponse> {\n const clientOptions = this._getClientOptions(params?.options);\n const moderationModel = params?.model ?? \"omni-moderation-latest\";\n const moderationRequest: OpenAIClient.ModerationCreateParams = {\n input,\n model: moderationModel,\n };\n\n return this.caller.call(async () => {\n try {\n const response = await this.client.moderations.create(\n moderationRequest,\n clientOptions\n );\n return response;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 128000\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n /** @internal */\n protected _getStructuredOutputMethod(\n config: StructuredOutputMethodOptions<boolean>\n ) {\n const ensuredConfig = { ...config };\n if (\n !this.model.startsWith(\"gpt-3\") &&\n !this.model.startsWith(\"gpt-4-\") &&\n this.model !== \"gpt-4\"\n ) {\n if (ensuredConfig?.method === undefined) {\n return \"jsonSchema\";\n }\n } else if (ensuredConfig.method === \"jsonSchema\") {\n console.warn(\n `[WARNING]: JSON Schema is not supported for model \"${this.model}\". Falling back to tool calling.`\n );\n }\n return ensuredConfig.method;\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Add structured output to the model.\n *\n * The OpenAI model family supports the following structured output methods:\n * - `jsonSchema`: Use the `response_format` field in the response to return a JSON schema. Only supported with the `gpt-4o-mini`,\n * `gpt-4o-mini-2024-07-18`, and `gpt-4o-2024-08-06` model snapshots and later.\n * - `functionCalling`: Function calling is useful when you are building an application that bridges the models and functionality\n * of your application.\n * - `jsonMode`: JSON mode is a more basic version of the Structured Outputs feature. While JSON mode ensures that model\n * output is valid JSON, Structured Outputs reliably matches the model's output to the schema you specify.\n * We recommend you use `functionCalling` or `jsonSchema` if it is supported for your use case.\n *\n * The default method is `functionCalling`.\n *\n * @see https://platform.openai.com/docs/guides/structured-outputs\n * @param outputSchema - The schema to use for structured output.\n * @param config - The structured output method options.\n * @returns The model with structured output.\n */\n withStructuredOutput<\n RunOutput extends Record<string, unknown> = Record<string, unknown>,\n >(\n outputSchema:\n | SerializableSchema<RunOutput>\n | InteropZodType<RunOutput>\n | Record<string, unknown>,\n config?: StructuredOutputMethodOptions<boolean>\n ) {\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n\n if (config?.strict !== undefined && config.method === \"jsonMode\") {\n throw new Error(\n \"Argument `strict` is only supported for `method` = 'function_calling'\"\n );\n }\n\n const method = getStructuredOutputMethod(this.model, config?.method);\n\n if (method === \"jsonMode\") {\n outputParser = createContentParser(schema);\n const asJsonSchema = toJsonSchema(schema);\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: { type: \"json_object\" },\n ls_structured_output_format: {\n kwargs: { method: \"json_mode\" },\n schema: { title: name ?? \"extract\", ...asJsonSchema },\n },\n } as Partial<CallOptions>);\n } else if (method === \"jsonSchema\") {\n const asJsonSchema = toJsonSchema(schema);\n const openaiJsonSchemaParams = {\n name: name ?? \"extract\",\n description: getSchemaDescription(asJsonSchema),\n schema: isInteropZodSchema(schema) ? schema : asJsonSchema,\n strict: config?.strict,\n };\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: {\n type: \"json_schema\",\n json_schema: openaiJsonSchemaParams,\n },\n ls_structured_output_format: {\n kwargs: { method: \"json_schema\" },\n schema: {\n title: openaiJsonSchemaParams.name,\n description: openaiJsonSchemaParams.description,\n ...asJsonSchema,\n },\n },\n } as Partial<CallOptions>);\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const altParser = createContentParser(schema);\n outputParser = RunnableLambda.from<AIMessageChunk, RunOutput>(\n async (aiMessage: AIMessageChunk) => {\n if (\"parsed\" in aiMessage.additional_kwargs) {\n return aiMessage.additional_kwargs.parsed as RunOutput;\n }\n return altParser.invoke(aiMessage.content as string);\n }\n );\n } else {\n outputParser = new JsonOutputParser<RunOutput>();\n }\n } else {\n let functionName = name ?? \"extract\";\n const asJsonSchema = toJsonSchema(schema);\n\n // Is function calling\n let toolFunction: FunctionDefinition;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n toolFunction = {\n name: functionName,\n description: asJsonSchema.description,\n parameters: asJsonSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n toolFunction = schema as unknown as FunctionDefinition;\n functionName = schema.name;\n } else {\n functionName = (schema.title as string) ?? functionName;\n toolFunction = {\n name: functionName,\n description: (schema.description as string) ?? \"\",\n parameters: schema,\n };\n }\n\n llm = this.withConfig({\n outputVersion: \"v0\",\n tools: [{ type: \"function\" as const, function: toolFunction }],\n tool_choice: {\n type: \"function\" as const,\n function: { name: functionName },\n },\n ls_structured_output_format: {\n kwargs: { method: \"function_calling\" },\n schema: { title: functionName, ...asJsonSchema },\n },\n // Do not pass `strict` argument to OpenAI if `config.strict` is undefined\n ...(config?.strict !== undefined ? { strict: config.strict } : {}),\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n }\n\n return assembleStructuredOutputPipeline(llm, outputParser, includeRaw);\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"base.cjs","names":["BaseChatModel","isReasoningModel","interopZodResponseFormat","getEndpoint","getHeadersWithUserAgent","OpenAIClient","isCustomTool","convertResponsesCustomTool","_convertToOpenAITool","isBuiltInTool","hasProviderToolDefinition","messageToOpenAIRole","formatFunctionDefinitions","wrapOpenAIClientError","PROFILES","getStructuredOutputMethod","RunnableLambda","JsonOutputParser"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import OpenAI, { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { type ChatGeneration } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n type BaseChatModelParams,\n BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n isOpenAITool as isOpenAIFunctionTool,\n type BaseFunctionCallOptions,\n type BaseLanguageModelInput,\n type FunctionDefinition,\n type StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport { JsonOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n getSchemaDescription,\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport {\n type OpenAICallOptions,\n type OpenAIChatInput,\n type OpenAICoreRequestOptions,\n type ChatOpenAIResponseFormat,\n ResponseFormatConfiguration,\n OpenAIVerbosityParam,\n type OpenAIApiKey,\n OpenAICacheRetentionParam,\n} from \"../types.js\";\nimport {\n type OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport {\n type FunctionDef,\n formatFunctionDefinitions,\n OpenAIToolChoice,\n _convertToOpenAITool,\n ChatOpenAIToolType,\n convertResponsesCustomTool,\n isBuiltInTool,\n isCustomTool,\n hasProviderToolDefinition,\n ResponsesToolChoice,\n} from \"../utils/tools.js\";\nimport {\n getStructuredOutputMethod,\n interopZodResponseFormat,\n _convertOpenAIResponsesUsageToLangChainUsage,\n} from \"../utils/output.js\";\nimport { isReasoningModel, messageToOpenAIRole } from \"../utils/misc.js\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\ninterface OpenAILLMOutput {\n tokenUsage: {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n };\n}\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\nexport interface BaseChatOpenAICallOptions\n extends BaseChatModelCallOptions, BaseFunctionCallOptions {\n /**\n * Additional options to pass to the underlying axios request.\n */\n options?: OpenAICoreRequestOptions;\n\n /**\n * A list of tools that the model may use to generate responses.\n * Each tool can be a function, a built-in tool, or a custom tool definition.\n * If not provided, the model will not use any tools.\n */\n tools?: ChatOpenAIToolType[];\n\n /**\n * Specifies which tool the model should use to respond.\n * Can be an {@link OpenAIToolChoice} or a {@link ResponsesToolChoice}.\n * If not set, the model will decide which tool to use automatically.\n */\n // TODO: break OpenAIToolChoice and ResponsesToolChoice into options sub classes\n tool_choice?: OpenAIToolChoice | ResponsesToolChoice;\n\n /**\n * Adds a prompt index to prompts passed to the model to track\n * what prompt is being used for a given generation.\n */\n promptIndex?: number;\n\n /**\n * An object specifying the format that the model must output.\n */\n response_format?: ChatOpenAIResponseFormat;\n\n /**\n * When provided, the completions API will make a best effort to sample\n * deterministically, such that repeated requests with the same `seed`\n * and parameters should return the same result.\n */\n seed?: number;\n\n /**\n * Additional options to pass to streamed completions.\n * If provided, this takes precedence over \"streamUsage\" set at\n * initialization time.\n */\n stream_options?: OpenAIClient.Chat.ChatCompletionStreamOptions;\n\n /**\n * The model may choose to call multiple functions in a single turn. You can\n * set parallel_tool_calls to false which ensures only one tool is called at most.\n * [Learn more](https://platform.openai.com/docs/guides/function-calling#parallel-function-calling)\n */\n parallel_tool_calls?: boolean;\n\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the tool definition. If `true`, the input schema will also be\n * validated according to\n * https://platform.openai.com/docs/guides/structured-outputs/supported-schemas.\n *\n * If `false`, input schema will not be validated and model output will not\n * be validated.\n *\n * If `undefined`, `strict` argument will not be passed to the model.\n */\n strict?: boolean;\n\n /**\n * Output types that you would like the model to generate for this request. Most\n * models are capable of generating text, which is the default:\n *\n * `[\"text\"]`\n *\n * The `gpt-4o-audio-preview` model can also be used to\n * [generate audio](https://platform.openai.com/docs/guides/audio). To request that\n * this model generate both text and audio responses, you can use:\n *\n * `[\"text\", \"audio\"]`\n */\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n /**\n * Parameters for audio output. Required when audio output is requested with\n * `modalities: [\"audio\"]`.\n * [Learn more](https://platform.openai.com/docs/guides/audio).\n */\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n /**\n * Static predicted output content, such as the content of a text file that is being regenerated.\n * [Learn more](https://platform.openai.com/docs/guides/latency-optimization#use-predicted-outputs).\n */\n prediction?: OpenAIClient.ChatCompletionPredictionContent;\n\n /**\n * Options for reasoning models.\n *\n * Note that some options, like reasoning summaries, are only available when using the responses\n * API. If these options are set, the responses API will be used to fulfill the request.\n *\n * These options will be ignored when not using a reasoning model.\n */\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Constrains effort on reasoning for reasoning models. Reduces reasoning in responses,\n * which can reduce latency and cost at the expense of quality.\n *\n * Accepts values: \"low\", \"medium\", or \"high\".\n *\n * @deprecated This is a convenience option that will be merged into the `reasoning` object.\n * Use `reasoning.effort` instead.\n */\n reasoningEffort?: OpenAIClient.Reasoning[\"effort\"];\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\"\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates. Replaces the `user` field.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey?: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport interface BaseChatOpenAIFields\n extends Partial<OpenAIChatInput>, BaseChatModelParams {\n /**\n * Optional configuration options for the OpenAI client.\n */\n configuration?: ClientOptions;\n}\n\nexport function getChatOpenAIModelParams<TParams extends BaseChatOpenAIFields>(\n modelOrParams?: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams | undefined {\n if (typeof modelOrParams === \"string\") {\n return { model: modelOrParams, ...(paramsArg ?? {}) } as TParams;\n }\n if (modelOrParams == null) {\n return paramsArg as TParams | undefined;\n }\n return modelOrParams;\n}\n\n/** @internal */\nexport abstract class BaseChatOpenAI<\n CallOptions extends BaseChatOpenAICallOptions,\n>\n extends BaseChatModel<CallOptions, AIMessageChunk>\n implements Partial<OpenAIChatInput>\n{\n temperature?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo\";\n\n modelKwargs?: OpenAIChatInput[\"modelKwargs\"];\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n timeout?: number;\n\n streaming = false;\n\n streamUsage = true;\n\n maxTokens?: number;\n\n logprobs?: boolean;\n\n topLogprobs?: number;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n __includeRawResponse?: boolean;\n\n /** @internal */\n client: OpenAIClient;\n\n /** @internal */\n clientConfig: ClientOptions;\n\n /**\n * Whether the model supports the `strict` argument when passing in tools.\n * If `undefined` the `strict` argument will not be passed to OpenAI.\n */\n supportsStrictToolCalling?: boolean;\n\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Must be set to `true` in tenancies with Zero Data Retention. Setting to `true` will disable\n * output storage in the Responses API, but this DOES NOT enable Zero Data Retention in your\n * OpenAI organization or project. This must be configured directly with OpenAI.\n *\n * See:\n * https://platform.openai.com/docs/guides/your-data\n * https://platform.openai.com/docs/api-reference/responses/create#responses-create-store\n *\n * @default false\n */\n zdrEnabled?: boolean | undefined;\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\" or \"priority\".\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n\n protected defaultOptions: CallOptions;\n\n _llmType() {\n return \"openai\";\n }\n\n static lc_name() {\n return \"ChatOpenAI\";\n }\n\n get callKeys() {\n return [\n ...super.callKeys,\n \"options\",\n \"function_call\",\n \"functions\",\n \"tools\",\n \"tool_choice\",\n \"promptIndex\",\n \"response_format\",\n \"seed\",\n \"reasoning\",\n \"reasoning_effort\",\n \"service_tier\",\n ];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n apiKey: \"openai_api_key\",\n modelName: \"model\",\n };\n }\n\n get lc_serializable_keys(): string[] {\n return [\n \"configuration\",\n \"logprobs\",\n \"topLogprobs\",\n \"prefixMessages\",\n \"supportsStrictToolCalling\",\n \"modalities\",\n \"audio\",\n \"temperature\",\n \"maxTokens\",\n \"topP\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"n\",\n \"logitBias\",\n \"user\",\n \"streaming\",\n \"streamUsage\",\n \"model\",\n \"modelName\",\n \"modelKwargs\",\n \"stop\",\n \"stopSequences\",\n \"timeout\",\n \"apiKey\",\n \"cache\",\n \"maxConcurrency\",\n \"maxRetries\",\n \"verbose\",\n \"callbacks\",\n \"tags\",\n \"metadata\",\n \"disableStreaming\",\n \"zdrEnabled\",\n \"reasoning\",\n \"promptCacheKey\",\n \"promptCacheRetention\",\n \"verbosity\",\n ];\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"openai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<\n OpenAIClient.Chat.ChatCompletionCreateParams,\n \"messages\"\n > & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams() {\n return this._identifyingParams();\n }\n\n constructor(fields?: BaseChatOpenAIFields) {\n super(fields ?? {});\n\n const configApiKey =\n typeof fields?.configuration?.apiKey === \"string\" ||\n typeof fields?.configuration?.apiKey === \"function\"\n ? fields?.configuration?.apiKey\n : undefined;\n this.apiKey =\n fields?.apiKey ??\n configApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.logprobs = fields?.logprobs;\n this.topLogprobs = fields?.topLogprobs;\n this.n = fields?.n ?? this.n;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n this.__includeRawResponse = fields?.__includeRawResponse;\n this.audio = fields?.audio;\n this.modalities = fields?.modalities;\n this.reasoning = fields?.reasoning;\n this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens;\n this.promptCacheKey = fields?.promptCacheKey ?? this.promptCacheKey;\n this.promptCacheRetention =\n fields?.promptCacheRetention ?? this.promptCacheRetention;\n this.verbosity = fields?.verbosity ?? this.verbosity;\n\n this.disableStreaming = fields?.disableStreaming === true;\n this.streaming = fields?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (fields?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n\n // If `supportsStrictToolCalling` is explicitly set, use that value.\n // Else leave undefined so it's not passed to OpenAI.\n if (fields?.supportsStrictToolCalling !== undefined) {\n this.supportsStrictToolCalling = fields.supportsStrictToolCalling;\n }\n\n if (fields?.service_tier !== undefined) {\n this.service_tier = fields.service_tier;\n }\n\n this.zdrEnabled = fields?.zdrEnabled ?? false;\n\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n }\n\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n protected _getReasoningParams(\n options?: this[\"ParsedCallOptions\"]\n ): OpenAIClient.Reasoning | undefined {\n if (!isReasoningModel(this.model)) {\n return;\n }\n\n // apply options in reverse order of importance -- newer options supersede older options\n let reasoning: OpenAIClient.Reasoning | undefined;\n if (this.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...this.reasoning,\n };\n }\n if (options?.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...options.reasoning,\n };\n }\n\n // Coalesce reasoningEffort into reasoning.effort if reasoning.effort is not already set\n if (\n options?.reasoningEffort !== undefined &&\n reasoning?.effort === undefined\n ) {\n reasoning = {\n ...reasoning,\n effort: options.reasoningEffort,\n };\n }\n\n return reasoning;\n }\n\n /**\n * Returns an openai compatible response format from a set of options\n * @internal\n */\n protected _getResponseFormat(\n resFormat?: CallOptions[\"response_format\"]\n ): ResponseFormatConfiguration | undefined {\n if (\n resFormat &&\n resFormat.type === \"json_schema\" &&\n resFormat.json_schema.schema &&\n isInteropZodSchema(resFormat.json_schema.schema)\n ) {\n return interopZodResponseFormat(\n resFormat.json_schema.schema,\n resFormat.json_schema.name,\n {\n description: resFormat.json_schema.description,\n }\n );\n }\n return resFormat as ResponseFormatConfiguration | undefined;\n }\n\n protected _combineCallOptions(\n additionalOptions?: this[\"ParsedCallOptions\"]\n ): this[\"ParsedCallOptions\"] {\n return {\n ...this.defaultOptions,\n ...(additionalOptions ?? {}),\n };\n }\n\n /** @internal */\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n // TODO: move to completions class\n protected _convertChatOpenAIToolToCompletionsTool(\n tool: ChatOpenAIToolType,\n fields?: { strict?: boolean }\n ): OpenAIClient.ChatCompletionTool {\n if (isCustomTool(tool)) {\n return convertResponsesCustomTool(tool.metadata.customTool);\n }\n if (isOpenAIFunctionTool(tool)) {\n if (fields?.strict !== undefined) {\n return {\n ...tool,\n function: {\n ...tool.function,\n strict: fields.strict,\n },\n };\n }\n\n return tool;\n }\n return _convertToOpenAITool(tool, fields);\n }\n\n override bindTools(\n tools: ChatOpenAIToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n let strict: boolean | undefined;\n if (kwargs?.strict !== undefined) {\n strict = kwargs.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n return this.withConfig({\n tools: tools.map((tool) => {\n // Built-in tools and custom tools pass through as-is\n if (isBuiltInTool(tool) || isCustomTool(tool)) {\n return tool;\n }\n // Tools with providerToolDefinition (e.g., localShell, shell, computerUse, applyPatch)\n // should use their provider-specific definition\n if (hasProviderToolDefinition(tool)) {\n return tool.extras.providerToolDefinition;\n }\n // Regular tools get converted to OpenAI function format\n const converted = this._convertChatOpenAIToolToCompletionsTool(tool, {\n strict,\n });\n if (isLangChainTool(tool) && tool.extras?.defer_loading === true) {\n return { ...converted, defer_loading: true };\n }\n return converted;\n }),\n ...kwargs,\n } as Partial<CallOptions>);\n }\n\n override async stream(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.stream(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n override async invoke(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.invoke(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n /** @ignore */\n _combineLLMOutput(...llmOutputs: OpenAILLMOutput[]): OpenAILLMOutput {\n return llmOutputs.reduce<{\n [key in keyof OpenAILLMOutput]: Required<OpenAILLMOutput[key]>;\n }>(\n (acc, llmOutput) => {\n if (llmOutput && llmOutput.tokenUsage) {\n acc.tokenUsage.completionTokens +=\n llmOutput.tokenUsage.completionTokens ?? 0;\n acc.tokenUsage.promptTokens += llmOutput.tokenUsage.promptTokens ?? 0;\n acc.tokenUsage.totalTokens += llmOutput.tokenUsage.totalTokens ?? 0;\n }\n return acc;\n },\n {\n tokenUsage: {\n completionTokens: 0,\n promptTokens: 0,\n totalTokens: 0,\n },\n }\n );\n }\n\n async getNumTokensFromMessages(messages: BaseMessage[]) {\n let totalCount = 0;\n let tokensPerMessage = 0;\n let tokensPerName = 0;\n\n // From: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb\n if (this.model === \"gpt-3.5-turbo-0301\") {\n tokensPerMessage = 4;\n tokensPerName = -1;\n } else {\n tokensPerMessage = 3;\n tokensPerName = 1;\n }\n\n const countPerMessage = await Promise.all(\n messages.map(async (message) => {\n const [textCount, roleCount] = await Promise.all([\n this.getNumTokens(message.content),\n this.getNumTokens(messageToOpenAIRole(message)),\n ]);\n const nameCount =\n message.name !== undefined\n ? tokensPerName + (await this.getNumTokens(message.name))\n : 0;\n let count = textCount + tokensPerMessage + roleCount + nameCount;\n\n // From: https://github.com/hmarr/openai-chat-tokens/blob/main/src/index.ts messageTokenEstimate\n const openAIMessage = message;\n if (openAIMessage._getType() === \"function\") {\n count -= 2;\n }\n if (openAIMessage.additional_kwargs?.function_call) {\n count += 3;\n }\n if (openAIMessage?.additional_kwargs.function_call?.name) {\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.name\n );\n }\n if (openAIMessage.additional_kwargs.function_call?.arguments) {\n try {\n count += await this.getNumTokens(\n // Remove newlines and spaces\n JSON.stringify(\n JSON.parse(\n openAIMessage.additional_kwargs.function_call?.arguments\n )\n )\n );\n } catch (error) {\n console.error(\n \"Error parsing function arguments\",\n error,\n JSON.stringify(openAIMessage.additional_kwargs.function_call)\n );\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.arguments\n );\n }\n }\n\n totalCount += count;\n return count;\n })\n );\n\n totalCount += 3; // every reply is primed with <|start|>assistant<|message|>\n\n return { totalCount, countPerMessage };\n }\n\n /** @internal */\n protected async _getNumTokensFromGenerations(generations: ChatGeneration[]) {\n const generationUsages = await Promise.all(\n generations.map(async (generation) => {\n if (generation.message.additional_kwargs?.function_call) {\n return (await this.getNumTokensFromMessages([generation.message]))\n .countPerMessage[0];\n } else {\n return await this.getNumTokens(generation.message.content);\n }\n })\n );\n\n return generationUsages.reduce((a, b) => a + b, 0);\n }\n\n /** @internal */\n protected async _getEstimatedTokenCountFromPrompt(\n messages: BaseMessage[],\n functions?: OpenAIClient.Chat.ChatCompletionCreateParams.Function[],\n function_call?:\n | \"none\"\n | \"auto\"\n | OpenAIClient.Chat.ChatCompletionFunctionCallOption\n ): Promise<number> {\n // It appears that if functions are present, the first system message is padded with a trailing newline. This\n // was inferred by trying lots of combinations of messages and functions and seeing what the token counts were.\n\n let tokens = (await this.getNumTokensFromMessages(messages)).totalCount;\n\n // If there are functions, add the function definitions as they count towards token usage\n if (functions && function_call !== \"auto\") {\n const promptDefinitions = formatFunctionDefinitions(\n functions as unknown as FunctionDef[]\n );\n tokens += await this.getNumTokens(promptDefinitions);\n tokens += 9; // Add nine per completion\n }\n\n // If there's a system message _and_ functions are present, subtract four tokens. I assume this is because\n // functions typically add a system message, but reuse the first one if it's already there. This offsets\n // the extra 9 tokens added by the function definitions.\n if (functions && messages.find((m) => m._getType() === \"system\")) {\n tokens -= 4;\n }\n\n // If function_call is 'none', add one token.\n // If it's a FunctionCall object, add 4 + the number of tokens in the function name.\n // If it's undefined or 'auto', don't add anything.\n if (function_call === \"none\") {\n tokens += 1;\n } else if (typeof function_call === \"object\") {\n tokens += (await this.getNumTokens(function_call.name)) + 4;\n }\n\n return tokens;\n }\n\n /**\n * Moderate content using OpenAI's Moderation API.\n *\n * This method checks whether content violates OpenAI's content policy by\n * analyzing text for categories such as hate, harassment, self-harm,\n * sexual content, violence, and more.\n *\n * @param input - The text or array of texts to moderate\n * @param params - Optional parameters for the moderation request\n * @param params.model - The moderation model to use. Defaults to \"omni-moderation-latest\".\n * @param params.options - Additional options to pass to the underlying request\n * @returns A promise that resolves to the moderation response containing results for each input\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n *\n * // Moderate a single text\n * const result = await model.moderateContent(\"This is a test message\");\n * console.log(result.results[0].flagged); // false\n * console.log(result.results[0].categories); // { hate: false, harassment: false, ... }\n *\n * // Moderate multiple texts\n * const results = await model.moderateContent([\n * \"Hello, how are you?\",\n * \"This is inappropriate content\"\n * ]);\n * results.results.forEach((result, index) => {\n * console.log(`Text ${index + 1} flagged:`, result.flagged);\n * });\n *\n * // Use a specific moderation model\n * const stableResult = await model.moderateContent(\n * \"Test content\",\n * { model: \"omni-moderation-latest\" }\n * );\n * ```\n */\n async moderateContent(\n input: string | string[],\n params?: {\n model?: OpenAI.ModerationModel;\n options?: OpenAICoreRequestOptions;\n }\n ): Promise<OpenAIClient.ModerationCreateResponse> {\n const clientOptions = this._getClientOptions(params?.options);\n const moderationModel = params?.model ?? \"omni-moderation-latest\";\n const moderationRequest: OpenAIClient.ModerationCreateParams = {\n input,\n model: moderationModel,\n };\n\n return this.caller.call(async () => {\n try {\n const response = await this.client.moderations.create(\n moderationRequest,\n clientOptions\n );\n return response;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 128000\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n /** @internal */\n protected _getStructuredOutputMethod(\n config: StructuredOutputMethodOptions<boolean>\n ) {\n const ensuredConfig = { ...config };\n if (\n !this.model.startsWith(\"gpt-3\") &&\n !this.model.startsWith(\"gpt-4-\") &&\n this.model !== \"gpt-4\"\n ) {\n if (ensuredConfig?.method === undefined) {\n return \"jsonSchema\";\n }\n } else if (ensuredConfig.method === \"jsonSchema\") {\n console.warn(\n `[WARNING]: JSON Schema is not supported for model \"${this.model}\". Falling back to tool calling.`\n );\n }\n return ensuredConfig.method;\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Add structured output to the model.\n *\n * The OpenAI model family supports the following structured output methods:\n * - `jsonSchema`: Use the `response_format` field in the response to return a JSON schema. Only supported with the `gpt-4o-mini`,\n * `gpt-4o-mini-2024-07-18`, and `gpt-4o-2024-08-06` model snapshots and later.\n * - `functionCalling`: Function calling is useful when you are building an application that bridges the models and functionality\n * of your application.\n * - `jsonMode`: JSON mode is a more basic version of the Structured Outputs feature. While JSON mode ensures that model\n * output is valid JSON, Structured Outputs reliably matches the model's output to the schema you specify.\n * We recommend you use `functionCalling` or `jsonSchema` if it is supported for your use case.\n *\n * The default method is `functionCalling`.\n *\n * @see https://platform.openai.com/docs/guides/structured-outputs\n * @param outputSchema - The schema to use for structured output.\n * @param config - The structured output method options.\n * @returns The model with structured output.\n */\n withStructuredOutput<\n RunOutput extends Record<string, unknown> = Record<string, unknown>,\n >(\n outputSchema:\n | SerializableSchema<RunOutput>\n | InteropZodType<RunOutput>\n | Record<string, unknown>,\n config?: StructuredOutputMethodOptions<boolean>\n ) {\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n\n if (config?.strict !== undefined && config.method === \"jsonMode\") {\n throw new Error(\n \"Argument `strict` is only supported for `method` = 'function_calling'\"\n );\n }\n\n const method = getStructuredOutputMethod(this.model, config?.method);\n\n if (method === \"jsonMode\") {\n outputParser = createContentParser(schema);\n const asJsonSchema = toJsonSchema(schema);\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: { type: \"json_object\" },\n ls_structured_output_format: {\n kwargs: { method: \"json_mode\" },\n schema: { title: name ?? \"extract\", ...asJsonSchema },\n },\n } as Partial<CallOptions>);\n } else if (method === \"jsonSchema\") {\n const asJsonSchema = toJsonSchema(schema);\n const openaiJsonSchemaParams = {\n name: name ?? \"extract\",\n description: getSchemaDescription(asJsonSchema),\n schema: isInteropZodSchema(schema) ? schema : asJsonSchema,\n strict: config?.strict,\n };\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: {\n type: \"json_schema\",\n json_schema: openaiJsonSchemaParams,\n },\n ls_structured_output_format: {\n kwargs: { method: \"json_schema\" },\n schema: {\n title: openaiJsonSchemaParams.name,\n description: openaiJsonSchemaParams.description,\n ...asJsonSchema,\n },\n },\n } as Partial<CallOptions>);\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const altParser = createContentParser(schema);\n outputParser = RunnableLambda.from<AIMessageChunk, RunOutput>(\n async (aiMessage: AIMessageChunk) => {\n if (\"parsed\" in aiMessage.additional_kwargs) {\n return aiMessage.additional_kwargs.parsed as RunOutput;\n }\n return altParser.invoke(aiMessage.content as string);\n }\n );\n } else {\n outputParser = new JsonOutputParser<RunOutput>();\n }\n } else {\n let functionName = name ?? \"extract\";\n const asJsonSchema = toJsonSchema(schema);\n\n // Is function calling\n let toolFunction: FunctionDefinition;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n toolFunction = {\n name: functionName,\n description: asJsonSchema.description,\n parameters: asJsonSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n toolFunction = schema as unknown as FunctionDefinition;\n functionName = schema.name;\n } else {\n functionName = (schema.title as string) ?? functionName;\n toolFunction = {\n name: functionName,\n description: (schema.description as string) ?? \"\",\n parameters: schema,\n };\n }\n\n llm = this.withConfig({\n outputVersion: \"v0\",\n tools: [{ type: \"function\" as const, function: toolFunction }],\n tool_choice: {\n type: \"function\" as const,\n function: { name: functionName },\n },\n ls_structured_output_format: {\n kwargs: { method: \"function_calling\" },\n schema: { title: functionName, ...asJsonSchema },\n },\n // Do not pass `strict` argument to OpenAI if `config.strict` is undefined\n ...(config?.strict !== undefined ? { strict: config.strict } : {}),\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n }\n\n return assembleStructuredOutputPipeline(llm, outputParser, includeRaw);\n }\n}\n"],"mappings":"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"} |
@@ -5,7 +5,7 @@ import { ChatOpenAIToolType, OpenAIToolChoice, ResponsesToolChoice } from "../utils/tools.cjs"; | ||
| import { BaseChatModel, BaseChatModelCallOptions, BaseChatModelParams, LangSmithParams } from "@langchain/core/language_models/chat_models"; | ||
| import * as _langchain_core_messages0 from "@langchain/core/messages"; | ||
| import * as _$_langchain_core_messages0 from "@langchain/core/messages"; | ||
| import { AIMessageChunk, BaseMessage } from "@langchain/core/messages"; | ||
| import { ChatGeneration } from "@langchain/core/outputs"; | ||
| import { BaseFunctionCallOptions, BaseLanguageModelInput, StructuredOutputMethodOptions } from "@langchain/core/language_models/base"; | ||
| import * as _langchain_core_utils_stream0 from "@langchain/core/utils/stream"; | ||
| import * as _$_langchain_core_utils_stream0 from "@langchain/core/utils/stream"; | ||
| import { ModelProfile } from "@langchain/core/language_models/profile"; | ||
@@ -253,4 +253,4 @@ import { Runnable } from "@langchain/core/runnables"; | ||
| bindTools(tools: ChatOpenAIToolType[], kwargs?: Partial<CallOptions>): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions>; | ||
| stream(input: BaseLanguageModelInput, options?: CallOptions): Promise<_langchain_core_utils_stream0.IterableReadableStream<AIMessageChunk<_langchain_core_messages0.MessageStructure<_langchain_core_messages0.MessageToolSet>>>>; | ||
| invoke(input: BaseLanguageModelInput, options?: CallOptions): Promise<AIMessageChunk<_langchain_core_messages0.MessageStructure<_langchain_core_messages0.MessageToolSet>>>; | ||
| stream(input: BaseLanguageModelInput, options?: CallOptions): Promise<_$_langchain_core_utils_stream0.IterableReadableStream<AIMessageChunk<_$_langchain_core_messages0.MessageStructure<_$_langchain_core_messages0.MessageToolSet>>>>; | ||
| invoke(input: BaseLanguageModelInput, options?: CallOptions): Promise<AIMessageChunk<_$_langchain_core_messages0.MessageStructure<_$_langchain_core_messages0.MessageToolSet>>>; | ||
| /** @ignore */ | ||
@@ -257,0 +257,0 @@ _combineLLMOutput(...llmOutputs: OpenAILLMOutput[]): OpenAILLMOutput; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"base.d.cts","names":[],"sources":["../../src/chat_models/base.ts"],"mappings":";;;;;;;;;;;;;;;UAwEU,eAAA;EACR,UAAA;IACE,gBAAA;IACA,YAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAMa,yBAAA,SACP,wBAAA,EAA0B,uBAAA;EAThC;;;EAaF,OAAA,GAAU,wBAAA;EAXG;AAMf;;;;EAYE,KAAA,GAAQ,kBAAA;EAQM;;;;;EAAd,WAAA,GAAc,gBAAA,GAAmB,mBAAA;EAkEzB;;;;EA5DR,WAAA;EAyGuB;;;EApGvB,eAAA,GAAkB,wBAAA;EA9BuC;;;;;EAqCzD,IAAA;EA1BA;;;;;EAiCA,cAAA,GAAiB,MAAA,CAAa,IAAA,CAAK,2BAAA;EAdnC;;;;;EAqBA,mBAAA;EAPmC;;;;;;;;;;;EAoBnC,MAAA;EA2BA;;;;;;;;;;;;EAbA,UAAA,GAAa,KAAA,CAAM,MAAA,CAAa,IAAA,CAAK,sBAAA;EA+CrC;;;;;EAxCA,KAAA,GAAQ,MAAA,CAAa,IAAA,CAAK,wBAAA;EAkDM;AAGlC;;;EA/CE,UAAA,GAAa,MAAA,CAAa,+BAAA;EAoDV;;;;;;;;EA1ChB,SAAA,GAAY,MAAA,CAAa,SAAA;EA0CT;;;AAiBlB;;;;;;EAhDE,eAAA,GAAkB,MAAA,CAAa,SAAA;EAgEnB;;;;EA1DZ,YAAA,GAAe,MAAA,CAAa,IAAA,CAAK,0BAAA;EAoGzB;;;;;EA7FR,cAAA;EAqIY;;;EAhIZ,oBAAA,GAAuB,yBAAA;EAqOrB;;;EAhOF,SAAA,GAAY,oBAAA;AAAA;AAAA,UAGG,oBAAA,SACP,OAAA,CAAQ,eAAA,GAAkB,mBAAA;EA+Ob;;;EA3OrB,aAAA,GAAgB,aAAA;AAAA;;uBAiBI,cAAA,qBACA,yBAAA,UAEZ,aAAA,CAAc,WAAA,EAAa,cAAA,aACxB,OAAA,CAAQ,eAAA;EAEnB,WAAA;EAEA,IAAA;EAEA,gBAAA;EAEA,eAAA;EAEA,CAAA;EAEA,SAAA,GAAY,MAAA;EAEZ,KAAA;EAEA,WAAA,GAAc,eAAA;EAEd,IAAA;EAEA,aAAA;EAEA,IAAA;EAEA,OAAA;EAEA,SAAA;EAEA,WAAA;EAEA,SAAA;EAEA,QAAA;EAEA,WAAA;EAEA,MAAA,GAAS,YAAA;EAET,YAAA;EAEA,oBAAA;EAuaiC;EApajC,MAAA,EAAQ,MAAA;EA2biC;EAxbzC,YAAA,EAAc,aAAA;EAggB4C;;;;EA1f1D,yBAAA;EAEA,KAAA,GAAQ,MAAA,CAAa,IAAA,CAAK,wBAAA;EAE1B,UAAA,GAAa,KAAA,CAAM,MAAA,CAAa,IAAA,CAAK,sBAAA;EAErC,SAAA,GAAY,MAAA,CAAa,SAAA;EAylBd;;;;;;;;;;;EA5kBX,UAAA;EAspBY;;;;EAhpBZ,YAAA,GAAe,MAAA,CAAa,IAAA,CAAK,0BAAA;EAupBZ;;;;;EAhpBrB,cAAA;EAqpBY;;;EAhpBZ,oBAAA,GAAuB,yBAAA;EAopBH;;;EA/oBpB,SAAA,GAAY,oBAAA;EAAA,UAEF,cAAA,EAAgB,WAAA;EAE1B,QAAA,CAAA;EAAA,OAIO,OAAA,CAAA;EAAA,IAIH,QAAA,CAAA;EAiBJ,eAAA;EAAA,IAEI,UAAA,CAAA;IAAA,CAAiB,GAAA;EAAA;EAAA,IAOjB,UAAA,CAAA,GAAc,MAAA;EAAA,IAOd,oBAAA,CAAA;EA0CJ,WAAA,CAAY,OAAA,8BAAqC,eAAA;EAtLzC;EAmMR,kBAAA,CAAA,GAAsB,IAAA,CACpB,MAAA,CAAa,IAAA,CAAK,0BAAA;IAGlB,UAAA;EAAA,IACE,aAAA;EA1MJ;;;EAqNA,iBAAA,CAAA,GAAiB,IAAA,CAAA,QAAA,CAAA,0BAAA;;;EAIjB,WAAA,CAAY,MAAA,GAAS,oBAAA;EApNrB;;;;EAAA,UAgSU,mBAAA,CACR,OAAA,+BACC,MAAA,CAAa,SAAA;EAxRhB;;;;EAAA,UA8TU,kBAAA,CACR,SAAA,GAAY,WAAA,sBACX,2BAAA;EAAA,UAkBO,mBAAA,CACR,iBAAA;EA3UF;EAoVA,iBAAA,CACE,OAAA,EAAS,wBAAA,eACR,wBAAA;EAAA,UA6BO,uCAAA,CACR,IAAA,EAAM,kBAAA,EACN,MAAA;IAAW,MAAA;EAAA,IACV,MAAA,CAAa,kBAAA;EAoBP,SAAA,CACP,KAAA,EAAO,kBAAA,IACP,MAAA,GAAS,OAAA,CAAQ,WAAA,IAChB,QAAA,CAAS,sBAAA,EAAwB,cAAA,EAAgB,WAAA;EA+BrC,MAAA,CAAO,KAAA,EAAO,sBAAA,EAAwB,OAAA,GAAU,WAAA,GAAW,OAAA,CAAA,6BAAA,CAAA,sBAAA,CAAA,cAAA,CAAA,yBAAA,CAAA,gBAAA,CAAA,yBAAA,CAAA,cAAA;EAO3D,MAAA,CAAO,KAAA,EAAO,sBAAA,EAAwB,OAAA,GAAU,WAAA,GAAW,OAAA,CAAA,cAAA,CAAA,yBAAA,CAAA,gBAAA,CAAA,yBAAA,CAAA,cAAA;EAna1E;EA2aA,iBAAA,CAAA,GAAqB,UAAA,EAAY,eAAA,KAAoB,eAAA;EAuB/C,wBAAA,CAAyB,QAAA,EAAU,WAAA,KAAa,OAAA;;;;EAxbtD;EAAA,UAggBgB,4BAAA,CAA6B,WAAA,EAAa,cAAA,KAAgB,OAAA;EA1f1E;EAAA,UA0gBgB,iCAAA,CACd,QAAA,EAAU,WAAA,IACV,SAAA,GAAY,MAAA,CAAa,IAAA,CAAK,0BAAA,CAA2B,QAAA,IACzD,aAAA,qBAGI,MAAA,CAAa,IAAA,CAAK,gCAAA,GACrB,OAAA;EA/gBK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAulBF,eAAA,CACJ,KAAA,qBACA,MAAA;IACE,KAAA,GAAQ,QAAA,CAAO,eAAA;IACf,OAAA,GAAU,wBAAA;EAAA,IAEX,OAAA,CAAQ,MAAA,CAAa,wBAAA;EAjcxB;;;;;;;;;;;;;;;;;EAAA,IAweI,OAAA,CAAA,GAAW,YAAA;EA3Vb;EAAA,UAgWQ,0BAAA,CACR,MAAA,EAAQ,6BAAA;EAmBV,oBAAA,mBAEoB,MAAA,gBAAsB,MAAA,cAAA,CAExC,YAAA,EACI,cAAA,CAAe,SAAA,IACf,kBAAA,CAAmB,SAAA,IAEnB,MAAA,eACJ,MAAA,GAAS,6BAAA,UACR,QAAA,CAAS,sBAAA,EAAwB,SAAA;EAEpC,oBAAA,mBAEoB,MAAA,gBAAsB,MAAA,cAAA,CAExC,YAAA,EACI,cAAA,CAAe,SAAA,IACf,kBAAA,CAAmB,SAAA,IAEnB,MAAA,eACJ,MAAA,GAAS,6BAAA,SACR,QAAA,CAAS,sBAAA;IAA0B,GAAA,EAAK,WAAA;IAAa,MAAA,EAAQ,SAAA;EAAA;EAEhE,oBAAA,mBAEoB,MAAA,gBAAsB,MAAA,cAAA,CAExC,YAAA,EACI,cAAA,CAAe,SAAA,IACf,kBAAA,CAAmB,SAAA,IAEnB,MAAA,eACJ,MAAA,GAAS,6BAAA,YAEP,QAAA,CAAS,sBAAA,EAAwB,SAAA,IACjC,QAAA,CAAS,sBAAA;IAA0B,GAAA,EAAK,WAAA;IAAa,MAAA,EAAQ,SAAA;EAAA;AAAA"} | ||
| {"version":3,"file":"base.d.cts","names":[],"sources":["../../src/chat_models/base.ts"],"mappings":";;;;;;;;;;;;;;;UAwEU,eAAA;EACR,UAAA;IACE,gBAAA;IACA,YAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAMa,yBAAA,SACP,wBAAA,EAA0B,uBAAA;EAThC;;;EAaF,OAAA,GAAU,wBAAA;EAXG;AAMf;;;;EAYE,KAAA,GAAQ,kBAAA;EAQM;;;;;EAAd,WAAA,GAAc,gBAAA,GAAmB,mBAAA;EAkEzB;;;;EA5DR,WAAA;EAyGuB;;;EApGvB,eAAA,GAAkB,wBAAA;EA9BuC;;;;;EAqCzD,IAAA;EA1BA;;;;;EAiCA,cAAA,GAAiB,MAAA,CAAa,IAAA,CAAK,2BAAA;EAdnC;;;;;EAqBA,mBAAA;EAPmC;;;;;;;;;;;EAoBnC,MAAA;EA2BA;;;;;;;;;;;;EAbA,UAAA,GAAa,KAAA,CAAM,MAAA,CAAa,IAAA,CAAK,sBAAA;EA+CrC;;;;;EAxCA,KAAA,GAAQ,MAAA,CAAa,IAAA,CAAK,wBAAA;EAkDM;AAGlC;;;EA/CE,UAAA,GAAa,MAAA,CAAa,+BAAA;EAoDV;;;;;;;;EA1ChB,SAAA,GAAY,MAAA,CAAa,SAAA;EA0CT;;;AAiBlB;;;;;;EAhDE,eAAA,GAAkB,MAAA,CAAa,SAAA;EAgEnB;;;;EA1DZ,YAAA,GAAe,MAAA,CAAa,IAAA,CAAK,0BAAA;EAoGzB;;;;;EA7FR,cAAA;EAqIY;;;EAhIZ,oBAAA,GAAuB,yBAAA;EAqOrB;;;EAhOF,SAAA,GAAY,oBAAA;AAAA;AAAA,UAGG,oBAAA,SACP,OAAA,CAAQ,eAAA,GAAkB,mBAAA;EA+Ob;;;EA3OrB,aAAA,GAAgB,aAAA;AAAA;;uBAiBI,cAAA,qBACA,yBAAA,UAEZ,aAAA,CAAc,WAAA,EAAa,cAAA,aACxB,OAAA,CAAQ,eAAA;EAEnB,WAAA;EAEA,IAAA;EAEA,gBAAA;EAEA,eAAA;EAEA,CAAA;EAEA,SAAA,GAAY,MAAA;EAEZ,KAAA;EAEA,WAAA,GAAc,eAAA;EAEd,IAAA;EAEA,aAAA;EAEA,IAAA;EAEA,OAAA;EAEA,SAAA;EAEA,WAAA;EAEA,SAAA;EAEA,QAAA;EAEA,WAAA;EAEA,MAAA,GAAS,YAAA;EAET,YAAA;EAEA,oBAAA;EAuaiC;EApajC,MAAA,EAAQ,MAAA;EA2biC;EAxbzC,YAAA,EAAc,aAAA;EAggB4C;;;;EA1f1D,yBAAA;EAEA,KAAA,GAAQ,MAAA,CAAa,IAAA,CAAK,wBAAA;EAE1B,UAAA,GAAa,KAAA,CAAM,MAAA,CAAa,IAAA,CAAK,sBAAA;EAErC,SAAA,GAAY,MAAA,CAAa,SAAA;EAylBd;;;;;;;;;;;EA5kBX,UAAA;EAspBY;;;;EAhpBZ,YAAA,GAAe,MAAA,CAAa,IAAA,CAAK,0BAAA;EAupBZ;;;;;EAhpBrB,cAAA;EAqpBY;;;EAhpBZ,oBAAA,GAAuB,yBAAA;EAopBH;;;EA/oBpB,SAAA,GAAY,oBAAA;EAAA,UAEF,cAAA,EAAgB,WAAA;EAE1B,QAAA,CAAA;EAAA,OAIO,OAAA,CAAA;EAAA,IAIH,QAAA,CAAA;EAiBJ,eAAA;EAAA,IAEI,UAAA,CAAA;IAAA,CAAiB,GAAA;EAAA;EAAA,IAOjB,UAAA,CAAA,GAAc,MAAA;EAAA,IAOd,oBAAA,CAAA;EA0CJ,WAAA,CAAY,OAAA,8BAAqC,eAAA;EAtLzC;EAmMR,kBAAA,CAAA,GAAsB,IAAA,CACpB,MAAA,CAAa,IAAA,CAAK,0BAAA;IAGlB,UAAA;EAAA,IACE,aAAA;EA1MJ;;;EAqNA,iBAAA,CAAA,GAAiB,IAAA,CAAA,QAAA,CAAA,0BAAA;;;EAIjB,WAAA,CAAY,MAAA,GAAS,oBAAA;EApNrB;;;;EAAA,UAgSU,mBAAA,CACR,OAAA,+BACC,MAAA,CAAa,SAAA;EAxRhB;;;;EAAA,UA8TU,kBAAA,CACR,SAAA,GAAY,WAAA,sBACX,2BAAA;EAAA,UAkBO,mBAAA,CACR,iBAAA;EA3UF;EAoVA,iBAAA,CACE,OAAA,EAAS,wBAAA,eACR,wBAAA;EAAA,UA6BO,uCAAA,CACR,IAAA,EAAM,kBAAA,EACN,MAAA;IAAW,MAAA;EAAA,IACV,MAAA,CAAa,kBAAA;EAoBP,SAAA,CACP,KAAA,EAAO,kBAAA,IACP,MAAA,GAAS,OAAA,CAAQ,WAAA,IAChB,QAAA,CAAS,sBAAA,EAAwB,cAAA,EAAgB,WAAA;EA+BrC,MAAA,CAAO,KAAA,EAAO,sBAAA,EAAwB,OAAA,GAAU,WAAA,GAAW,OAAA,CAAA,+BAAA,CAAA,sBAAA,CAAA,cAAA,CAAA,2BAAA,CAAA,gBAAA,CAAA,2BAAA,CAAA,cAAA;EAO3D,MAAA,CAAO,KAAA,EAAO,sBAAA,EAAwB,OAAA,GAAU,WAAA,GAAW,OAAA,CAAA,cAAA,CAAA,2BAAA,CAAA,gBAAA,CAAA,2BAAA,CAAA,cAAA;EAna1E;EA2aA,iBAAA,CAAA,GAAqB,UAAA,EAAY,eAAA,KAAoB,eAAA;EAuB/C,wBAAA,CAAyB,QAAA,EAAU,WAAA,KAAa,OAAA;;;;EAxbtD;EAAA,UAggBgB,4BAAA,CAA6B,WAAA,EAAa,cAAA,KAAgB,OAAA;EA1f1E;EAAA,UA0gBgB,iCAAA,CACd,QAAA,EAAU,WAAA,IACV,SAAA,GAAY,MAAA,CAAa,IAAA,CAAK,0BAAA,CAA2B,QAAA,IACzD,aAAA,qBAGI,MAAA,CAAa,IAAA,CAAK,gCAAA,GACrB,OAAA;EA/gBK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAulBF,eAAA,CACJ,KAAA,qBACA,MAAA;IACE,KAAA,GAAQ,QAAA,CAAO,eAAA;IACf,OAAA,GAAU,wBAAA;EAAA,IAEX,OAAA,CAAQ,MAAA,CAAa,wBAAA;EAjcxB;;;;;;;;;;;;;;;;;EAAA,IAweI,OAAA,CAAA,GAAW,YAAA;EA3Vb;EAAA,UAgWQ,0BAAA,CACR,MAAA,EAAQ,6BAAA;EAmBV,oBAAA,mBAEoB,MAAA,gBAAsB,MAAA,cAAA,CAExC,YAAA,EACI,cAAA,CAAe,SAAA,IACf,kBAAA,CAAmB,SAAA,IAEnB,MAAA,eACJ,MAAA,GAAS,6BAAA,UACR,QAAA,CAAS,sBAAA,EAAwB,SAAA;EAEpC,oBAAA,mBAEoB,MAAA,gBAAsB,MAAA,cAAA,CAExC,YAAA,EACI,cAAA,CAAe,SAAA,IACf,kBAAA,CAAmB,SAAA,IAEnB,MAAA,eACJ,MAAA,GAAS,6BAAA,SACR,QAAA,CAAS,sBAAA;IAA0B,GAAA,EAAK,WAAA;IAAa,MAAA,EAAQ,SAAA;EAAA;EAEhE,oBAAA,mBAEoB,MAAA,gBAAsB,MAAA,cAAA,CAExC,YAAA,EACI,cAAA,CAAe,SAAA,IACf,kBAAA,CAAmB,SAAA,IAEnB,MAAA,eACJ,MAAA,GAAS,6BAAA,YAEP,QAAA,CAAS,sBAAA,EAAwB,SAAA,IACjC,QAAA,CAAS,sBAAA;IAA0B,GAAA,EAAK,WAAA;IAAa,MAAA,EAAQ,SAAA;EAAA;AAAA"} |
| import { ChatOpenAIToolType, OpenAIToolChoice, ResponsesToolChoice } from "../utils/tools.js"; | ||
| import { ChatOpenAIResponseFormat, OpenAIApiKey, OpenAICacheRetentionParam, OpenAICallOptions, OpenAIChatInput, OpenAICoreRequestOptions, OpenAIVerbosityParam, ResponseFormatConfiguration } from "../types.js"; | ||
| import OpenAI$1, { ClientOptions, OpenAI } from "openai"; | ||
| import * as _langchain_core_messages0 from "@langchain/core/messages"; | ||
| import * as _$_langchain_core_messages0 from "@langchain/core/messages"; | ||
| import { AIMessageChunk, BaseMessage } from "@langchain/core/messages"; | ||
@@ -12,3 +12,3 @@ import { ChatGeneration } from "@langchain/core/outputs"; | ||
| import { SerializableSchema } from "@langchain/core/utils/standard_schema"; | ||
| import * as _langchain_core_utils_stream0 from "@langchain/core/utils/stream"; | ||
| import * as _$_langchain_core_utils_stream0 from "@langchain/core/utils/stream"; | ||
| import { ModelProfile } from "@langchain/core/language_models/profile"; | ||
@@ -253,4 +253,4 @@ | ||
| bindTools(tools: ChatOpenAIToolType[], kwargs?: Partial<CallOptions>): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions>; | ||
| stream(input: BaseLanguageModelInput, options?: CallOptions): Promise<_langchain_core_utils_stream0.IterableReadableStream<AIMessageChunk<_langchain_core_messages0.MessageStructure<_langchain_core_messages0.MessageToolSet>>>>; | ||
| invoke(input: BaseLanguageModelInput, options?: CallOptions): Promise<AIMessageChunk<_langchain_core_messages0.MessageStructure<_langchain_core_messages0.MessageToolSet>>>; | ||
| stream(input: BaseLanguageModelInput, options?: CallOptions): Promise<_$_langchain_core_utils_stream0.IterableReadableStream<AIMessageChunk<_$_langchain_core_messages0.MessageStructure<_$_langchain_core_messages0.MessageToolSet>>>>; | ||
| invoke(input: BaseLanguageModelInput, options?: CallOptions): Promise<AIMessageChunk<_$_langchain_core_messages0.MessageStructure<_$_langchain_core_messages0.MessageToolSet>>>; | ||
| /** @ignore */ | ||
@@ -257,0 +257,0 @@ _combineLLMOutput(...llmOutputs: OpenAILLMOutput[]): OpenAILLMOutput; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/chat_models/base.ts"],"mappings":"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"} | ||
| {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/chat_models/base.ts"],"mappings":"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"} |
@@ -236,3 +236,3 @@ import { wrapOpenAIClientError } from "../utils/client.js"; | ||
| this.zdrEnabled = fields?.zdrEnabled ?? false; | ||
| this._addVersion("@langchain/openai", "1.4.1"); | ||
| this._addVersion("@langchain/openai", "1.4.2"); | ||
| } | ||
@@ -239,0 +239,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"base.js","names":["OpenAIClient","isOpenAIFunctionTool"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import OpenAI, { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { type ChatGeneration } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n type BaseChatModelParams,\n BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n isOpenAITool as isOpenAIFunctionTool,\n type BaseFunctionCallOptions,\n type BaseLanguageModelInput,\n type FunctionDefinition,\n type StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport { JsonOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n getSchemaDescription,\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport {\n type OpenAICallOptions,\n type OpenAIChatInput,\n type OpenAICoreRequestOptions,\n type ChatOpenAIResponseFormat,\n ResponseFormatConfiguration,\n OpenAIVerbosityParam,\n type OpenAIApiKey,\n OpenAICacheRetentionParam,\n} from \"../types.js\";\nimport {\n type OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport {\n type FunctionDef,\n formatFunctionDefinitions,\n OpenAIToolChoice,\n _convertToOpenAITool,\n ChatOpenAIToolType,\n convertResponsesCustomTool,\n isBuiltInTool,\n isCustomTool,\n hasProviderToolDefinition,\n ResponsesToolChoice,\n} from \"../utils/tools.js\";\nimport {\n getStructuredOutputMethod,\n interopZodResponseFormat,\n _convertOpenAIResponsesUsageToLangChainUsage,\n} from \"../utils/output.js\";\nimport { isReasoningModel, messageToOpenAIRole } from \"../utils/misc.js\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\ninterface OpenAILLMOutput {\n tokenUsage: {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n };\n}\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\nexport interface BaseChatOpenAICallOptions\n extends BaseChatModelCallOptions, BaseFunctionCallOptions {\n /**\n * Additional options to pass to the underlying axios request.\n */\n options?: OpenAICoreRequestOptions;\n\n /**\n * A list of tools that the model may use to generate responses.\n * Each tool can be a function, a built-in tool, or a custom tool definition.\n * If not provided, the model will not use any tools.\n */\n tools?: ChatOpenAIToolType[];\n\n /**\n * Specifies which tool the model should use to respond.\n * Can be an {@link OpenAIToolChoice} or a {@link ResponsesToolChoice}.\n * If not set, the model will decide which tool to use automatically.\n */\n // TODO: break OpenAIToolChoice and ResponsesToolChoice into options sub classes\n tool_choice?: OpenAIToolChoice | ResponsesToolChoice;\n\n /**\n * Adds a prompt index to prompts passed to the model to track\n * what prompt is being used for a given generation.\n */\n promptIndex?: number;\n\n /**\n * An object specifying the format that the model must output.\n */\n response_format?: ChatOpenAIResponseFormat;\n\n /**\n * When provided, the completions API will make a best effort to sample\n * deterministically, such that repeated requests with the same `seed`\n * and parameters should return the same result.\n */\n seed?: number;\n\n /**\n * Additional options to pass to streamed completions.\n * If provided, this takes precedence over \"streamUsage\" set at\n * initialization time.\n */\n stream_options?: OpenAIClient.Chat.ChatCompletionStreamOptions;\n\n /**\n * The model may choose to call multiple functions in a single turn. You can\n * set parallel_tool_calls to false which ensures only one tool is called at most.\n * [Learn more](https://platform.openai.com/docs/guides/function-calling#parallel-function-calling)\n */\n parallel_tool_calls?: boolean;\n\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the tool definition. If `true`, the input schema will also be\n * validated according to\n * https://platform.openai.com/docs/guides/structured-outputs/supported-schemas.\n *\n * If `false`, input schema will not be validated and model output will not\n * be validated.\n *\n * If `undefined`, `strict` argument will not be passed to the model.\n */\n strict?: boolean;\n\n /**\n * Output types that you would like the model to generate for this request. Most\n * models are capable of generating text, which is the default:\n *\n * `[\"text\"]`\n *\n * The `gpt-4o-audio-preview` model can also be used to\n * [generate audio](https://platform.openai.com/docs/guides/audio). To request that\n * this model generate both text and audio responses, you can use:\n *\n * `[\"text\", \"audio\"]`\n */\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n /**\n * Parameters for audio output. Required when audio output is requested with\n * `modalities: [\"audio\"]`.\n * [Learn more](https://platform.openai.com/docs/guides/audio).\n */\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n /**\n * Static predicted output content, such as the content of a text file that is being regenerated.\n * [Learn more](https://platform.openai.com/docs/guides/latency-optimization#use-predicted-outputs).\n */\n prediction?: OpenAIClient.ChatCompletionPredictionContent;\n\n /**\n * Options for reasoning models.\n *\n * Note that some options, like reasoning summaries, are only available when using the responses\n * API. If these options are set, the responses API will be used to fulfill the request.\n *\n * These options will be ignored when not using a reasoning model.\n */\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Constrains effort on reasoning for reasoning models. Reduces reasoning in responses,\n * which can reduce latency and cost at the expense of quality.\n *\n * Accepts values: \"low\", \"medium\", or \"high\".\n *\n * @deprecated This is a convenience option that will be merged into the `reasoning` object.\n * Use `reasoning.effort` instead.\n */\n reasoningEffort?: OpenAIClient.Reasoning[\"effort\"];\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\"\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates. Replaces the `user` field.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey?: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport interface BaseChatOpenAIFields\n extends Partial<OpenAIChatInput>, BaseChatModelParams {\n /**\n * Optional configuration options for the OpenAI client.\n */\n configuration?: ClientOptions;\n}\n\nexport function getChatOpenAIModelParams<TParams extends BaseChatOpenAIFields>(\n modelOrParams?: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams | undefined {\n if (typeof modelOrParams === \"string\") {\n return { model: modelOrParams, ...(paramsArg ?? {}) } as TParams;\n }\n if (modelOrParams == null) {\n return paramsArg as TParams | undefined;\n }\n return modelOrParams;\n}\n\n/** @internal */\nexport abstract class BaseChatOpenAI<\n CallOptions extends BaseChatOpenAICallOptions,\n>\n extends BaseChatModel<CallOptions, AIMessageChunk>\n implements Partial<OpenAIChatInput>\n{\n temperature?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo\";\n\n modelKwargs?: OpenAIChatInput[\"modelKwargs\"];\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n timeout?: number;\n\n streaming = false;\n\n streamUsage = true;\n\n maxTokens?: number;\n\n logprobs?: boolean;\n\n topLogprobs?: number;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n __includeRawResponse?: boolean;\n\n /** @internal */\n client: OpenAIClient;\n\n /** @internal */\n clientConfig: ClientOptions;\n\n /**\n * Whether the model supports the `strict` argument when passing in tools.\n * If `undefined` the `strict` argument will not be passed to OpenAI.\n */\n supportsStrictToolCalling?: boolean;\n\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Must be set to `true` in tenancies with Zero Data Retention. Setting to `true` will disable\n * output storage in the Responses API, but this DOES NOT enable Zero Data Retention in your\n * OpenAI organization or project. This must be configured directly with OpenAI.\n *\n * See:\n * https://platform.openai.com/docs/guides/your-data\n * https://platform.openai.com/docs/api-reference/responses/create#responses-create-store\n *\n * @default false\n */\n zdrEnabled?: boolean | undefined;\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\" or \"priority\".\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n\n protected defaultOptions: CallOptions;\n\n _llmType() {\n return \"openai\";\n }\n\n static lc_name() {\n return \"ChatOpenAI\";\n }\n\n get callKeys() {\n return [\n ...super.callKeys,\n \"options\",\n \"function_call\",\n \"functions\",\n \"tools\",\n \"tool_choice\",\n \"promptIndex\",\n \"response_format\",\n \"seed\",\n \"reasoning\",\n \"reasoning_effort\",\n \"service_tier\",\n ];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n apiKey: \"openai_api_key\",\n modelName: \"model\",\n };\n }\n\n get lc_serializable_keys(): string[] {\n return [\n \"configuration\",\n \"logprobs\",\n \"topLogprobs\",\n \"prefixMessages\",\n \"supportsStrictToolCalling\",\n \"modalities\",\n \"audio\",\n \"temperature\",\n \"maxTokens\",\n \"topP\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"n\",\n \"logitBias\",\n \"user\",\n \"streaming\",\n \"streamUsage\",\n \"model\",\n \"modelName\",\n \"modelKwargs\",\n \"stop\",\n \"stopSequences\",\n \"timeout\",\n \"apiKey\",\n \"cache\",\n \"maxConcurrency\",\n \"maxRetries\",\n \"verbose\",\n \"callbacks\",\n \"tags\",\n \"metadata\",\n \"disableStreaming\",\n \"zdrEnabled\",\n \"reasoning\",\n \"promptCacheKey\",\n \"promptCacheRetention\",\n \"verbosity\",\n ];\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"openai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<\n OpenAIClient.Chat.ChatCompletionCreateParams,\n \"messages\"\n > & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams() {\n return this._identifyingParams();\n }\n\n constructor(fields?: BaseChatOpenAIFields) {\n super(fields ?? {});\n\n const configApiKey =\n typeof fields?.configuration?.apiKey === \"string\" ||\n typeof fields?.configuration?.apiKey === \"function\"\n ? fields?.configuration?.apiKey\n : undefined;\n this.apiKey =\n fields?.apiKey ??\n configApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.logprobs = fields?.logprobs;\n this.topLogprobs = fields?.topLogprobs;\n this.n = fields?.n ?? this.n;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n this.__includeRawResponse = fields?.__includeRawResponse;\n this.audio = fields?.audio;\n this.modalities = fields?.modalities;\n this.reasoning = fields?.reasoning;\n this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens;\n this.promptCacheKey = fields?.promptCacheKey ?? this.promptCacheKey;\n this.promptCacheRetention =\n fields?.promptCacheRetention ?? this.promptCacheRetention;\n this.verbosity = fields?.verbosity ?? this.verbosity;\n\n this.disableStreaming = fields?.disableStreaming === true;\n this.streaming = fields?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (fields?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n\n // If `supportsStrictToolCalling` is explicitly set, use that value.\n // Else leave undefined so it's not passed to OpenAI.\n if (fields?.supportsStrictToolCalling !== undefined) {\n this.supportsStrictToolCalling = fields.supportsStrictToolCalling;\n }\n\n if (fields?.service_tier !== undefined) {\n this.service_tier = fields.service_tier;\n }\n\n this.zdrEnabled = fields?.zdrEnabled ?? false;\n\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n }\n\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n protected _getReasoningParams(\n options?: this[\"ParsedCallOptions\"]\n ): OpenAIClient.Reasoning | undefined {\n if (!isReasoningModel(this.model)) {\n return;\n }\n\n // apply options in reverse order of importance -- newer options supersede older options\n let reasoning: OpenAIClient.Reasoning | undefined;\n if (this.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...this.reasoning,\n };\n }\n if (options?.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...options.reasoning,\n };\n }\n\n // Coalesce reasoningEffort into reasoning.effort if reasoning.effort is not already set\n if (\n options?.reasoningEffort !== undefined &&\n reasoning?.effort === undefined\n ) {\n reasoning = {\n ...reasoning,\n effort: options.reasoningEffort,\n };\n }\n\n return reasoning;\n }\n\n /**\n * Returns an openai compatible response format from a set of options\n * @internal\n */\n protected _getResponseFormat(\n resFormat?: CallOptions[\"response_format\"]\n ): ResponseFormatConfiguration | undefined {\n if (\n resFormat &&\n resFormat.type === \"json_schema\" &&\n resFormat.json_schema.schema &&\n isInteropZodSchema(resFormat.json_schema.schema)\n ) {\n return interopZodResponseFormat(\n resFormat.json_schema.schema,\n resFormat.json_schema.name,\n {\n description: resFormat.json_schema.description,\n }\n );\n }\n return resFormat as ResponseFormatConfiguration | undefined;\n }\n\n protected _combineCallOptions(\n additionalOptions?: this[\"ParsedCallOptions\"]\n ): this[\"ParsedCallOptions\"] {\n return {\n ...this.defaultOptions,\n ...(additionalOptions ?? {}),\n };\n }\n\n /** @internal */\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n // TODO: move to completions class\n protected _convertChatOpenAIToolToCompletionsTool(\n tool: ChatOpenAIToolType,\n fields?: { strict?: boolean }\n ): OpenAIClient.ChatCompletionTool {\n if (isCustomTool(tool)) {\n return convertResponsesCustomTool(tool.metadata.customTool);\n }\n if (isOpenAIFunctionTool(tool)) {\n if (fields?.strict !== undefined) {\n return {\n ...tool,\n function: {\n ...tool.function,\n strict: fields.strict,\n },\n };\n }\n\n return tool;\n }\n return _convertToOpenAITool(tool, fields);\n }\n\n override bindTools(\n tools: ChatOpenAIToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n let strict: boolean | undefined;\n if (kwargs?.strict !== undefined) {\n strict = kwargs.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n return this.withConfig({\n tools: tools.map((tool) => {\n // Built-in tools and custom tools pass through as-is\n if (isBuiltInTool(tool) || isCustomTool(tool)) {\n return tool;\n }\n // Tools with providerToolDefinition (e.g., localShell, shell, computerUse, applyPatch)\n // should use their provider-specific definition\n if (hasProviderToolDefinition(tool)) {\n return tool.extras.providerToolDefinition;\n }\n // Regular tools get converted to OpenAI function format\n const converted = this._convertChatOpenAIToolToCompletionsTool(tool, {\n strict,\n });\n if (isLangChainTool(tool) && tool.extras?.defer_loading === true) {\n return { ...converted, defer_loading: true };\n }\n return converted;\n }),\n ...kwargs,\n } as Partial<CallOptions>);\n }\n\n override async stream(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.stream(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n override async invoke(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.invoke(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n /** @ignore */\n _combineLLMOutput(...llmOutputs: OpenAILLMOutput[]): OpenAILLMOutput {\n return llmOutputs.reduce<{\n [key in keyof OpenAILLMOutput]: Required<OpenAILLMOutput[key]>;\n }>(\n (acc, llmOutput) => {\n if (llmOutput && llmOutput.tokenUsage) {\n acc.tokenUsage.completionTokens +=\n llmOutput.tokenUsage.completionTokens ?? 0;\n acc.tokenUsage.promptTokens += llmOutput.tokenUsage.promptTokens ?? 0;\n acc.tokenUsage.totalTokens += llmOutput.tokenUsage.totalTokens ?? 0;\n }\n return acc;\n },\n {\n tokenUsage: {\n completionTokens: 0,\n promptTokens: 0,\n totalTokens: 0,\n },\n }\n );\n }\n\n async getNumTokensFromMessages(messages: BaseMessage[]) {\n let totalCount = 0;\n let tokensPerMessage = 0;\n let tokensPerName = 0;\n\n // From: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb\n if (this.model === \"gpt-3.5-turbo-0301\") {\n tokensPerMessage = 4;\n tokensPerName = -1;\n } else {\n tokensPerMessage = 3;\n tokensPerName = 1;\n }\n\n const countPerMessage = await Promise.all(\n messages.map(async (message) => {\n const [textCount, roleCount] = await Promise.all([\n this.getNumTokens(message.content),\n this.getNumTokens(messageToOpenAIRole(message)),\n ]);\n const nameCount =\n message.name !== undefined\n ? tokensPerName + (await this.getNumTokens(message.name))\n : 0;\n let count = textCount + tokensPerMessage + roleCount + nameCount;\n\n // From: https://github.com/hmarr/openai-chat-tokens/blob/main/src/index.ts messageTokenEstimate\n const openAIMessage = message;\n if (openAIMessage._getType() === \"function\") {\n count -= 2;\n }\n if (openAIMessage.additional_kwargs?.function_call) {\n count += 3;\n }\n if (openAIMessage?.additional_kwargs.function_call?.name) {\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.name\n );\n }\n if (openAIMessage.additional_kwargs.function_call?.arguments) {\n try {\n count += await this.getNumTokens(\n // Remove newlines and spaces\n JSON.stringify(\n JSON.parse(\n openAIMessage.additional_kwargs.function_call?.arguments\n )\n )\n );\n } catch (error) {\n console.error(\n \"Error parsing function arguments\",\n error,\n JSON.stringify(openAIMessage.additional_kwargs.function_call)\n );\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.arguments\n );\n }\n }\n\n totalCount += count;\n return count;\n })\n );\n\n totalCount += 3; // every reply is primed with <|start|>assistant<|message|>\n\n return { totalCount, countPerMessage };\n }\n\n /** @internal */\n protected async _getNumTokensFromGenerations(generations: ChatGeneration[]) {\n const generationUsages = await Promise.all(\n generations.map(async (generation) => {\n if (generation.message.additional_kwargs?.function_call) {\n return (await this.getNumTokensFromMessages([generation.message]))\n .countPerMessage[0];\n } else {\n return await this.getNumTokens(generation.message.content);\n }\n })\n );\n\n return generationUsages.reduce((a, b) => a + b, 0);\n }\n\n /** @internal */\n protected async _getEstimatedTokenCountFromPrompt(\n messages: BaseMessage[],\n functions?: OpenAIClient.Chat.ChatCompletionCreateParams.Function[],\n function_call?:\n | \"none\"\n | \"auto\"\n | OpenAIClient.Chat.ChatCompletionFunctionCallOption\n ): Promise<number> {\n // It appears that if functions are present, the first system message is padded with a trailing newline. This\n // was inferred by trying lots of combinations of messages and functions and seeing what the token counts were.\n\n let tokens = (await this.getNumTokensFromMessages(messages)).totalCount;\n\n // If there are functions, add the function definitions as they count towards token usage\n if (functions && function_call !== \"auto\") {\n const promptDefinitions = formatFunctionDefinitions(\n functions as unknown as FunctionDef[]\n );\n tokens += await this.getNumTokens(promptDefinitions);\n tokens += 9; // Add nine per completion\n }\n\n // If there's a system message _and_ functions are present, subtract four tokens. I assume this is because\n // functions typically add a system message, but reuse the first one if it's already there. This offsets\n // the extra 9 tokens added by the function definitions.\n if (functions && messages.find((m) => m._getType() === \"system\")) {\n tokens -= 4;\n }\n\n // If function_call is 'none', add one token.\n // If it's a FunctionCall object, add 4 + the number of tokens in the function name.\n // If it's undefined or 'auto', don't add anything.\n if (function_call === \"none\") {\n tokens += 1;\n } else if (typeof function_call === \"object\") {\n tokens += (await this.getNumTokens(function_call.name)) + 4;\n }\n\n return tokens;\n }\n\n /**\n * Moderate content using OpenAI's Moderation API.\n *\n * This method checks whether content violates OpenAI's content policy by\n * analyzing text for categories such as hate, harassment, self-harm,\n * sexual content, violence, and more.\n *\n * @param input - The text or array of texts to moderate\n * @param params - Optional parameters for the moderation request\n * @param params.model - The moderation model to use. Defaults to \"omni-moderation-latest\".\n * @param params.options - Additional options to pass to the underlying request\n * @returns A promise that resolves to the moderation response containing results for each input\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n *\n * // Moderate a single text\n * const result = await model.moderateContent(\"This is a test message\");\n * console.log(result.results[0].flagged); // false\n * console.log(result.results[0].categories); // { hate: false, harassment: false, ... }\n *\n * // Moderate multiple texts\n * const results = await model.moderateContent([\n * \"Hello, how are you?\",\n * \"This is inappropriate content\"\n * ]);\n * results.results.forEach((result, index) => {\n * console.log(`Text ${index + 1} flagged:`, result.flagged);\n * });\n *\n * // Use a specific moderation model\n * const stableResult = await model.moderateContent(\n * \"Test content\",\n * { model: \"omni-moderation-latest\" }\n * );\n * ```\n */\n async moderateContent(\n input: string | string[],\n params?: {\n model?: OpenAI.ModerationModel;\n options?: OpenAICoreRequestOptions;\n }\n ): Promise<OpenAIClient.ModerationCreateResponse> {\n const clientOptions = this._getClientOptions(params?.options);\n const moderationModel = params?.model ?? \"omni-moderation-latest\";\n const moderationRequest: OpenAIClient.ModerationCreateParams = {\n input,\n model: moderationModel,\n };\n\n return this.caller.call(async () => {\n try {\n const response = await this.client.moderations.create(\n moderationRequest,\n clientOptions\n );\n return response;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 128000\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n /** @internal */\n protected _getStructuredOutputMethod(\n config: StructuredOutputMethodOptions<boolean>\n ) {\n const ensuredConfig = { ...config };\n if (\n !this.model.startsWith(\"gpt-3\") &&\n !this.model.startsWith(\"gpt-4-\") &&\n this.model !== \"gpt-4\"\n ) {\n if (ensuredConfig?.method === undefined) {\n return \"jsonSchema\";\n }\n } else if (ensuredConfig.method === \"jsonSchema\") {\n console.warn(\n `[WARNING]: JSON Schema is not supported for model \"${this.model}\". Falling back to tool calling.`\n );\n }\n return ensuredConfig.method;\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Add structured output to the model.\n *\n * The OpenAI model family supports the following structured output methods:\n * - `jsonSchema`: Use the `response_format` field in the response to return a JSON schema. Only supported with the `gpt-4o-mini`,\n * `gpt-4o-mini-2024-07-18`, and `gpt-4o-2024-08-06` model snapshots and later.\n * - `functionCalling`: Function calling is useful when you are building an application that bridges the models and functionality\n * of your application.\n * - `jsonMode`: JSON mode is a more basic version of the Structured Outputs feature. While JSON mode ensures that model\n * output is valid JSON, Structured Outputs reliably matches the model's output to the schema you specify.\n * We recommend you use `functionCalling` or `jsonSchema` if it is supported for your use case.\n *\n * The default method is `functionCalling`.\n *\n * @see https://platform.openai.com/docs/guides/structured-outputs\n * @param outputSchema - The schema to use for structured output.\n * @param config - The structured output method options.\n * @returns The model with structured output.\n */\n withStructuredOutput<\n RunOutput extends Record<string, unknown> = Record<string, unknown>,\n >(\n outputSchema:\n | SerializableSchema<RunOutput>\n | InteropZodType<RunOutput>\n | Record<string, unknown>,\n config?: StructuredOutputMethodOptions<boolean>\n ) {\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n\n if (config?.strict !== undefined && config.method === \"jsonMode\") {\n throw new Error(\n \"Argument `strict` is only supported for `method` = 'function_calling'\"\n );\n }\n\n const method = getStructuredOutputMethod(this.model, config?.method);\n\n if (method === \"jsonMode\") {\n outputParser = createContentParser(schema);\n const asJsonSchema = toJsonSchema(schema);\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: { type: \"json_object\" },\n ls_structured_output_format: {\n kwargs: { method: \"json_mode\" },\n schema: { title: name ?? \"extract\", ...asJsonSchema },\n },\n } as Partial<CallOptions>);\n } else if (method === \"jsonSchema\") {\n const asJsonSchema = toJsonSchema(schema);\n const openaiJsonSchemaParams = {\n name: name ?? \"extract\",\n description: getSchemaDescription(asJsonSchema),\n schema: isInteropZodSchema(schema) ? schema : asJsonSchema,\n strict: config?.strict,\n };\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: {\n type: \"json_schema\",\n json_schema: openaiJsonSchemaParams,\n },\n ls_structured_output_format: {\n kwargs: { method: \"json_schema\" },\n schema: {\n title: openaiJsonSchemaParams.name,\n description: openaiJsonSchemaParams.description,\n ...asJsonSchema,\n },\n },\n } as Partial<CallOptions>);\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const altParser = createContentParser(schema);\n outputParser = RunnableLambda.from<AIMessageChunk, RunOutput>(\n async (aiMessage: AIMessageChunk) => {\n if (\"parsed\" in aiMessage.additional_kwargs) {\n return aiMessage.additional_kwargs.parsed as RunOutput;\n }\n return altParser.invoke(aiMessage.content as string);\n }\n );\n } else {\n outputParser = new JsonOutputParser<RunOutput>();\n }\n } else {\n let functionName = name ?? \"extract\";\n const asJsonSchema = toJsonSchema(schema);\n\n // Is function calling\n let toolFunction: FunctionDefinition;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n toolFunction = {\n name: functionName,\n description: asJsonSchema.description,\n parameters: asJsonSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n toolFunction = schema as unknown as FunctionDefinition;\n functionName = schema.name;\n } else {\n functionName = (schema.title as string) ?? functionName;\n toolFunction = {\n name: functionName,\n description: (schema.description as string) ?? \"\",\n parameters: schema,\n };\n }\n\n llm = this.withConfig({\n outputVersion: \"v0\",\n tools: [{ type: \"function\" as const, function: toolFunction }],\n tool_choice: {\n type: \"function\" as const,\n function: { name: functionName },\n },\n ls_structured_output_format: {\n kwargs: { method: \"function_calling\" },\n schema: { title: functionName, ...asJsonSchema },\n },\n // Do not pass `strict` argument to OpenAI if `config.strict` is undefined\n ...(config?.strict !== undefined ? { strict: config.strict } : {}),\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n }\n\n return assembleStructuredOutputPipeline(llm, outputParser, includeRaw);\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"base.js","names":["OpenAIClient","isOpenAIFunctionTool"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import OpenAI, { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { type ChatGeneration } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n type BaseChatModelParams,\n BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n isOpenAITool as isOpenAIFunctionTool,\n type BaseFunctionCallOptions,\n type BaseLanguageModelInput,\n type FunctionDefinition,\n type StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport { JsonOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n getSchemaDescription,\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport {\n type OpenAICallOptions,\n type OpenAIChatInput,\n type OpenAICoreRequestOptions,\n type ChatOpenAIResponseFormat,\n ResponseFormatConfiguration,\n OpenAIVerbosityParam,\n type OpenAIApiKey,\n OpenAICacheRetentionParam,\n} from \"../types.js\";\nimport {\n type OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"../utils/azure.js\";\nimport {\n type FunctionDef,\n formatFunctionDefinitions,\n OpenAIToolChoice,\n _convertToOpenAITool,\n ChatOpenAIToolType,\n convertResponsesCustomTool,\n isBuiltInTool,\n isCustomTool,\n hasProviderToolDefinition,\n ResponsesToolChoice,\n} from \"../utils/tools.js\";\nimport {\n getStructuredOutputMethod,\n interopZodResponseFormat,\n _convertOpenAIResponsesUsageToLangChainUsage,\n} from \"../utils/output.js\";\nimport { isReasoningModel, messageToOpenAIRole } from \"../utils/misc.js\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\ninterface OpenAILLMOutput {\n tokenUsage: {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n };\n}\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\nexport interface BaseChatOpenAICallOptions\n extends BaseChatModelCallOptions, BaseFunctionCallOptions {\n /**\n * Additional options to pass to the underlying axios request.\n */\n options?: OpenAICoreRequestOptions;\n\n /**\n * A list of tools that the model may use to generate responses.\n * Each tool can be a function, a built-in tool, or a custom tool definition.\n * If not provided, the model will not use any tools.\n */\n tools?: ChatOpenAIToolType[];\n\n /**\n * Specifies which tool the model should use to respond.\n * Can be an {@link OpenAIToolChoice} or a {@link ResponsesToolChoice}.\n * If not set, the model will decide which tool to use automatically.\n */\n // TODO: break OpenAIToolChoice and ResponsesToolChoice into options sub classes\n tool_choice?: OpenAIToolChoice | ResponsesToolChoice;\n\n /**\n * Adds a prompt index to prompts passed to the model to track\n * what prompt is being used for a given generation.\n */\n promptIndex?: number;\n\n /**\n * An object specifying the format that the model must output.\n */\n response_format?: ChatOpenAIResponseFormat;\n\n /**\n * When provided, the completions API will make a best effort to sample\n * deterministically, such that repeated requests with the same `seed`\n * and parameters should return the same result.\n */\n seed?: number;\n\n /**\n * Additional options to pass to streamed completions.\n * If provided, this takes precedence over \"streamUsage\" set at\n * initialization time.\n */\n stream_options?: OpenAIClient.Chat.ChatCompletionStreamOptions;\n\n /**\n * The model may choose to call multiple functions in a single turn. You can\n * set parallel_tool_calls to false which ensures only one tool is called at most.\n * [Learn more](https://platform.openai.com/docs/guides/function-calling#parallel-function-calling)\n */\n parallel_tool_calls?: boolean;\n\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the tool definition. If `true`, the input schema will also be\n * validated according to\n * https://platform.openai.com/docs/guides/structured-outputs/supported-schemas.\n *\n * If `false`, input schema will not be validated and model output will not\n * be validated.\n *\n * If `undefined`, `strict` argument will not be passed to the model.\n */\n strict?: boolean;\n\n /**\n * Output types that you would like the model to generate for this request. Most\n * models are capable of generating text, which is the default:\n *\n * `[\"text\"]`\n *\n * The `gpt-4o-audio-preview` model can also be used to\n * [generate audio](https://platform.openai.com/docs/guides/audio). To request that\n * this model generate both text and audio responses, you can use:\n *\n * `[\"text\", \"audio\"]`\n */\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n /**\n * Parameters for audio output. Required when audio output is requested with\n * `modalities: [\"audio\"]`.\n * [Learn more](https://platform.openai.com/docs/guides/audio).\n */\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n /**\n * Static predicted output content, such as the content of a text file that is being regenerated.\n * [Learn more](https://platform.openai.com/docs/guides/latency-optimization#use-predicted-outputs).\n */\n prediction?: OpenAIClient.ChatCompletionPredictionContent;\n\n /**\n * Options for reasoning models.\n *\n * Note that some options, like reasoning summaries, are only available when using the responses\n * API. If these options are set, the responses API will be used to fulfill the request.\n *\n * These options will be ignored when not using a reasoning model.\n */\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Constrains effort on reasoning for reasoning models. Reduces reasoning in responses,\n * which can reduce latency and cost at the expense of quality.\n *\n * Accepts values: \"low\", \"medium\", or \"high\".\n *\n * @deprecated This is a convenience option that will be merged into the `reasoning` object.\n * Use `reasoning.effort` instead.\n */\n reasoningEffort?: OpenAIClient.Reasoning[\"effort\"];\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\"\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates. Replaces the `user` field.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey?: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n}\n\nexport interface BaseChatOpenAIFields\n extends Partial<OpenAIChatInput>, BaseChatModelParams {\n /**\n * Optional configuration options for the OpenAI client.\n */\n configuration?: ClientOptions;\n}\n\nexport function getChatOpenAIModelParams<TParams extends BaseChatOpenAIFields>(\n modelOrParams?: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams | undefined {\n if (typeof modelOrParams === \"string\") {\n return { model: modelOrParams, ...(paramsArg ?? {}) } as TParams;\n }\n if (modelOrParams == null) {\n return paramsArg as TParams | undefined;\n }\n return modelOrParams;\n}\n\n/** @internal */\nexport abstract class BaseChatOpenAI<\n CallOptions extends BaseChatOpenAICallOptions,\n>\n extends BaseChatModel<CallOptions, AIMessageChunk>\n implements Partial<OpenAIChatInput>\n{\n temperature?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo\";\n\n modelKwargs?: OpenAIChatInput[\"modelKwargs\"];\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n timeout?: number;\n\n streaming = false;\n\n streamUsage = true;\n\n maxTokens?: number;\n\n logprobs?: boolean;\n\n topLogprobs?: number;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n __includeRawResponse?: boolean;\n\n /** @internal */\n client: OpenAIClient;\n\n /** @internal */\n clientConfig: ClientOptions;\n\n /**\n * Whether the model supports the `strict` argument when passing in tools.\n * If `undefined` the `strict` argument will not be passed to OpenAI.\n */\n supportsStrictToolCalling?: boolean;\n\n audio?: OpenAIClient.Chat.ChatCompletionAudioParam;\n\n modalities?: Array<OpenAIClient.Chat.ChatCompletionModality>;\n\n reasoning?: OpenAIClient.Reasoning;\n\n /**\n * Must be set to `true` in tenancies with Zero Data Retention. Setting to `true` will disable\n * output storage in the Responses API, but this DOES NOT enable Zero Data Retention in your\n * OpenAI organization or project. This must be configured directly with OpenAI.\n *\n * See:\n * https://platform.openai.com/docs/guides/your-data\n * https://platform.openai.com/docs/api-reference/responses/create#responses-create-store\n *\n * @default false\n */\n zdrEnabled?: boolean | undefined;\n\n /**\n * Service tier to use for this request. Can be \"auto\", \"default\", or \"flex\" or \"priority\".\n * Specifies the service tier for prioritization and latency optimization.\n */\n service_tier?: OpenAIClient.Chat.ChatCompletionCreateParams[\"service_tier\"];\n\n /**\n * Used by OpenAI to cache responses for similar requests to optimize your cache\n * hit rates.\n * [Learn more](https://platform.openai.com/docs/guides/prompt-caching).\n */\n promptCacheKey: string;\n\n /**\n * Used by OpenAI to set cache retention time\n */\n promptCacheRetention?: OpenAICacheRetentionParam;\n\n /**\n * The verbosity of the model's response.\n */\n verbosity?: OpenAIVerbosityParam;\n\n protected defaultOptions: CallOptions;\n\n _llmType() {\n return \"openai\";\n }\n\n static lc_name() {\n return \"ChatOpenAI\";\n }\n\n get callKeys() {\n return [\n ...super.callKeys,\n \"options\",\n \"function_call\",\n \"functions\",\n \"tools\",\n \"tool_choice\",\n \"promptIndex\",\n \"response_format\",\n \"seed\",\n \"reasoning\",\n \"reasoning_effort\",\n \"service_tier\",\n ];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n apiKey: \"openai_api_key\",\n modelName: \"model\",\n };\n }\n\n get lc_serializable_keys(): string[] {\n return [\n \"configuration\",\n \"logprobs\",\n \"topLogprobs\",\n \"prefixMessages\",\n \"supportsStrictToolCalling\",\n \"modalities\",\n \"audio\",\n \"temperature\",\n \"maxTokens\",\n \"topP\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"n\",\n \"logitBias\",\n \"user\",\n \"streaming\",\n \"streamUsage\",\n \"model\",\n \"modelName\",\n \"modelKwargs\",\n \"stop\",\n \"stopSequences\",\n \"timeout\",\n \"apiKey\",\n \"cache\",\n \"maxConcurrency\",\n \"maxRetries\",\n \"verbose\",\n \"callbacks\",\n \"tags\",\n \"metadata\",\n \"disableStreaming\",\n \"zdrEnabled\",\n \"reasoning\",\n \"promptCacheKey\",\n \"promptCacheRetention\",\n \"verbosity\",\n ];\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"openai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<\n OpenAIClient.Chat.ChatCompletionCreateParams,\n \"messages\"\n > & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams() {\n return this._identifyingParams();\n }\n\n constructor(fields?: BaseChatOpenAIFields) {\n super(fields ?? {});\n\n const configApiKey =\n typeof fields?.configuration?.apiKey === \"string\" ||\n typeof fields?.configuration?.apiKey === \"function\"\n ? fields?.configuration?.apiKey\n : undefined;\n this.apiKey =\n fields?.apiKey ??\n configApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.logprobs = fields?.logprobs;\n this.topLogprobs = fields?.topLogprobs;\n this.n = fields?.n ?? this.n;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n this.__includeRawResponse = fields?.__includeRawResponse;\n this.audio = fields?.audio;\n this.modalities = fields?.modalities;\n this.reasoning = fields?.reasoning;\n this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens;\n this.promptCacheKey = fields?.promptCacheKey ?? this.promptCacheKey;\n this.promptCacheRetention =\n fields?.promptCacheRetention ?? this.promptCacheRetention;\n this.verbosity = fields?.verbosity ?? this.verbosity;\n\n this.disableStreaming = fields?.disableStreaming === true;\n this.streaming = fields?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (fields?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n\n // If `supportsStrictToolCalling` is explicitly set, use that value.\n // Else leave undefined so it's not passed to OpenAI.\n if (fields?.supportsStrictToolCalling !== undefined) {\n this.supportsStrictToolCalling = fields.supportsStrictToolCalling;\n }\n\n if (fields?.service_tier !== undefined) {\n this.service_tier = fields.service_tier;\n }\n\n this.zdrEnabled = fields?.zdrEnabled ?? false;\n\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n }\n\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n protected _getReasoningParams(\n options?: this[\"ParsedCallOptions\"]\n ): OpenAIClient.Reasoning | undefined {\n if (!isReasoningModel(this.model)) {\n return;\n }\n\n // apply options in reverse order of importance -- newer options supersede older options\n let reasoning: OpenAIClient.Reasoning | undefined;\n if (this.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...this.reasoning,\n };\n }\n if (options?.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...options.reasoning,\n };\n }\n\n // Coalesce reasoningEffort into reasoning.effort if reasoning.effort is not already set\n if (\n options?.reasoningEffort !== undefined &&\n reasoning?.effort === undefined\n ) {\n reasoning = {\n ...reasoning,\n effort: options.reasoningEffort,\n };\n }\n\n return reasoning;\n }\n\n /**\n * Returns an openai compatible response format from a set of options\n * @internal\n */\n protected _getResponseFormat(\n resFormat?: CallOptions[\"response_format\"]\n ): ResponseFormatConfiguration | undefined {\n if (\n resFormat &&\n resFormat.type === \"json_schema\" &&\n resFormat.json_schema.schema &&\n isInteropZodSchema(resFormat.json_schema.schema)\n ) {\n return interopZodResponseFormat(\n resFormat.json_schema.schema,\n resFormat.json_schema.name,\n {\n description: resFormat.json_schema.description,\n }\n );\n }\n return resFormat as ResponseFormatConfiguration | undefined;\n }\n\n protected _combineCallOptions(\n additionalOptions?: this[\"ParsedCallOptions\"]\n ): this[\"ParsedCallOptions\"] {\n return {\n ...this.defaultOptions,\n ...(additionalOptions ?? {}),\n };\n }\n\n /** @internal */\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n // TODO: move to completions class\n protected _convertChatOpenAIToolToCompletionsTool(\n tool: ChatOpenAIToolType,\n fields?: { strict?: boolean }\n ): OpenAIClient.ChatCompletionTool {\n if (isCustomTool(tool)) {\n return convertResponsesCustomTool(tool.metadata.customTool);\n }\n if (isOpenAIFunctionTool(tool)) {\n if (fields?.strict !== undefined) {\n return {\n ...tool,\n function: {\n ...tool.function,\n strict: fields.strict,\n },\n };\n }\n\n return tool;\n }\n return _convertToOpenAITool(tool, fields);\n }\n\n override bindTools(\n tools: ChatOpenAIToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n let strict: boolean | undefined;\n if (kwargs?.strict !== undefined) {\n strict = kwargs.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n return this.withConfig({\n tools: tools.map((tool) => {\n // Built-in tools and custom tools pass through as-is\n if (isBuiltInTool(tool) || isCustomTool(tool)) {\n return tool;\n }\n // Tools with providerToolDefinition (e.g., localShell, shell, computerUse, applyPatch)\n // should use their provider-specific definition\n if (hasProviderToolDefinition(tool)) {\n return tool.extras.providerToolDefinition;\n }\n // Regular tools get converted to OpenAI function format\n const converted = this._convertChatOpenAIToolToCompletionsTool(tool, {\n strict,\n });\n if (isLangChainTool(tool) && tool.extras?.defer_loading === true) {\n return { ...converted, defer_loading: true };\n }\n return converted;\n }),\n ...kwargs,\n } as Partial<CallOptions>);\n }\n\n override async stream(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.stream(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n override async invoke(input: BaseLanguageModelInput, options?: CallOptions) {\n return super.invoke(\n input,\n this._combineCallOptions(options) as CallOptions\n );\n }\n\n /** @ignore */\n _combineLLMOutput(...llmOutputs: OpenAILLMOutput[]): OpenAILLMOutput {\n return llmOutputs.reduce<{\n [key in keyof OpenAILLMOutput]: Required<OpenAILLMOutput[key]>;\n }>(\n (acc, llmOutput) => {\n if (llmOutput && llmOutput.tokenUsage) {\n acc.tokenUsage.completionTokens +=\n llmOutput.tokenUsage.completionTokens ?? 0;\n acc.tokenUsage.promptTokens += llmOutput.tokenUsage.promptTokens ?? 0;\n acc.tokenUsage.totalTokens += llmOutput.tokenUsage.totalTokens ?? 0;\n }\n return acc;\n },\n {\n tokenUsage: {\n completionTokens: 0,\n promptTokens: 0,\n totalTokens: 0,\n },\n }\n );\n }\n\n async getNumTokensFromMessages(messages: BaseMessage[]) {\n let totalCount = 0;\n let tokensPerMessage = 0;\n let tokensPerName = 0;\n\n // From: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb\n if (this.model === \"gpt-3.5-turbo-0301\") {\n tokensPerMessage = 4;\n tokensPerName = -1;\n } else {\n tokensPerMessage = 3;\n tokensPerName = 1;\n }\n\n const countPerMessage = await Promise.all(\n messages.map(async (message) => {\n const [textCount, roleCount] = await Promise.all([\n this.getNumTokens(message.content),\n this.getNumTokens(messageToOpenAIRole(message)),\n ]);\n const nameCount =\n message.name !== undefined\n ? tokensPerName + (await this.getNumTokens(message.name))\n : 0;\n let count = textCount + tokensPerMessage + roleCount + nameCount;\n\n // From: https://github.com/hmarr/openai-chat-tokens/blob/main/src/index.ts messageTokenEstimate\n const openAIMessage = message;\n if (openAIMessage._getType() === \"function\") {\n count -= 2;\n }\n if (openAIMessage.additional_kwargs?.function_call) {\n count += 3;\n }\n if (openAIMessage?.additional_kwargs.function_call?.name) {\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.name\n );\n }\n if (openAIMessage.additional_kwargs.function_call?.arguments) {\n try {\n count += await this.getNumTokens(\n // Remove newlines and spaces\n JSON.stringify(\n JSON.parse(\n openAIMessage.additional_kwargs.function_call?.arguments\n )\n )\n );\n } catch (error) {\n console.error(\n \"Error parsing function arguments\",\n error,\n JSON.stringify(openAIMessage.additional_kwargs.function_call)\n );\n count += await this.getNumTokens(\n openAIMessage.additional_kwargs.function_call?.arguments\n );\n }\n }\n\n totalCount += count;\n return count;\n })\n );\n\n totalCount += 3; // every reply is primed with <|start|>assistant<|message|>\n\n return { totalCount, countPerMessage };\n }\n\n /** @internal */\n protected async _getNumTokensFromGenerations(generations: ChatGeneration[]) {\n const generationUsages = await Promise.all(\n generations.map(async (generation) => {\n if (generation.message.additional_kwargs?.function_call) {\n return (await this.getNumTokensFromMessages([generation.message]))\n .countPerMessage[0];\n } else {\n return await this.getNumTokens(generation.message.content);\n }\n })\n );\n\n return generationUsages.reduce((a, b) => a + b, 0);\n }\n\n /** @internal */\n protected async _getEstimatedTokenCountFromPrompt(\n messages: BaseMessage[],\n functions?: OpenAIClient.Chat.ChatCompletionCreateParams.Function[],\n function_call?:\n | \"none\"\n | \"auto\"\n | OpenAIClient.Chat.ChatCompletionFunctionCallOption\n ): Promise<number> {\n // It appears that if functions are present, the first system message is padded with a trailing newline. This\n // was inferred by trying lots of combinations of messages and functions and seeing what the token counts were.\n\n let tokens = (await this.getNumTokensFromMessages(messages)).totalCount;\n\n // If there are functions, add the function definitions as they count towards token usage\n if (functions && function_call !== \"auto\") {\n const promptDefinitions = formatFunctionDefinitions(\n functions as unknown as FunctionDef[]\n );\n tokens += await this.getNumTokens(promptDefinitions);\n tokens += 9; // Add nine per completion\n }\n\n // If there's a system message _and_ functions are present, subtract four tokens. I assume this is because\n // functions typically add a system message, but reuse the first one if it's already there. This offsets\n // the extra 9 tokens added by the function definitions.\n if (functions && messages.find((m) => m._getType() === \"system\")) {\n tokens -= 4;\n }\n\n // If function_call is 'none', add one token.\n // If it's a FunctionCall object, add 4 + the number of tokens in the function name.\n // If it's undefined or 'auto', don't add anything.\n if (function_call === \"none\") {\n tokens += 1;\n } else if (typeof function_call === \"object\") {\n tokens += (await this.getNumTokens(function_call.name)) + 4;\n }\n\n return tokens;\n }\n\n /**\n * Moderate content using OpenAI's Moderation API.\n *\n * This method checks whether content violates OpenAI's content policy by\n * analyzing text for categories such as hate, harassment, self-harm,\n * sexual content, violence, and more.\n *\n * @param input - The text or array of texts to moderate\n * @param params - Optional parameters for the moderation request\n * @param params.model - The moderation model to use. Defaults to \"omni-moderation-latest\".\n * @param params.options - Additional options to pass to the underlying request\n * @returns A promise that resolves to the moderation response containing results for each input\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n *\n * // Moderate a single text\n * const result = await model.moderateContent(\"This is a test message\");\n * console.log(result.results[0].flagged); // false\n * console.log(result.results[0].categories); // { hate: false, harassment: false, ... }\n *\n * // Moderate multiple texts\n * const results = await model.moderateContent([\n * \"Hello, how are you?\",\n * \"This is inappropriate content\"\n * ]);\n * results.results.forEach((result, index) => {\n * console.log(`Text ${index + 1} flagged:`, result.flagged);\n * });\n *\n * // Use a specific moderation model\n * const stableResult = await model.moderateContent(\n * \"Test content\",\n * { model: \"omni-moderation-latest\" }\n * );\n * ```\n */\n async moderateContent(\n input: string | string[],\n params?: {\n model?: OpenAI.ModerationModel;\n options?: OpenAICoreRequestOptions;\n }\n ): Promise<OpenAIClient.ModerationCreateResponse> {\n const clientOptions = this._getClientOptions(params?.options);\n const moderationModel = params?.model ?? \"omni-moderation-latest\";\n const moderationRequest: OpenAIClient.ModerationCreateParams = {\n input,\n model: moderationModel,\n };\n\n return this.caller.call(async () => {\n try {\n const response = await this.client.moderations.create(\n moderationRequest,\n clientOptions\n );\n return response;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n *\n * @example\n * ```typescript\n * const model = new ChatOpenAI({ model: \"gpt-4o\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 128000\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n /** @internal */\n protected _getStructuredOutputMethod(\n config: StructuredOutputMethodOptions<boolean>\n ) {\n const ensuredConfig = { ...config };\n if (\n !this.model.startsWith(\"gpt-3\") &&\n !this.model.startsWith(\"gpt-4-\") &&\n this.model !== \"gpt-4\"\n ) {\n if (ensuredConfig?.method === undefined) {\n return \"jsonSchema\";\n }\n } else if (ensuredConfig.method === \"jsonSchema\") {\n console.warn(\n `[WARNING]: JSON Schema is not supported for model \"${this.model}\". Falling back to tool calling.`\n );\n }\n return ensuredConfig.method;\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Add structured output to the model.\n *\n * The OpenAI model family supports the following structured output methods:\n * - `jsonSchema`: Use the `response_format` field in the response to return a JSON schema. Only supported with the `gpt-4o-mini`,\n * `gpt-4o-mini-2024-07-18`, and `gpt-4o-2024-08-06` model snapshots and later.\n * - `functionCalling`: Function calling is useful when you are building an application that bridges the models and functionality\n * of your application.\n * - `jsonMode`: JSON mode is a more basic version of the Structured Outputs feature. While JSON mode ensures that model\n * output is valid JSON, Structured Outputs reliably matches the model's output to the schema you specify.\n * We recommend you use `functionCalling` or `jsonSchema` if it is supported for your use case.\n *\n * The default method is `functionCalling`.\n *\n * @see https://platform.openai.com/docs/guides/structured-outputs\n * @param outputSchema - The schema to use for structured output.\n * @param config - The structured output method options.\n * @returns The model with structured output.\n */\n withStructuredOutput<\n RunOutput extends Record<string, unknown> = Record<string, unknown>,\n >(\n outputSchema:\n | SerializableSchema<RunOutput>\n | InteropZodType<RunOutput>\n | Record<string, unknown>,\n config?: StructuredOutputMethodOptions<boolean>\n ) {\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n\n if (config?.strict !== undefined && config.method === \"jsonMode\") {\n throw new Error(\n \"Argument `strict` is only supported for `method` = 'function_calling'\"\n );\n }\n\n const method = getStructuredOutputMethod(this.model, config?.method);\n\n if (method === \"jsonMode\") {\n outputParser = createContentParser(schema);\n const asJsonSchema = toJsonSchema(schema);\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: { type: \"json_object\" },\n ls_structured_output_format: {\n kwargs: { method: \"json_mode\" },\n schema: { title: name ?? \"extract\", ...asJsonSchema },\n },\n } as Partial<CallOptions>);\n } else if (method === \"jsonSchema\") {\n const asJsonSchema = toJsonSchema(schema);\n const openaiJsonSchemaParams = {\n name: name ?? \"extract\",\n description: getSchemaDescription(asJsonSchema),\n schema: isInteropZodSchema(schema) ? schema : asJsonSchema,\n strict: config?.strict,\n };\n llm = this.withConfig({\n outputVersion: \"v0\",\n response_format: {\n type: \"json_schema\",\n json_schema: openaiJsonSchemaParams,\n },\n ls_structured_output_format: {\n kwargs: { method: \"json_schema\" },\n schema: {\n title: openaiJsonSchemaParams.name,\n description: openaiJsonSchemaParams.description,\n ...asJsonSchema,\n },\n },\n } as Partial<CallOptions>);\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const altParser = createContentParser(schema);\n outputParser = RunnableLambda.from<AIMessageChunk, RunOutput>(\n async (aiMessage: AIMessageChunk) => {\n if (\"parsed\" in aiMessage.additional_kwargs) {\n return aiMessage.additional_kwargs.parsed as RunOutput;\n }\n return altParser.invoke(aiMessage.content as string);\n }\n );\n } else {\n outputParser = new JsonOutputParser<RunOutput>();\n }\n } else {\n let functionName = name ?? \"extract\";\n const asJsonSchema = toJsonSchema(schema);\n\n // Is function calling\n let toolFunction: FunctionDefinition;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n toolFunction = {\n name: functionName,\n description: asJsonSchema.description,\n parameters: asJsonSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n toolFunction = schema as unknown as FunctionDefinition;\n functionName = schema.name;\n } else {\n functionName = (schema.title as string) ?? functionName;\n toolFunction = {\n name: functionName,\n description: (schema.description as string) ?? \"\",\n parameters: schema,\n };\n }\n\n llm = this.withConfig({\n outputVersion: \"v0\",\n tools: [{ type: \"function\" as const, function: toolFunction }],\n tool_choice: {\n type: \"function\" as const,\n function: { name: functionName },\n },\n ls_structured_output_format: {\n kwargs: { method: \"function_calling\" },\n schema: { title: functionName, ...asJsonSchema },\n },\n // Do not pass `strict` argument to OpenAI if `config.strict` is undefined\n ...(config?.strict !== undefined ? { strict: config.strict } : {}),\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n }\n\n return assembleStructuredOutputPipeline(llm, outputParser, includeRaw);\n }\n}\n"],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"completions.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","formatToOpenAIToolChoice","isReasoningModel","convertMessagesToCompletionsMessageParams","AIMessage","ChatGenerationChunk","AIMessageChunk","wrapOpenAIClientError","convertCompletionsDeltaToBaseMessageChunk","convertCompletionsMessageToBaseMessage"],"sources":["../../src/chat_models/completions.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n isAIMessage,\n type UsageMetadata,\n type AIMessageFields,\n BaseMessageChunk,\n} from \"@langchain/core/messages\";\nimport {\n ChatGenerationChunk,\n type ChatGeneration,\n type ChatResult,\n} from \"@langchain/core/outputs\";\nimport { NewTokenIndices } from \"@langchain/core/callbacks/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n OpenAIToolChoice,\n formatToOpenAIToolChoice,\n _convertToOpenAITool,\n} from \"../utils/tools.js\";\nimport { isReasoningModel } from \"../utils/misc.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertCompletionsDeltaToBaseMessageChunk,\n convertCompletionsMessageToBaseMessage,\n convertMessagesToCompletionsMessageParams,\n} from \"../converters/completions.js\";\n\nexport interface ChatOpenAICompletionsCallOptions extends BaseChatOpenAICallOptions {}\n\ntype ChatCompletionsInvocationParams = Omit<\n OpenAIClient.Chat.Completions.ChatCompletionCreateParams,\n \"messages\"\n>;\n\n/**\n * OpenAI Completions API implementation.\n * @internal\n */\nexport class ChatOpenAICompletions<\n CallOptions extends ChatOpenAICompletionsCallOptions =\n ChatOpenAICompletionsCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n /** @internal */\n override invocationParams(\n options?: this[\"ParsedCallOptions\"],\n extra?: { streaming?: boolean }\n ): ChatCompletionsInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n let streamOptionsConfig = {};\n if (options?.stream_options !== undefined) {\n streamOptionsConfig = { stream_options: options.stream_options };\n } else if (this.streamUsage && (this.streaming || extra?.streaming)) {\n streamOptionsConfig = { stream_options: { include_usage: true } };\n }\n\n const params: Partial<ChatCompletionsInvocationParams> = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n logprobs: this.logprobs,\n top_logprobs: this.topLogprobs,\n n: this.n,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n functions: options?.functions,\n function_call: options?.function_call,\n tools: options?.tools?.length\n ? options.tools.map((tool) =>\n this._convertChatOpenAIToolToCompletionsTool(tool, { strict })\n )\n : undefined,\n tool_choice: formatToOpenAIToolChoice(\n options?.tool_choice as OpenAIToolChoice\n ),\n response_format: this._getResponseFormat(options?.response_format),\n seed: options?.seed,\n ...streamOptionsConfig,\n parallel_tool_calls: options?.parallel_tool_calls,\n ...(this.audio || options?.audio\n ? { audio: this.audio || options?.audio }\n : {}),\n ...(this.modalities || options?.modalities\n ? { modalities: this.modalities || options?.modalities }\n : {}),\n ...this.modelKwargs,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n verbosity: options?.verbosity ?? this.verbosity,\n };\n if (options?.prediction !== undefined) {\n params.prediction = options.prediction;\n }\n if (this.service_tier !== undefined) {\n params.service_tier = this.service_tier;\n }\n if (options?.service_tier !== undefined) {\n params.service_tier = options.service_tier;\n }\n const reasoning = this._getReasoningParams(options);\n if (reasoning !== undefined && reasoning.effort !== undefined) {\n params.reasoning_effort = reasoning.effort;\n }\n if (isReasoningModel(params.model)) {\n params.max_completion_tokens =\n this.maxTokens === -1 ? undefined : this.maxTokens;\n } else {\n params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;\n }\n\n return params as ChatCompletionsInvocationParams;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const usageMetadata = {} as UsageMetadata;\n const params = this.invocationParams(options);\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n if (params.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks: Record<number, ChatGenerationChunk> = {};\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n const index =\n (chunk.generationInfo as NewTokenIndices)?.completion ?? 0;\n if (finalChunks[index] === undefined) {\n finalChunks[index] = chunk;\n } else {\n finalChunks[index] = finalChunks[index].concat(chunk);\n }\n }\n const generations = Object.entries(finalChunks)\n .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10))\n .map(([_, value]) => value);\n\n const { functions, function_call } = this.invocationParams(options);\n\n // OpenAI does not support token usage report under stream mode,\n // fallback to estimation.\n\n const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n messages,\n functions,\n function_call\n );\n const completionTokenUsage =\n await this._getNumTokensFromGenerations(generations);\n\n usageMetadata.input_tokens = promptTokenUsage;\n usageMetadata.output_tokens = completionTokenUsage;\n usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n return {\n generations,\n llmOutput: {\n estimatedTokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options?.signal,\n ...options?.options,\n }\n );\n\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n prompt_tokens_details: promptTokensDetails,\n completion_tokens_details: completionTokensDetails,\n } = data?.usage ?? {};\n\n if (completionTokens) {\n usageMetadata.output_tokens =\n (usageMetadata.output_tokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n usageMetadata.input_tokens =\n (usageMetadata.input_tokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n usageMetadata.total_tokens =\n (usageMetadata.total_tokens ?? 0) + totalTokens;\n }\n\n if (\n promptTokensDetails?.audio_tokens !== null ||\n promptTokensDetails?.cached_tokens !== null\n ) {\n usageMetadata.input_token_details = {\n ...(promptTokensDetails?.audio_tokens !== null && {\n audio: promptTokensDetails?.audio_tokens,\n }),\n ...(promptTokensDetails?.cached_tokens !== null && {\n cache_read: promptTokensDetails?.cached_tokens,\n }),\n };\n }\n\n if (\n completionTokensDetails?.audio_tokens !== null ||\n completionTokensDetails?.reasoning_tokens !== null\n ) {\n usageMetadata.output_token_details = {\n ...(completionTokensDetails?.audio_tokens !== null && {\n audio: completionTokensDetails?.audio_tokens,\n }),\n ...(completionTokensDetails?.reasoning_tokens !== null && {\n reasoning: completionTokensDetails?.reasoning_tokens,\n }),\n };\n }\n\n const generations: ChatGeneration[] = [];\n for (const part of data?.choices ?? []) {\n const text = part.message?.content ?? \"\";\n const generation: ChatGeneration = {\n text,\n message: this._convertCompletionsMessageToBaseMessage(\n part.message ?? { role: \"assistant\" },\n data\n ),\n };\n generation.generationInfo = {\n ...(part.finish_reason ? { finish_reason: part.finish_reason } : {}),\n ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata;\n }\n // Fields are not serialized unless passed to the constructor\n // Doing this ensures all fields on the message are serialized\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith(\"lc_\")\n )\n ) as AIMessageFields\n );\n generations.push(generation);\n }\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n const params = {\n ...this.invocationParams(options, {\n streaming: true,\n }),\n messages: messagesMapped,\n stream: true as const,\n };\n let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n const streamIterable = await this.completionWithRetry(params, options);\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const choice = data?.choices?.[0];\n if (data.usage) {\n usage = data.usage;\n }\n if (!choice) {\n continue;\n }\n\n const { delta } = choice;\n if (!delta) {\n continue;\n }\n const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index ?? 0,\n };\n if (typeof chunk.content !== \"string\") {\n console.log(\n \"[WARNING]: Received non-string content from OpenAI. This is currently not supported.\"\n );\n continue;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const generationInfo: Record<string, any> = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n generationInfo.finish_reason = choice.finish_reason;\n // Only include system fingerprint in the last chunk for now\n // to avoid concatenation issues\n generationInfo.system_fingerprint = data.system_fingerprint;\n generationInfo.model_name = data.model;\n generationInfo.service_tier = data.service_tier;\n }\n if (this.logprobs) {\n generationInfo.logprobs = choice.logprobs;\n }\n const generationChunk = new ChatGenerationChunk({\n message: chunk,\n text: chunk.content,\n generationInfo,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (usage) {\n const inputTokenDetails = {\n ...(usage.prompt_tokens_details?.audio_tokens !== null && {\n audio: usage.prompt_tokens_details?.audio_tokens,\n }),\n ...(usage.prompt_tokens_details?.cached_tokens !== null && {\n cache_read: usage.prompt_tokens_details?.cached_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage.completion_tokens_details?.audio_tokens !== null && {\n audio: usage.completion_tokens_details?.audio_tokens,\n }),\n ...(usage.completion_tokens_details?.reasoning_tokens !== null && {\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n }),\n };\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: {\n usage: { ...usage },\n },\n usage_metadata: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n ...(Object.keys(inputTokenDetails).length > 0 && {\n input_token_details: inputTokenDetails,\n }),\n ...(Object.keys(outputTokenDetails).length > 0 && {\n output_token_details: outputTokenDetails,\n }),\n },\n }),\n text: \"\",\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n { prompt: 0, completion: 0 },\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Chat.Completions.ChatCompletion>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>\n | OpenAIClient.Chat.Completions.ChatCompletion\n > {\n const clientOptions = this._getClientOptions(requestOptions);\n const isParseableFormat =\n request.response_format && request.response_format.type === \"json_schema\";\n return this.caller.call(async () => {\n try {\n if (isParseableFormat && !request.stream) {\n return await this.client.chat.completions.parse(\n request,\n clientOptions\n );\n } else {\n return await this.client.chat.completions.create(\n request,\n clientOptions\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsDeltaToBaseMessageChunk(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n return convertCompletionsDeltaToBaseMessageChunk({\n delta,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n defaultRole,\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsMessageToBaseMessage(\n message: OpenAIClient.ChatCompletionMessage,\n rawResponse: OpenAIClient.ChatCompletion\n ): BaseMessage {\n return convertCompletionsMessageToBaseMessage({\n message,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n });\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"completions.cjs","names":["BaseChatOpenAI","getChatOpenAIModelParams","formatToOpenAIToolChoice","isReasoningModel","convertMessagesToCompletionsMessageParams","AIMessage","ChatGenerationChunk","AIMessageChunk","wrapOpenAIClientError","convertCompletionsDeltaToBaseMessageChunk","convertCompletionsMessageToBaseMessage"],"sources":["../../src/chat_models/completions.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n isAIMessage,\n type UsageMetadata,\n type AIMessageFields,\n BaseMessageChunk,\n} from \"@langchain/core/messages\";\nimport {\n ChatGenerationChunk,\n type ChatGeneration,\n type ChatResult,\n} from \"@langchain/core/outputs\";\nimport { NewTokenIndices } from \"@langchain/core/callbacks/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n OpenAIToolChoice,\n formatToOpenAIToolChoice,\n _convertToOpenAITool,\n} from \"../utils/tools.js\";\nimport { isReasoningModel } from \"../utils/misc.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertCompletionsDeltaToBaseMessageChunk,\n convertCompletionsMessageToBaseMessage,\n convertMessagesToCompletionsMessageParams,\n} from \"../converters/completions.js\";\n\nexport interface ChatOpenAICompletionsCallOptions extends BaseChatOpenAICallOptions {}\n\ntype ChatCompletionsInvocationParams = Omit<\n OpenAIClient.Chat.Completions.ChatCompletionCreateParams,\n \"messages\"\n>;\n\n/**\n * OpenAI Completions API implementation.\n * @internal\n */\nexport class ChatOpenAICompletions<\n CallOptions extends ChatOpenAICompletionsCallOptions =\n ChatOpenAICompletionsCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n /** @internal */\n override invocationParams(\n options?: this[\"ParsedCallOptions\"],\n extra?: { streaming?: boolean }\n ): ChatCompletionsInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n let streamOptionsConfig = {};\n if (options?.stream_options !== undefined) {\n streamOptionsConfig = { stream_options: options.stream_options };\n } else if (this.streamUsage && (this.streaming || extra?.streaming)) {\n streamOptionsConfig = { stream_options: { include_usage: true } };\n }\n\n const params: Partial<ChatCompletionsInvocationParams> = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n logprobs: this.logprobs,\n top_logprobs: this.topLogprobs,\n n: this.n,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n functions: options?.functions,\n function_call: options?.function_call,\n tools: options?.tools?.length\n ? options.tools.map((tool) =>\n this._convertChatOpenAIToolToCompletionsTool(tool, { strict })\n )\n : undefined,\n tool_choice: formatToOpenAIToolChoice(\n options?.tool_choice as OpenAIToolChoice\n ),\n response_format: this._getResponseFormat(options?.response_format),\n seed: options?.seed,\n ...streamOptionsConfig,\n parallel_tool_calls: options?.parallel_tool_calls,\n ...(this.audio || options?.audio\n ? { audio: this.audio || options?.audio }\n : {}),\n ...(this.modalities || options?.modalities\n ? { modalities: this.modalities || options?.modalities }\n : {}),\n ...this.modelKwargs,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n verbosity: options?.verbosity ?? this.verbosity,\n };\n if (options?.prediction !== undefined) {\n params.prediction = options.prediction;\n }\n if (this.service_tier !== undefined) {\n params.service_tier = this.service_tier;\n }\n if (options?.service_tier !== undefined) {\n params.service_tier = options.service_tier;\n }\n const reasoning = this._getReasoningParams(options);\n if (reasoning !== undefined && reasoning.effort !== undefined) {\n params.reasoning_effort = reasoning.effort;\n }\n if (isReasoningModel(params.model)) {\n params.max_completion_tokens =\n this.maxTokens === -1 ? undefined : this.maxTokens;\n } else {\n params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;\n }\n\n return params as ChatCompletionsInvocationParams;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const usageMetadata = {} as UsageMetadata;\n const params = this.invocationParams(options);\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n if (params.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks: Record<number, ChatGenerationChunk> = {};\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n const index =\n (chunk.generationInfo as NewTokenIndices)?.completion ?? 0;\n if (finalChunks[index] === undefined) {\n finalChunks[index] = chunk;\n } else {\n finalChunks[index] = finalChunks[index].concat(chunk);\n }\n }\n const generations = Object.entries(finalChunks)\n .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10))\n .map(([_, value]) => value);\n\n const { functions, function_call } = this.invocationParams(options);\n\n // OpenAI does not support token usage report under stream mode,\n // fallback to estimation.\n\n const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n messages,\n functions,\n function_call\n );\n const completionTokenUsage =\n await this._getNumTokensFromGenerations(generations);\n\n usageMetadata.input_tokens = promptTokenUsage;\n usageMetadata.output_tokens = completionTokenUsage;\n usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n return {\n generations,\n llmOutput: {\n estimatedTokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options?.signal,\n ...options?.options,\n }\n );\n\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n prompt_tokens_details: promptTokensDetails,\n completion_tokens_details: completionTokensDetails,\n } = data?.usage ?? {};\n\n if (completionTokens) {\n usageMetadata.output_tokens =\n (usageMetadata.output_tokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n usageMetadata.input_tokens =\n (usageMetadata.input_tokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n usageMetadata.total_tokens =\n (usageMetadata.total_tokens ?? 0) + totalTokens;\n }\n\n if (\n promptTokensDetails?.audio_tokens !== null ||\n promptTokensDetails?.cached_tokens !== null\n ) {\n usageMetadata.input_token_details = {\n ...(promptTokensDetails?.audio_tokens !== null && {\n audio: promptTokensDetails?.audio_tokens,\n }),\n ...(promptTokensDetails?.cached_tokens !== null && {\n cache_read: promptTokensDetails?.cached_tokens,\n }),\n };\n }\n\n if (\n completionTokensDetails?.audio_tokens !== null ||\n completionTokensDetails?.reasoning_tokens !== null\n ) {\n usageMetadata.output_token_details = {\n ...(completionTokensDetails?.audio_tokens !== null && {\n audio: completionTokensDetails?.audio_tokens,\n }),\n ...(completionTokensDetails?.reasoning_tokens !== null && {\n reasoning: completionTokensDetails?.reasoning_tokens,\n }),\n };\n }\n\n const generations: ChatGeneration[] = [];\n for (const part of data?.choices ?? []) {\n const text = part.message?.content ?? \"\";\n const generation: ChatGeneration = {\n text,\n message: this._convertCompletionsMessageToBaseMessage(\n part.message ?? { role: \"assistant\" },\n data\n ),\n };\n generation.generationInfo = {\n ...(part.finish_reason ? { finish_reason: part.finish_reason } : {}),\n ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata;\n }\n // Fields are not serialized unless passed to the constructor\n // Doing this ensures all fields on the message are serialized\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith(\"lc_\")\n )\n ) as AIMessageFields\n );\n generations.push(generation);\n }\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n const params = {\n ...this.invocationParams(options, {\n streaming: true,\n }),\n messages: messagesMapped,\n stream: true as const,\n };\n let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n const streamIterable = await this.completionWithRetry(params, options);\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const choice = data?.choices?.[0];\n if (data.usage) {\n usage = data.usage;\n }\n if (!choice) {\n continue;\n }\n\n const { delta } = choice;\n if (!delta) {\n continue;\n }\n const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index ?? 0,\n };\n if (typeof chunk.content !== \"string\") {\n console.log(\n \"[WARNING]: Received non-string content from OpenAI. This is currently not supported.\"\n );\n continue;\n }\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const generationInfo: Record<string, any> = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n generationInfo.finish_reason = choice.finish_reason;\n // Only include system fingerprint in the last chunk for now\n // to avoid concatenation issues\n generationInfo.system_fingerprint = data.system_fingerprint;\n generationInfo.model_name = data.model;\n generationInfo.service_tier = data.service_tier;\n }\n if (this.logprobs) {\n generationInfo.logprobs = choice.logprobs;\n }\n const generationChunk = new ChatGenerationChunk({\n message: chunk,\n text: chunk.content,\n generationInfo,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (usage) {\n const inputTokenDetails = {\n ...(usage.prompt_tokens_details?.audio_tokens !== null && {\n audio: usage.prompt_tokens_details?.audio_tokens,\n }),\n ...(usage.prompt_tokens_details?.cached_tokens !== null && {\n cache_read: usage.prompt_tokens_details?.cached_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage.completion_tokens_details?.audio_tokens !== null && {\n audio: usage.completion_tokens_details?.audio_tokens,\n }),\n ...(usage.completion_tokens_details?.reasoning_tokens !== null && {\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n }),\n };\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: {\n usage: { ...usage },\n },\n usage_metadata: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n ...(Object.keys(inputTokenDetails).length > 0 && {\n input_token_details: inputTokenDetails,\n }),\n ...(Object.keys(outputTokenDetails).length > 0 && {\n output_token_details: outputTokenDetails,\n }),\n },\n }),\n text: \"\",\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n { prompt: 0, completion: 0 },\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Chat.Completions.ChatCompletion>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>\n | OpenAIClient.Chat.Completions.ChatCompletion\n > {\n const clientOptions = this._getClientOptions(requestOptions);\n const isParseableFormat =\n request.response_format && request.response_format.type === \"json_schema\";\n return this.caller.call(async () => {\n try {\n if (isParseableFormat && !request.stream) {\n return await this.client.chat.completions.parse(\n request,\n clientOptions\n );\n } else {\n return await this.client.chat.completions.create(\n request,\n clientOptions\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsDeltaToBaseMessageChunk(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n return convertCompletionsDeltaToBaseMessageChunk({\n delta,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n defaultRole,\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsMessageToBaseMessage(\n message: OpenAIClient.ChatCompletionMessage,\n rawResponse: OpenAIClient.ChatCompletion\n ): BaseMessage {\n return convertCompletionsMessageToBaseMessage({\n message,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n });\n }\n}\n"],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"completions.js","names":[],"sources":["../../src/chat_models/completions.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n isAIMessage,\n type UsageMetadata,\n type AIMessageFields,\n BaseMessageChunk,\n} from \"@langchain/core/messages\";\nimport {\n ChatGenerationChunk,\n type ChatGeneration,\n type ChatResult,\n} from \"@langchain/core/outputs\";\nimport { NewTokenIndices } from \"@langchain/core/callbacks/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n OpenAIToolChoice,\n formatToOpenAIToolChoice,\n _convertToOpenAITool,\n} from \"../utils/tools.js\";\nimport { isReasoningModel } from \"../utils/misc.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertCompletionsDeltaToBaseMessageChunk,\n convertCompletionsMessageToBaseMessage,\n convertMessagesToCompletionsMessageParams,\n} from \"../converters/completions.js\";\n\nexport interface ChatOpenAICompletionsCallOptions extends BaseChatOpenAICallOptions {}\n\ntype ChatCompletionsInvocationParams = Omit<\n OpenAIClient.Chat.Completions.ChatCompletionCreateParams,\n \"messages\"\n>;\n\n/**\n * OpenAI Completions API implementation.\n * @internal\n */\nexport class ChatOpenAICompletions<\n CallOptions extends ChatOpenAICompletionsCallOptions =\n ChatOpenAICompletionsCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n /** @internal */\n override invocationParams(\n options?: this[\"ParsedCallOptions\"],\n extra?: { streaming?: boolean }\n ): ChatCompletionsInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n let streamOptionsConfig = {};\n if (options?.stream_options !== undefined) {\n streamOptionsConfig = { stream_options: options.stream_options };\n } else if (this.streamUsage && (this.streaming || extra?.streaming)) {\n streamOptionsConfig = { stream_options: { include_usage: true } };\n }\n\n const params: Partial<ChatCompletionsInvocationParams> = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n logprobs: this.logprobs,\n top_logprobs: this.topLogprobs,\n n: this.n,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n functions: options?.functions,\n function_call: options?.function_call,\n tools: options?.tools?.length\n ? options.tools.map((tool) =>\n this._convertChatOpenAIToolToCompletionsTool(tool, { strict })\n )\n : undefined,\n tool_choice: formatToOpenAIToolChoice(\n options?.tool_choice as OpenAIToolChoice\n ),\n response_format: this._getResponseFormat(options?.response_format),\n seed: options?.seed,\n ...streamOptionsConfig,\n parallel_tool_calls: options?.parallel_tool_calls,\n ...(this.audio || options?.audio\n ? { audio: this.audio || options?.audio }\n : {}),\n ...(this.modalities || options?.modalities\n ? { modalities: this.modalities || options?.modalities }\n : {}),\n ...this.modelKwargs,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n verbosity: options?.verbosity ?? this.verbosity,\n };\n if (options?.prediction !== undefined) {\n params.prediction = options.prediction;\n }\n if (this.service_tier !== undefined) {\n params.service_tier = this.service_tier;\n }\n if (options?.service_tier !== undefined) {\n params.service_tier = options.service_tier;\n }\n const reasoning = this._getReasoningParams(options);\n if (reasoning !== undefined && reasoning.effort !== undefined) {\n params.reasoning_effort = reasoning.effort;\n }\n if (isReasoningModel(params.model)) {\n params.max_completion_tokens =\n this.maxTokens === -1 ? undefined : this.maxTokens;\n } else {\n params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;\n }\n\n return params as ChatCompletionsInvocationParams;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const usageMetadata = {} as UsageMetadata;\n const params = this.invocationParams(options);\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n if (params.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks: Record<number, ChatGenerationChunk> = {};\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n const index =\n (chunk.generationInfo as NewTokenIndices)?.completion ?? 0;\n if (finalChunks[index] === undefined) {\n finalChunks[index] = chunk;\n } else {\n finalChunks[index] = finalChunks[index].concat(chunk);\n }\n }\n const generations = Object.entries(finalChunks)\n .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10))\n .map(([_, value]) => value);\n\n const { functions, function_call } = this.invocationParams(options);\n\n // OpenAI does not support token usage report under stream mode,\n // fallback to estimation.\n\n const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n messages,\n functions,\n function_call\n );\n const completionTokenUsage =\n await this._getNumTokensFromGenerations(generations);\n\n usageMetadata.input_tokens = promptTokenUsage;\n usageMetadata.output_tokens = completionTokenUsage;\n usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n return {\n generations,\n llmOutput: {\n estimatedTokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options?.signal,\n ...options?.options,\n }\n );\n\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n prompt_tokens_details: promptTokensDetails,\n completion_tokens_details: completionTokensDetails,\n } = data?.usage ?? {};\n\n if (completionTokens) {\n usageMetadata.output_tokens =\n (usageMetadata.output_tokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n usageMetadata.input_tokens =\n (usageMetadata.input_tokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n usageMetadata.total_tokens =\n (usageMetadata.total_tokens ?? 0) + totalTokens;\n }\n\n if (\n promptTokensDetails?.audio_tokens !== null ||\n promptTokensDetails?.cached_tokens !== null\n ) {\n usageMetadata.input_token_details = {\n ...(promptTokensDetails?.audio_tokens !== null && {\n audio: promptTokensDetails?.audio_tokens,\n }),\n ...(promptTokensDetails?.cached_tokens !== null && {\n cache_read: promptTokensDetails?.cached_tokens,\n }),\n };\n }\n\n if (\n completionTokensDetails?.audio_tokens !== null ||\n completionTokensDetails?.reasoning_tokens !== null\n ) {\n usageMetadata.output_token_details = {\n ...(completionTokensDetails?.audio_tokens !== null && {\n audio: completionTokensDetails?.audio_tokens,\n }),\n ...(completionTokensDetails?.reasoning_tokens !== null && {\n reasoning: completionTokensDetails?.reasoning_tokens,\n }),\n };\n }\n\n const generations: ChatGeneration[] = [];\n for (const part of data?.choices ?? []) {\n const text = part.message?.content ?? \"\";\n const generation: ChatGeneration = {\n text,\n message: this._convertCompletionsMessageToBaseMessage(\n part.message ?? { role: \"assistant\" },\n data\n ),\n };\n generation.generationInfo = {\n ...(part.finish_reason ? { finish_reason: part.finish_reason } : {}),\n ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata;\n }\n // Fields are not serialized unless passed to the constructor\n // Doing this ensures all fields on the message are serialized\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith(\"lc_\")\n )\n ) as AIMessageFields\n );\n generations.push(generation);\n }\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n const params = {\n ...this.invocationParams(options, {\n streaming: true,\n }),\n messages: messagesMapped,\n stream: true as const,\n };\n let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n const streamIterable = await this.completionWithRetry(params, options);\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const choice = data?.choices?.[0];\n if (data.usage) {\n usage = data.usage;\n }\n if (!choice) {\n continue;\n }\n\n const { delta } = choice;\n if (!delta) {\n continue;\n }\n const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index ?? 0,\n };\n if (typeof chunk.content !== \"string\") {\n console.log(\n \"[WARNING]: Received non-string content from OpenAI. This is currently not supported.\"\n );\n continue;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const generationInfo: Record<string, any> = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n generationInfo.finish_reason = choice.finish_reason;\n // Only include system fingerprint in the last chunk for now\n // to avoid concatenation issues\n generationInfo.system_fingerprint = data.system_fingerprint;\n generationInfo.model_name = data.model;\n generationInfo.service_tier = data.service_tier;\n }\n if (this.logprobs) {\n generationInfo.logprobs = choice.logprobs;\n }\n const generationChunk = new ChatGenerationChunk({\n message: chunk,\n text: chunk.content,\n generationInfo,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (usage) {\n const inputTokenDetails = {\n ...(usage.prompt_tokens_details?.audio_tokens !== null && {\n audio: usage.prompt_tokens_details?.audio_tokens,\n }),\n ...(usage.prompt_tokens_details?.cached_tokens !== null && {\n cache_read: usage.prompt_tokens_details?.cached_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage.completion_tokens_details?.audio_tokens !== null && {\n audio: usage.completion_tokens_details?.audio_tokens,\n }),\n ...(usage.completion_tokens_details?.reasoning_tokens !== null && {\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n }),\n };\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: {\n usage: { ...usage },\n },\n usage_metadata: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n ...(Object.keys(inputTokenDetails).length > 0 && {\n input_token_details: inputTokenDetails,\n }),\n ...(Object.keys(outputTokenDetails).length > 0 && {\n output_token_details: outputTokenDetails,\n }),\n },\n }),\n text: \"\",\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n { prompt: 0, completion: 0 },\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Chat.Completions.ChatCompletion>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>\n | OpenAIClient.Chat.Completions.ChatCompletion\n > {\n const clientOptions = this._getClientOptions(requestOptions);\n const isParseableFormat =\n request.response_format && request.response_format.type === \"json_schema\";\n return this.caller.call(async () => {\n try {\n if (isParseableFormat && !request.stream) {\n return await this.client.chat.completions.parse(\n request,\n clientOptions\n );\n } else {\n return await this.client.chat.completions.create(\n request,\n clientOptions\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsDeltaToBaseMessageChunk(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n return convertCompletionsDeltaToBaseMessageChunk({\n delta,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n defaultRole,\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsMessageToBaseMessage(\n message: OpenAIClient.ChatCompletionMessage,\n rawResponse: OpenAIClient.ChatCompletion\n ): BaseMessage {\n return convertCompletionsMessageToBaseMessage({\n message,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n });\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"completions.js","names":[],"sources":["../../src/chat_models/completions.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n isAIMessage,\n type UsageMetadata,\n type AIMessageFields,\n BaseMessageChunk,\n} from \"@langchain/core/messages\";\nimport {\n ChatGenerationChunk,\n type ChatGeneration,\n type ChatResult,\n} from \"@langchain/core/outputs\";\nimport { NewTokenIndices } from \"@langchain/core/callbacks/base\";\nimport { wrapOpenAIClientError } from \"../utils/client.js\";\nimport {\n OpenAIToolChoice,\n formatToOpenAIToolChoice,\n _convertToOpenAITool,\n} from \"../utils/tools.js\";\nimport { isReasoningModel } from \"../utils/misc.js\";\nimport {\n BaseChatOpenAI,\n BaseChatOpenAICallOptions,\n BaseChatOpenAIFields,\n getChatOpenAIModelParams,\n} from \"./base.js\";\nimport {\n convertCompletionsDeltaToBaseMessageChunk,\n convertCompletionsMessageToBaseMessage,\n convertMessagesToCompletionsMessageParams,\n} from \"../converters/completions.js\";\n\nexport interface ChatOpenAICompletionsCallOptions extends BaseChatOpenAICallOptions {}\n\ntype ChatCompletionsInvocationParams = Omit<\n OpenAIClient.Chat.Completions.ChatCompletionCreateParams,\n \"messages\"\n>;\n\n/**\n * OpenAI Completions API implementation.\n * @internal\n */\nexport class ChatOpenAICompletions<\n CallOptions extends ChatOpenAICompletionsCallOptions =\n ChatOpenAICompletionsCallOptions,\n> extends BaseChatOpenAI<CallOptions> {\n constructor(model: string, fields?: Omit<BaseChatOpenAIFields, \"model\">);\n constructor(fields?: BaseChatOpenAIFields);\n constructor(\n modelOrFields?: string | BaseChatOpenAIFields,\n fieldsArg?: Omit<BaseChatOpenAIFields, \"model\">\n ) {\n super(getChatOpenAIModelParams(modelOrFields, fieldsArg));\n }\n\n /** @internal */\n override invocationParams(\n options?: this[\"ParsedCallOptions\"],\n extra?: { streaming?: boolean }\n ): ChatCompletionsInvocationParams {\n let strict: boolean | undefined;\n if (options?.strict !== undefined) {\n strict = options.strict;\n } else if (this.supportsStrictToolCalling !== undefined) {\n strict = this.supportsStrictToolCalling;\n }\n\n let streamOptionsConfig = {};\n if (options?.stream_options !== undefined) {\n streamOptionsConfig = { stream_options: options.stream_options };\n } else if (this.streamUsage && (this.streaming || extra?.streaming)) {\n streamOptionsConfig = { stream_options: { include_usage: true } };\n }\n\n const params: Partial<ChatCompletionsInvocationParams> = {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n logprobs: this.logprobs,\n top_logprobs: this.topLogprobs,\n n: this.n,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n // if include_usage is set or streamUsage then stream must be set to true.\n stream: this.streaming,\n functions: options?.functions,\n function_call: options?.function_call,\n tools: options?.tools?.length\n ? options.tools.map((tool) =>\n this._convertChatOpenAIToolToCompletionsTool(tool, { strict })\n )\n : undefined,\n tool_choice: formatToOpenAIToolChoice(\n options?.tool_choice as OpenAIToolChoice\n ),\n response_format: this._getResponseFormat(options?.response_format),\n seed: options?.seed,\n ...streamOptionsConfig,\n parallel_tool_calls: options?.parallel_tool_calls,\n ...(this.audio || options?.audio\n ? { audio: this.audio || options?.audio }\n : {}),\n ...(this.modalities || options?.modalities\n ? { modalities: this.modalities || options?.modalities }\n : {}),\n ...this.modelKwargs,\n prompt_cache_key: options?.promptCacheKey ?? this.promptCacheKey,\n prompt_cache_retention:\n options?.promptCacheRetention ?? this.promptCacheRetention,\n verbosity: options?.verbosity ?? this.verbosity,\n };\n if (options?.prediction !== undefined) {\n params.prediction = options.prediction;\n }\n if (this.service_tier !== undefined) {\n params.service_tier = this.service_tier;\n }\n if (options?.service_tier !== undefined) {\n params.service_tier = options.service_tier;\n }\n const reasoning = this._getReasoningParams(options);\n if (reasoning !== undefined && reasoning.effort !== undefined) {\n params.reasoning_effort = reasoning.effort;\n }\n if (isReasoningModel(params.model)) {\n params.max_completion_tokens =\n this.maxTokens === -1 ? undefined : this.maxTokens;\n } else {\n params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;\n }\n\n return params as ChatCompletionsInvocationParams;\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const usageMetadata = {} as UsageMetadata;\n const params = this.invocationParams(options);\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n if (params.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks: Record<number, ChatGenerationChunk> = {};\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n const index =\n (chunk.generationInfo as NewTokenIndices)?.completion ?? 0;\n if (finalChunks[index] === undefined) {\n finalChunks[index] = chunk;\n } else {\n finalChunks[index] = finalChunks[index].concat(chunk);\n }\n }\n const generations = Object.entries(finalChunks)\n .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10))\n .map(([_, value]) => value);\n\n const { functions, function_call } = this.invocationParams(options);\n\n // OpenAI does not support token usage report under stream mode,\n // fallback to estimation.\n\n const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n messages,\n functions,\n function_call\n );\n const completionTokenUsage =\n await this._getNumTokensFromGenerations(generations);\n\n usageMetadata.input_tokens = promptTokenUsage;\n usageMetadata.output_tokens = completionTokenUsage;\n usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n return {\n generations,\n llmOutput: {\n estimatedTokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n } else {\n const data = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options?.signal,\n ...options?.options,\n }\n );\n\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n prompt_tokens_details: promptTokensDetails,\n completion_tokens_details: completionTokensDetails,\n } = data?.usage ?? {};\n\n if (completionTokens) {\n usageMetadata.output_tokens =\n (usageMetadata.output_tokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n usageMetadata.input_tokens =\n (usageMetadata.input_tokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n usageMetadata.total_tokens =\n (usageMetadata.total_tokens ?? 0) + totalTokens;\n }\n\n if (\n promptTokensDetails?.audio_tokens !== null ||\n promptTokensDetails?.cached_tokens !== null\n ) {\n usageMetadata.input_token_details = {\n ...(promptTokensDetails?.audio_tokens !== null && {\n audio: promptTokensDetails?.audio_tokens,\n }),\n ...(promptTokensDetails?.cached_tokens !== null && {\n cache_read: promptTokensDetails?.cached_tokens,\n }),\n };\n }\n\n if (\n completionTokensDetails?.audio_tokens !== null ||\n completionTokensDetails?.reasoning_tokens !== null\n ) {\n usageMetadata.output_token_details = {\n ...(completionTokensDetails?.audio_tokens !== null && {\n audio: completionTokensDetails?.audio_tokens,\n }),\n ...(completionTokensDetails?.reasoning_tokens !== null && {\n reasoning: completionTokensDetails?.reasoning_tokens,\n }),\n };\n }\n\n const generations: ChatGeneration[] = [];\n for (const part of data?.choices ?? []) {\n const text = part.message?.content ?? \"\";\n const generation: ChatGeneration = {\n text,\n message: this._convertCompletionsMessageToBaseMessage(\n part.message ?? { role: \"assistant\" },\n data\n ),\n };\n generation.generationInfo = {\n ...(part.finish_reason ? { finish_reason: part.finish_reason } : {}),\n ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata;\n }\n // Fields are not serialized unless passed to the constructor\n // Doing this ensures all fields on the message are serialized\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith(\"lc_\")\n )\n ) as AIMessageFields\n );\n generations.push(generation);\n }\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const messagesMapped: OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] =\n convertMessagesToCompletionsMessageParams({\n messages,\n model: this.model,\n });\n\n const params = {\n ...this.invocationParams(options, {\n streaming: true,\n }),\n messages: messagesMapped,\n stream: true as const,\n };\n let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n const streamIterable = await this.completionWithRetry(params, options);\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n for await (const data of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const choice = data?.choices?.[0];\n if (data.usage) {\n usage = data.usage;\n }\n if (!choice) {\n continue;\n }\n\n const { delta } = choice;\n if (!delta) {\n continue;\n }\n const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index ?? 0,\n };\n if (typeof chunk.content !== \"string\") {\n console.log(\n \"[WARNING]: Received non-string content from OpenAI. This is currently not supported.\"\n );\n continue;\n }\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const generationInfo: Record<string, any> = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n generationInfo.finish_reason = choice.finish_reason;\n // Only include system fingerprint in the last chunk for now\n // to avoid concatenation issues\n generationInfo.system_fingerprint = data.system_fingerprint;\n generationInfo.model_name = data.model;\n generationInfo.service_tier = data.service_tier;\n }\n if (this.logprobs) {\n generationInfo.logprobs = choice.logprobs;\n }\n const generationChunk = new ChatGenerationChunk({\n message: chunk,\n text: chunk.content,\n generationInfo,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (usage) {\n const inputTokenDetails = {\n ...(usage.prompt_tokens_details?.audio_tokens !== null && {\n audio: usage.prompt_tokens_details?.audio_tokens,\n }),\n ...(usage.prompt_tokens_details?.cached_tokens !== null && {\n cache_read: usage.prompt_tokens_details?.cached_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage.completion_tokens_details?.audio_tokens !== null && {\n audio: usage.completion_tokens_details?.audio_tokens,\n }),\n ...(usage.completion_tokens_details?.reasoning_tokens !== null && {\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n }),\n };\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: {\n usage: { ...usage },\n },\n usage_metadata: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n ...(Object.keys(inputTokenDetails).length > 0 && {\n input_token_details: inputTokenDetails,\n }),\n ...(Object.keys(outputTokenDetails).length > 0 && {\n output_token_details: outputTokenDetails,\n }),\n },\n }),\n text: \"\",\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text ?? \"\",\n { prompt: 0, completion: 0 },\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<OpenAIClient.Chat.Completions.ChatCompletion>;\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParams,\n requestOptions?: OpenAIClient.RequestOptions\n ): Promise<\n | AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>\n | OpenAIClient.Chat.Completions.ChatCompletion\n > {\n const clientOptions = this._getClientOptions(requestOptions);\n const isParseableFormat =\n request.response_format && request.response_format.type === \"json_schema\";\n return this.caller.call(async () => {\n try {\n if (isParseableFormat && !request.stream) {\n return await this.client.chat.completions.parse(\n request,\n clientOptions\n );\n } else {\n return await this.client.chat.completions.create(\n request,\n clientOptions\n );\n }\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsDeltaToBaseMessageChunk(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n return convertCompletionsDeltaToBaseMessageChunk({\n delta,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n defaultRole,\n });\n }\n\n /**\n * @deprecated\n * This function was hoisted into a publicly accessible function from a\n * different export, but to maintain backwards compatibility with chat models\n * that depend on ChatOpenAICompletions, we'll keep it here as an overridable\n * method. This will be removed in a future release\n */\n protected _convertCompletionsMessageToBaseMessage(\n message: OpenAIClient.ChatCompletionMessage,\n rawResponse: OpenAIClient.ChatCompletion\n ): BaseMessage {\n return convertCompletionsMessageToBaseMessage({\n message,\n rawResponse,\n includeRawResponse: this.__includeRawResponse,\n });\n }\n}\n"],"mappings":"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"} |
@@ -5,4 +5,4 @@ import { OpenAICallOptions, OpenAIChatInput } from "../types.cjs"; | ||
| import { ChatOpenAICompletions, ChatOpenAICompletionsCallOptions } from "./completions.cjs"; | ||
| import * as _langchain_core_language_models_chat_models0 from "@langchain/core/language_models/chat_models"; | ||
| import * as openai_resources0 from "openai/resources"; | ||
| import * as _$_langchain_core_language_models_chat_models0 from "@langchain/core/language_models/chat_models"; | ||
| import * as _$openai_resources0 from "openai/resources"; | ||
| import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager"; | ||
@@ -587,39 +587,39 @@ import { AIMessageChunk, BaseMessage } from "@langchain/core/messages"; | ||
| protected _useResponsesApi(options: this["ParsedCallOptions"] | undefined): boolean; | ||
| getLsParams(options: this["ParsedCallOptions"]): _langchain_core_language_models_chat_models0.LangSmithParams; | ||
| getLsParams(options: this["ParsedCallOptions"]): _$_langchain_core_language_models_chat_models0.LangSmithParams; | ||
| invocationParams(options?: this["ParsedCallOptions"]): { | ||
| model: openai_resources0.ChatModel | (string & {}); | ||
| audio?: openai_resources0.ChatCompletionAudioParam | null | undefined; | ||
| frequency_penalty?: number | null | undefined; | ||
| function_call?: "auto" | "none" | openai_resources0.ChatCompletionFunctionCallOption | undefined; | ||
| functions?: openai_resources0.ChatCompletionCreateParams.Function[] | undefined; | ||
| model: (string & {}) | _$openai_resources0.ChatModel; | ||
| audio?: _$openai_resources0.ChatCompletionAudioParam | null; | ||
| frequency_penalty?: number | null; | ||
| function_call?: 'none' | 'auto' | _$openai_resources0.ChatCompletionFunctionCallOption; | ||
| functions?: Array<_$openai_resources0.ChatCompletionCreateParams.Function>; | ||
| logit_bias?: { | ||
| [key: string]: number; | ||
| } | null | undefined; | ||
| logprobs?: boolean | null | undefined; | ||
| max_completion_tokens?: number | null | undefined; | ||
| max_tokens?: number | null | undefined; | ||
| metadata?: openai_resources0.Metadata | null | undefined; | ||
| modalities?: ("audio" | "text")[] | null | undefined; | ||
| n?: number | null | undefined; | ||
| parallel_tool_calls?: boolean | undefined; | ||
| prediction?: openai_resources0.ChatCompletionPredictionContent | null | undefined; | ||
| presence_penalty?: number | null | undefined; | ||
| prompt_cache_key?: string | undefined; | ||
| prompt_cache_retention?: "24h" | "in-memory" | null | undefined; | ||
| reasoning_effort?: openai_resources0.ReasoningEffort | undefined; | ||
| response_format?: openai_resources0.ResponseFormatJSONObject | openai_resources0.ResponseFormatJSONSchema | openai_resources0.ResponseFormatText | undefined; | ||
| safety_identifier?: string | undefined; | ||
| seed?: number | null | undefined; | ||
| service_tier?: "auto" | "default" | "flex" | "priority" | "scale" | null | undefined; | ||
| stop?: string | string[] | null | undefined; | ||
| store?: boolean | null | undefined; | ||
| stream_options?: openai_resources0.ChatCompletionStreamOptions | null | undefined; | ||
| temperature?: number | null | undefined; | ||
| tool_choice?: openai_resources0.ChatCompletionToolChoiceOption | undefined; | ||
| tools?: openai_resources0.ChatCompletionTool[] | undefined; | ||
| top_logprobs?: number | null | undefined; | ||
| top_p?: number | null | undefined; | ||
| user?: string | undefined; | ||
| verbosity?: "high" | "low" | "medium" | null | undefined; | ||
| web_search_options?: openai_resources0.ChatCompletionCreateParams.WebSearchOptions | undefined; | ||
| } | null; | ||
| logprobs?: boolean | null; | ||
| max_completion_tokens?: number | null; | ||
| max_tokens?: number | null; | ||
| metadata?: _$openai_resources0.Metadata | null; | ||
| modalities?: Array<'text' | 'audio'> | null; | ||
| n?: number | null; | ||
| parallel_tool_calls?: boolean; | ||
| prediction?: _$openai_resources0.ChatCompletionPredictionContent | null; | ||
| presence_penalty?: number | null; | ||
| prompt_cache_key?: string; | ||
| prompt_cache_retention?: 'in-memory' | '24h' | null; | ||
| reasoning_effort?: _$openai_resources0.ReasoningEffort | null; | ||
| response_format?: _$openai_resources0.ResponseFormatText | _$openai_resources0.ResponseFormatJSONSchema | _$openai_resources0.ResponseFormatJSONObject; | ||
| safety_identifier?: string; | ||
| seed?: number | null; | ||
| service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority' | null; | ||
| stop?: string | null | Array<string>; | ||
| store?: boolean | null; | ||
| stream_options?: _$openai_resources0.ChatCompletionStreamOptions | null; | ||
| temperature?: number | null; | ||
| tool_choice?: _$openai_resources0.ChatCompletionToolChoiceOption; | ||
| tools?: Array<_$openai_resources0.ChatCompletionTool>; | ||
| top_logprobs?: number | null; | ||
| top_p?: number | null; | ||
| user?: string; | ||
| verbosity?: 'low' | 'medium' | 'high' | null; | ||
| web_search_options?: _$openai_resources0.ChatCompletionCreateParams.WebSearchOptions; | ||
| stream?: boolean | null | undefined; | ||
@@ -626,0 +626,0 @@ } | ChatResponsesInvocationParams; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/chat_models/index.ts"],"mappings":";;;;;;;;;;;;;KA8BY,qBAAA,GAAwB,gCAAA,GAClC,8BAAA;AAAA,UAEe,gBAAA,SAAyB,oBAAA;;AAH1C;;;EAQE,eAAA;EAP8B;AAEhC;;;EAUE,WAAA,GAAc,qBAAA;EAKF;;;;EAAZ,SAAA,GAAY,mBAAA;AAAA;;;;;;;AA+hBd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,UAAA,qBACS,qBAAA,GAAwB,qBAAA,UACpC,cAAA,CAAe,WAAA;;;;;EAKvB,eAAA;EAAA,UAEU,SAAA,EAAW,mBAAA;EAAA,UAEX,WAAA,EAAa,qBAAA;EAAA,IAEnB,oBAAA,CAAA;EAAA,IAIA,QAAA,CAAA;EAAA,UAIM,MAAA,GAAS,gBAAA;EAEnB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,gBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,gBAAA;EAAA,UAaX,gBAAA,CAAiB,OAAA;EAsBlB,WAAA,CAAY,OAAA,8BAnCgB,4CAAA,CAmCkB,eAAA;EAQ9C,gBAAA,CAAiB,OAAA;WAR6B,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBxC,SAAA,CACb,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAOK,qBAAA,CACd,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EAgBT,UAAA,CACP,MAAA,EAAQ,OAAA,CAAQ,WAAA,IACf,QAAA,CAAS,sBAAA,EAAwB,cAAA,EAAgB,WAAA;AAAA"} | ||
| {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/chat_models/index.ts"],"mappings":";;;;;;;;;;;;;KA8BY,qBAAA,GAAwB,gCAAA,GAClC,8BAAA;AAAA,UAEe,gBAAA,SAAyB,oBAAA;;AAH1C;;;EAQE,eAAA;EAP8B;AAEhC;;;EAUE,WAAA,GAAc,qBAAA;EAKF;;;;EAAZ,SAAA,GAAY,mBAAA;AAAA;;;;;;;AA+hBd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,UAAA,qBACS,qBAAA,GAAwB,qBAAA,UACpC,cAAA,CAAe,WAAA;;;;;EAKvB,eAAA;EAAA,UAEU,SAAA,EAAW,mBAAA;EAAA,UAEX,WAAA,EAAa,qBAAA;EAAA,IAEnB,oBAAA,CAAA;EAAA,IAIA,QAAA,CAAA;EAAA,UAIM,MAAA,GAAS,gBAAA;EAEnB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,gBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,gBAAA;EAAA,UAaX,gBAAA,CAAiB,OAAA;EAsBlB,WAAA,CAAY,OAAA,8BAnCgB,8CAAA,CAmCkB,eAAA;EAQ9C,gBAAA,CAAiB,OAAA;2BAR6B,mBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBxC,SAAA,CACb,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAOK,qBAAA,CACd,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EAgBT,UAAA,CACP,MAAA,EAAQ,OAAA,CAAQ,WAAA,IACf,QAAA,CAAS,sBAAA,EAAwB,cAAA,EAAgB,WAAA;AAAA"} |
@@ -7,6 +7,6 @@ import { OpenAICallOptions, OpenAIChatInput } from "../types.js"; | ||
| import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs"; | ||
| import * as _langchain_core_language_models_chat_models0 from "@langchain/core/language_models/chat_models"; | ||
| import * as _$_langchain_core_language_models_chat_models0 from "@langchain/core/language_models/chat_models"; | ||
| import { BaseLanguageModelInput } from "@langchain/core/language_models/base"; | ||
| import { Runnable } from "@langchain/core/runnables"; | ||
| import * as openai_resources0 from "openai/resources"; | ||
| import * as _$openai_resources0 from "openai/resources"; | ||
| import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager"; | ||
@@ -587,39 +587,39 @@ | ||
| protected _useResponsesApi(options: this["ParsedCallOptions"] | undefined): boolean; | ||
| getLsParams(options: this["ParsedCallOptions"]): _langchain_core_language_models_chat_models0.LangSmithParams; | ||
| getLsParams(options: this["ParsedCallOptions"]): _$_langchain_core_language_models_chat_models0.LangSmithParams; | ||
| invocationParams(options?: this["ParsedCallOptions"]): { | ||
| model: openai_resources0.ChatModel | (string & {}); | ||
| audio?: openai_resources0.ChatCompletionAudioParam | null | undefined; | ||
| frequency_penalty?: number | null | undefined; | ||
| function_call?: "auto" | "none" | openai_resources0.ChatCompletionFunctionCallOption | undefined; | ||
| functions?: openai_resources0.ChatCompletionCreateParams.Function[] | undefined; | ||
| model: (string & {}) | _$openai_resources0.ChatModel; | ||
| audio?: _$openai_resources0.ChatCompletionAudioParam | null; | ||
| frequency_penalty?: number | null; | ||
| function_call?: 'none' | 'auto' | _$openai_resources0.ChatCompletionFunctionCallOption; | ||
| functions?: Array<_$openai_resources0.ChatCompletionCreateParams.Function>; | ||
| logit_bias?: { | ||
| [key: string]: number; | ||
| } | null | undefined; | ||
| logprobs?: boolean | null | undefined; | ||
| max_completion_tokens?: number | null | undefined; | ||
| max_tokens?: number | null | undefined; | ||
| metadata?: openai_resources0.Metadata | null | undefined; | ||
| modalities?: ("audio" | "text")[] | null | undefined; | ||
| n?: number | null | undefined; | ||
| parallel_tool_calls?: boolean | undefined; | ||
| prediction?: openai_resources0.ChatCompletionPredictionContent | null | undefined; | ||
| presence_penalty?: number | null | undefined; | ||
| prompt_cache_key?: string | undefined; | ||
| prompt_cache_retention?: "24h" | "in-memory" | null | undefined; | ||
| reasoning_effort?: openai_resources0.ReasoningEffort | undefined; | ||
| response_format?: openai_resources0.ResponseFormatJSONObject | openai_resources0.ResponseFormatJSONSchema | openai_resources0.ResponseFormatText | undefined; | ||
| safety_identifier?: string | undefined; | ||
| seed?: number | null | undefined; | ||
| service_tier?: "auto" | "default" | "flex" | "priority" | "scale" | null | undefined; | ||
| stop?: string | string[] | null | undefined; | ||
| store?: boolean | null | undefined; | ||
| stream_options?: openai_resources0.ChatCompletionStreamOptions | null | undefined; | ||
| temperature?: number | null | undefined; | ||
| tool_choice?: openai_resources0.ChatCompletionToolChoiceOption | undefined; | ||
| tools?: openai_resources0.ChatCompletionTool[] | undefined; | ||
| top_logprobs?: number | null | undefined; | ||
| top_p?: number | null | undefined; | ||
| user?: string | undefined; | ||
| verbosity?: "high" | "low" | "medium" | null | undefined; | ||
| web_search_options?: openai_resources0.ChatCompletionCreateParams.WebSearchOptions | undefined; | ||
| } | null; | ||
| logprobs?: boolean | null; | ||
| max_completion_tokens?: number | null; | ||
| max_tokens?: number | null; | ||
| metadata?: _$openai_resources0.Metadata | null; | ||
| modalities?: Array<'text' | 'audio'> | null; | ||
| n?: number | null; | ||
| parallel_tool_calls?: boolean; | ||
| prediction?: _$openai_resources0.ChatCompletionPredictionContent | null; | ||
| presence_penalty?: number | null; | ||
| prompt_cache_key?: string; | ||
| prompt_cache_retention?: 'in-memory' | '24h' | null; | ||
| reasoning_effort?: _$openai_resources0.ReasoningEffort | null; | ||
| response_format?: _$openai_resources0.ResponseFormatText | _$openai_resources0.ResponseFormatJSONSchema | _$openai_resources0.ResponseFormatJSONObject; | ||
| safety_identifier?: string; | ||
| seed?: number | null; | ||
| service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority' | null; | ||
| stop?: string | null | Array<string>; | ||
| store?: boolean | null; | ||
| stream_options?: _$openai_resources0.ChatCompletionStreamOptions | null; | ||
| temperature?: number | null; | ||
| tool_choice?: _$openai_resources0.ChatCompletionToolChoiceOption; | ||
| tools?: Array<_$openai_resources0.ChatCompletionTool>; | ||
| top_logprobs?: number | null; | ||
| top_p?: number | null; | ||
| user?: string; | ||
| verbosity?: 'low' | 'medium' | 'high' | null; | ||
| web_search_options?: _$openai_resources0.ChatCompletionCreateParams.WebSearchOptions; | ||
| stream?: boolean | null | undefined; | ||
@@ -626,0 +626,0 @@ } | ChatResponsesInvocationParams; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/chat_models/index.ts"],"mappings":";;;;;;;;;;;;;KA8BY,qBAAA,GAAwB,gCAAA,GAClC,8BAAA;AAAA,UAEe,gBAAA,SAAyB,oBAAA;;AAH1C;;;EAQE,eAAA;EAP8B;AAEhC;;;EAUE,WAAA,GAAc,qBAAA;EAKF;;;;EAAZ,SAAA,GAAY,mBAAA;AAAA;;;;;;;AA+hBd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,UAAA,qBACS,qBAAA,GAAwB,qBAAA,UACpC,cAAA,CAAe,WAAA;;;;;EAKvB,eAAA;EAAA,UAEU,SAAA,EAAW,mBAAA;EAAA,UAEX,WAAA,EAAa,qBAAA;EAAA,IAEnB,oBAAA,CAAA;EAAA,IAIA,QAAA,CAAA;EAAA,UAIM,MAAA,GAAS,gBAAA;EAEnB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,gBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,gBAAA;EAAA,UAaX,gBAAA,CAAiB,OAAA;EAsBlB,WAAA,CAAY,OAAA,8BAnCgB,4CAAA,CAmCkB,eAAA;EAQ9C,gBAAA,CAAiB,OAAA;WAR6B,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBxC,SAAA,CACb,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAOK,qBAAA,CACd,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EAgBT,UAAA,CACP,MAAA,EAAQ,OAAA,CAAQ,WAAA,IACf,QAAA,CAAS,sBAAA,EAAwB,cAAA,EAAgB,WAAA;AAAA"} | ||
| {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/chat_models/index.ts"],"mappings":";;;;;;;;;;;;;KA8BY,qBAAA,GAAwB,gCAAA,GAClC,8BAAA;AAAA,UAEe,gBAAA,SAAyB,oBAAA;;AAH1C;;;EAQE,eAAA;EAP8B;AAEhC;;;EAUE,WAAA,GAAc,qBAAA;EAKF;;;;EAAZ,SAAA,GAAY,mBAAA;AAAA;;;;;;;AA+hBd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,UAAA,qBACS,qBAAA,GAAwB,qBAAA,UACpC,cAAA,CAAe,WAAA;;;;;EAKvB,eAAA;EAAA,UAEU,SAAA,EAAW,mBAAA;EAAA,UAEX,WAAA,EAAa,qBAAA;EAAA,IAEnB,oBAAA,CAAA;EAAA,IAIA,QAAA,CAAA;EAAA,UAIM,MAAA,GAAS,gBAAA;EAEnB,WAAA,CAAY,KAAA,UAAe,MAAA,GAAS,IAAA,CAAK,gBAAA;EACzC,WAAA,CAAY,MAAA,GAAS,gBAAA;EAAA,UAaX,gBAAA,CAAiB,OAAA;EAsBlB,WAAA,CAAY,OAAA,8BAnCgB,8CAAA,CAmCkB,eAAA;EAQ9C,gBAAA,CAAiB,OAAA;2BAR6B,mBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBxC,SAAA,CACb,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,OAAA,CAAQ,UAAA;EAOK,qBAAA,CACd,QAAA,EAAU,WAAA,IACV,OAAA,6BACA,UAAA,GAAa,wBAAA,GACZ,cAAA,CAAe,mBAAA;EAgBT,UAAA,CACP,MAAA,EAAQ,OAAA,CAAQ,WAAA,IACf,QAAA,CAAS,sBAAA,EAAwB,cAAA,EAAgB,WAAA;AAAA"} |
@@ -81,3 +81,3 @@ const require_misc = require("../utils/misc.cjs"); | ||
| file_data: block.url, | ||
| ...block.metadata?.filename || block.metadata?.name ? { filename } : {} | ||
| filename | ||
| } | ||
@@ -92,3 +92,3 @@ }; | ||
| file_data: `data:${block.mime_type ?? ""};base64,${block.data}`, | ||
| ...block.metadata?.filename || block.metadata?.name || block.metadata?.title ? { filename } : {} | ||
| filename | ||
| } | ||
@@ -95,0 +95,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"completions.cjs","names":["getRequiredFilenameFromMetadata","AIMessage","handleMultiModalOutput","ChatMessage","HumanMessageChunk","AIMessageChunk","SystemMessageChunk","FunctionMessageChunk","ToolMessageChunk","ChatMessageChunk","messageToOpenAIRole","isReasoningModel","ToolMessage","convertLangChainToolCallToOpenAI"],"sources":["../../src/converters/completions.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n BaseMessageChunk,\n ChatMessage,\n ChatMessageChunk,\n FunctionMessageChunk,\n HumanMessageChunk,\n OpenAIToolCall,\n SystemMessageChunk,\n ToolCallChunk,\n ToolMessage,\n ToolMessageChunk,\n parseBase64DataUrl,\n parseMimeType,\n StandardContentBlockConverter,\n isDataContentBlock,\n ContentBlock,\n iife,\n convertToProviderContentBlock,\n} from \"@langchain/core/messages\";\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport { Converter } from \"@langchain/core/utils/format\";\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from \"openai/resources/chat/completions\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { handleMultiModalOutput } from \"../utils/output.js\";\nimport {\n getRequiredFilenameFromMetadata,\n isReasoningModel,\n messageToOpenAIRole,\n} from \"../utils/misc.js\";\n\n/**\n * @deprecated This converter is an internal detail of the OpenAI provider. Do not use it directly. This will be revisited in a future release.\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\n const filename = getRequiredFilenameFromMetadata(block);\n\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,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n const filename = getRequiredFilenameFromMetadata(block);\n\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,\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\n/**\n * Converts an OpenAI Chat Completions API message to a LangChain BaseMessage.\n *\n * This converter transforms messages from OpenAI's Chat Completions API format into\n * LangChain's internal message representation, handling various message types and\n * preserving metadata, tool calls, and other relevant information.\n *\n * @remarks\n * The converter handles the following message roles:\n * - `assistant`: Converted to {@link AIMessage} with support for tool calls, function calls,\n * audio content, and multi-modal outputs\n * - Other roles: Converted to generic {@link ChatMessage}\n *\n * For assistant messages, the converter:\n * - Parses and validates tool calls, separating valid and invalid calls\n * - Preserves function call information in additional_kwargs\n * - Includes usage statistics and system fingerprint in response_metadata\n * - Handles multi-modal content (text, images, audio)\n * - Optionally includes the raw API response for debugging\n *\n * @param params - Conversion parameters\n * @param params.message - The OpenAI chat completion message to convert\n * @param params.rawResponse - The complete raw response from OpenAI's API, used to extract\n * metadata like model name, usage statistics, and system fingerprint\n * @param params.includeRawResponse - If true, includes the raw OpenAI response in the\n * message's additional_kwargs under the `__raw_response` key. Useful for debugging\n * or accessing provider-specific fields. Defaults to false.\n *\n * @returns A LangChain BaseMessage instance:\n * - {@link AIMessage} for assistant messages with tool calls, metadata, and content\n * - {@link ChatMessage} for all other message types\n *\n * @example\n * ```typescript\n * const baseMessage = convertCompletionsMessageToBaseMessage({\n * message: {\n * role: \"assistant\",\n * content: \"Hello! How can I help you?\",\n * tool_calls: [\n * {\n * id: \"call_123\",\n * type: \"function\",\n * function: { name: \"get_weather\", arguments: '{\"location\":\"NYC\"}' }\n * }\n * ]\n * },\n * rawResponse: completionResponse,\n * includeRawResponse: true\n * });\n * // Returns an AIMessage with parsed tool calls and metadata\n * ```\n *\n * @throws {Error} If tool call parsing fails, the invalid tool call is captured in\n * the `invalid_tool_calls` array rather than throwing an error\n *\n */\nexport const convertCompletionsMessageToBaseMessage: Converter<\n {\n message: OpenAIClient.Chat.Completions.ChatCompletionMessage;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletion;\n includeRawResponse?: boolean;\n },\n BaseMessage\n> = ({ message, rawResponse, includeRawResponse }) => {\n const rawToolCalls: OpenAIToolCall[] | undefined = message.tool_calls as\n | OpenAIToolCall[]\n | undefined;\n const providerReasoningContent = (message as { reasoning_content?: string })\n .reasoning_content;\n switch (message.role) {\n case \"assistant\": {\n const toolCalls = [];\n const invalidToolCalls = [];\n for (const rawToolCall of rawToolCalls ?? []) {\n try {\n toolCalls.push(parseToolCall(rawToolCall, { returnId: true }));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n invalidToolCalls.push(makeInvalidToolCall(rawToolCall, e.message));\n }\n }\n const additional_kwargs: Record<string, unknown> = {\n function_call: message.function_call,\n tool_calls: rawToolCalls,\n };\n if (includeRawResponse !== undefined) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (providerReasoningContent !== undefined) {\n additional_kwargs.reasoning_content = providerReasoningContent;\n }\n const response_metadata: Record<string, unknown> | undefined = {\n model_provider: \"openai\",\n model_name: rawResponse.model,\n ...(rawResponse.system_fingerprint\n ? {\n usage: { ...rawResponse.usage },\n system_fingerprint: rawResponse.system_fingerprint,\n }\n : {}),\n };\n\n if (message.audio) {\n additional_kwargs.audio = message.audio;\n }\n\n const content = handleMultiModalOutput(\n message.content || \"\",\n rawResponse.choices?.[0]?.message\n );\n return new AIMessage({\n content,\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n additional_kwargs,\n response_metadata,\n id: rawResponse.id,\n });\n }\n default:\n return new ChatMessage(message.content || \"\", message.role ?? \"unknown\");\n }\n};\n\n/**\n * Converts an OpenAI Chat Completions API delta (streaming chunk) to a LangChain BaseMessageChunk.\n *\n * This converter is used during streaming responses to transform incremental updates from OpenAI's\n * Chat Completions API into LangChain message chunks. It handles various message types, tool calls,\n * function calls, audio content, and role-specific message chunk creation.\n *\n * @param params - Conversion parameters\n * @param params.delta - The delta object from an OpenAI streaming chunk containing incremental\n * message updates. May include content, role, tool_calls, function_call, audio, etc.\n * @param params.rawResponse - The complete raw ChatCompletionChunk response from OpenAI,\n * containing metadata like model info, usage stats, and the delta\n * @param params.includeRawResponse - Optional flag to include the raw OpenAI response in the\n * message chunk's additional_kwargs. Useful for debugging or accessing provider-specific data\n * @param params.defaultRole - Optional default role to use if the delta doesn't specify one.\n * Typically used to maintain role consistency across chunks in a streaming response\n *\n * @returns A BaseMessageChunk subclass appropriate for the message role:\n * - HumanMessageChunk for \"user\" role\n * - AIMessageChunk for \"assistant\" role (includes tool call chunks)\n * - SystemMessageChunk for \"system\" or \"developer\" roles\n * - FunctionMessageChunk for \"function\" role\n * - ToolMessageChunk for \"tool\" role\n * - ChatMessageChunk for any other role\n *\n * @example\n * Basic streaming text chunk:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: { role: \"assistant\", content: \"Hello\" },\n * rawResponse: { id: \"chatcmpl-123\", model: \"gpt-4\", ... }\n * });\n * // Returns: AIMessageChunk with content \"Hello\"\n * ```\n *\n * @example\n * Streaming chunk with tool call:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: {\n * role: \"assistant\",\n * tool_calls: [{\n * index: 0,\n * id: \"call_123\",\n * function: { name: \"get_weather\", arguments: '{\"location\":' }\n * }]\n * },\n * rawResponse: { id: \"chatcmpl-123\", ... }\n * });\n * // Returns: AIMessageChunk with tool_call_chunks containing partial tool call data\n * ```\n *\n * @remarks\n * - Tool calls are converted to ToolCallChunk objects with incremental data\n * - Audio content includes the chunk index from the raw response\n * - The \"developer\" role is mapped to SystemMessageChunk with a special marker\n * - Response metadata includes model provider info and usage statistics\n * - Function calls and tool calls are stored in additional_kwargs for compatibility\n */\nexport const convertCompletionsDeltaToBaseMessageChunk: Converter<\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk;\n includeRawResponse?: boolean;\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole;\n },\n BaseMessageChunk\n> = ({ delta, rawResponse, includeRawResponse, defaultRole }) => {\n const role = delta.role ?? defaultRole;\n const content = delta.content ?? \"\";\n let additional_kwargs: Record<string, unknown>;\n if (delta.function_call) {\n additional_kwargs = {\n function_call: delta.function_call,\n };\n } else if (delta.tool_calls) {\n additional_kwargs = {\n tool_calls: delta.tool_calls,\n };\n } else {\n additional_kwargs = {};\n }\n if (includeRawResponse) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (delta.reasoning_content !== undefined) {\n additional_kwargs.reasoning_content = delta.reasoning_content;\n }\n\n if (delta.audio) {\n additional_kwargs.audio = {\n ...delta.audio,\n index: rawResponse.choices[0].index,\n };\n }\n\n const response_metadata = {\n model_provider: \"openai\",\n usage: { ...rawResponse.usage },\n };\n if (role === \"user\") {\n return new HumanMessageChunk({ content, response_metadata });\n } else if (role === \"assistant\") {\n const toolCallChunks: ToolCallChunk[] = [];\n if (Array.isArray(delta.tool_calls)) {\n for (const rawToolCall of delta.tool_calls) {\n toolCallChunks.push({\n name: rawToolCall.function?.name,\n args: rawToolCall.function?.arguments,\n id: rawToolCall.id,\n index: rawToolCall.index,\n type: \"tool_call_chunk\",\n });\n }\n }\n return new AIMessageChunk({\n content,\n tool_call_chunks: toolCallChunks,\n additional_kwargs,\n id: rawResponse.id,\n response_metadata,\n });\n } else if (role === \"system\") {\n return new SystemMessageChunk({ content, response_metadata });\n } else if (role === \"developer\") {\n return new SystemMessageChunk({\n content,\n response_metadata,\n additional_kwargs: {\n __openai_role__: \"developer\",\n },\n });\n } else if (role === \"function\") {\n return new FunctionMessageChunk({\n content,\n additional_kwargs,\n name: delta.name,\n response_metadata,\n });\n } else if (role === \"tool\") {\n return new ToolMessageChunk({\n content,\n additional_kwargs,\n tool_call_id: delta.tool_call_id,\n response_metadata,\n });\n } else {\n return new ChatMessageChunk({ content, role, response_metadata });\n }\n};\n\n/**\n * Converts a standard LangChain content block to an OpenAI Completions API content part.\n *\n * This converter transforms LangChain's standardized content blocks (image, audio, file)\n * into the format expected by OpenAI's Chat Completions API. It handles various content\n * types including images (URL or base64), audio (base64), and files (data or file ID).\n *\n * @param block - The standard content block to convert. Can be an image, audio, or file block.\n *\n * @returns An OpenAI Chat Completions content part object, or undefined if the block\n * cannot be converted (e.g., missing required data).\n *\n * @example\n * Image with URL:\n * ```typescript\n * const block = { type: \"image\", url: \"https://example.com/image.jpg\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * ```\n *\n * @example\n * Image with base64 data:\n * ```typescript\n * const block = { type: \"image\", data: \"iVBORw0KGgo...\", mimeType: \"image/png\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"data:image/png;base64,iVBORw0KGgo...\" } }\n * ```\n */\nexport const convertStandardContentBlockToCompletionsContentPart: Converter<\n ContentBlock.Standard,\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartImage\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartInputAudio\n | OpenAIClient.Chat.Completions.ChatCompletionContentPart.File\n | undefined\n> = (block) => {\n if (block.type === \"image\") {\n if (block.url) {\n return {\n type: \"image_url\",\n image_url: {\n url: block.url,\n },\n };\n } else if (block.data) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${block.mimeType};base64,${block.data}`,\n },\n };\n }\n }\n if (block.type === \"audio\") {\n if (block.data) {\n const format = iife(() => {\n const [, format] = block.mimeType.split(\"/\");\n if (format === \"wav\" || format === \"mp3\") {\n return format;\n }\n return \"wav\";\n });\n return {\n type: \"input_audio\",\n input_audio: {\n data: block.data.toString(),\n format,\n },\n };\n }\n }\n if (block.type === \"file\") {\n if (block.data) {\n const filename = getRequiredFilenameFromMetadata(block);\n\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mimeType};base64,${block.data}`,\n filename: filename,\n },\n };\n }\n if (block.fileId) {\n return {\n type: \"file\",\n file: {\n file_id: block.fileId,\n },\n };\n }\n }\n return undefined;\n};\n\n/**\n * Converts a LangChain BaseMessage with standard content blocks to an OpenAI Chat Completions API message parameter.\n *\n * This converter transforms LangChain's standardized message format (using contentBlocks) into the format\n * expected by OpenAI's Chat Completions API. It handles role mapping, content filtering, and multi-modal\n * content conversion for various message types.\n *\n * @remarks\n * The converter performs the following transformations:\n * - Maps LangChain message roles to OpenAI API roles (user, assistant, system, developer, tool, function)\n * - For reasoning models, automatically converts \"system\" role to \"developer\" role\n * - Filters content blocks based on message role (most roles only include text blocks)\n * - For user messages, converts multi-modal content blocks (images, audio, files) to OpenAI format\n * - Preserves tool call IDs for tool messages and function names for function messages\n *\n * Role-specific behavior:\n * - **developer**: Returns only text content blocks (used for reasoning models)\n * - **system**: Returns only text content blocks\n * - **assistant**: Returns only text content blocks\n * - **tool**: Returns only text content blocks with tool_call_id preserved\n * - **function**: Returns text content blocks joined as a single string with function name\n * - **user** (default): Returns multi-modal content including text, images, audio, and files\n *\n * @param params - Conversion parameters\n * @param params.message - The LangChain BaseMessage to convert. Must have contentBlocks property\n * containing an array of standard content blocks (text, image, audio, file, etc.)\n * @param params.model - Optional model name. Used to determine if special role mapping is needed\n * (e.g., \"system\" -> \"developer\" for reasoning models like o1)\n *\n * @returns An OpenAI ChatCompletionMessageParam object formatted for the Chat Completions API.\n * The structure varies by role:\n * - Developer/System/Assistant: `{ role, content: TextBlock[] }`\n * - Tool: `{ role: \"tool\", tool_call_id, content: TextBlock[] }`\n * - Function: `{ role: \"function\", name, content: string }`\n * - User: `{ role: \"user\", content: Array<TextPart | ImagePart | AudioPart | FilePart> }`\n *\n * @example\n * Simple text message:\n * ```typescript\n * const message = new HumanMessage({\n * content: [{ type: \"text\", text: \"Hello!\" }]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: { role: \"user\", content: [{ type: \"text\", text: \"Hello!\" }] }\n * ```\n *\n * @example\n * Multi-modal user message with image:\n * ```typescript\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", url: \"https://example.com/image.jpg\" }\n * ]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: {\n * // role: \"user\",\n * // content: [\n * // { type: \"text\", text: \"What's in this image?\" },\n * // { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * // ]\n * // }\n * ```\n */\nexport const convertStandardContentMessageToCompletionsMessage: Converter<\n { message: BaseMessage; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam\n> = ({ message, model }) => {\n let role = messageToOpenAIRole(message);\n if (role === \"system\" && isReasoningModel(model)) {\n role = \"developer\";\n }\n if (role === \"developer\") {\n return {\n role: \"developer\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"system\") {\n return {\n role: \"system\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"assistant\") {\n return {\n role: \"assistant\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"tool\" && ToolMessage.isInstance(message)) {\n return {\n role: \"tool\",\n tool_call_id: message.tool_call_id,\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"function\") {\n return {\n role: \"function\",\n name: message.name ?? \"\",\n content: message.contentBlocks\n .filter((block) => block.type === \"text\")\n .join(\"\"),\n };\n }\n // Default to user message handling\n function* iterateUserContent(blocks: ContentBlock.Standard[]) {\n for (const block of blocks) {\n if (block.type === \"text\") {\n yield {\n type: \"text\" as const,\n text: block.text,\n };\n }\n const data = convertStandardContentBlockToCompletionsContentPart(block);\n if (data) {\n yield data;\n }\n }\n }\n return {\n role: \"user\",\n content: Array.from(iterateUserContent(message.contentBlocks)),\n };\n};\n\n/**\n * Converts an array of LangChain BaseMessages to OpenAI Chat Completions API message parameters.\n *\n * This converter transforms LangChain's internal message representation into the format required\n * by OpenAI's Chat Completions API. It handles various message types, roles, content formats,\n * tool calls, function calls, audio messages, and special model-specific requirements.\n *\n * @remarks\n * The converter performs several key transformations:\n * - Maps LangChain message types to OpenAI roles (user, assistant, system, tool, function, developer)\n * - Converts standard content blocks (v1 format) using a specialized converter\n * - Handles multimodal content including text, images, audio, and data blocks\n * - Preserves tool calls and function calls with proper formatting\n * - Applies model-specific role mappings (e.g., \"system\" → \"developer\" for reasoning models)\n * - Splits audio messages into separate message parameters when needed\n *\n * @param params - Conversion parameters\n * @param params.messages - Array of LangChain BaseMessages to convert. Can include any message\n * type: HumanMessage, AIMessage, SystemMessage, ToolMessage, FunctionMessage, etc.\n * @param params.model - Optional model name used to determine if special role mapping is needed.\n * For reasoning models (o1, o3, etc.), \"system\" role is converted to \"developer\" role.\n *\n * @returns Array of ChatCompletionMessageParam objects formatted for OpenAI's Chat Completions API.\n * Some messages may be split into multiple parameters (e.g., audio messages).\n *\n * @example\n * Basic message conversion:\n * ```typescript\n * const messages = [\n * new HumanMessage(\"What's the weather like?\"),\n * new AIMessage(\"Let me check that for you.\")\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({\n * messages,\n * model: \"gpt-4\"\n * });\n * // Returns:\n * // [\n * // { role: \"user\", content: \"What's the weather like?\" },\n * // { role: \"assistant\", content: \"Let me check that for you.\" }\n * // ]\n * ```\n *\n * @example\n * Message with tool calls:\n * ```typescript\n * const messages = [\n * new AIMessage({\n * content: \"\",\n * tool_calls: [{\n * id: \"call_123\",\n * name: \"get_weather\",\n * args: { location: \"San Francisco\" }\n * }]\n * })\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({ messages });\n * // Returns:\n * // [{\n * // role: \"assistant\",\n * // content: \"\",\n * // tool_calls: [{\n * // id: \"call_123\",\n * // type: \"function\",\n * // function: { name: \"get_weather\", arguments: '{\"location\":\"San Francisco\"}' }\n * // }]\n * // }]\n * ```\n */\nexport const convertMessagesToCompletionsMessageParams: Converter<\n { messages: BaseMessage[]; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam[]\n> = ({ messages, model }) => {\n return messages.flatMap((message) => {\n if (\n \"output_version\" in message.response_metadata &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return convertStandardContentMessageToCompletionsMessage({ 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.flatMap((m) => {\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n // Drop Anthropic tool_use blocks from content — these are\n // already represented in message.tool_calls and would cause\n // an API error if passed through to OpenAI.\n if (\n typeof m === \"object\" &&\n m !== null &&\n \"type\" in m &&\n m.type === \"tool_use\"\n ) {\n return [];\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 }\n if (AIMessage.isInstance(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if (ToolMessage.isInstance(message) && message.tool_call_id != null) {\n completionParam.tool_call_id = message.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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"} | ||
| {"version":3,"file":"completions.cjs","names":["getRequiredFilenameFromMetadata","AIMessage","handleMultiModalOutput","ChatMessage","HumanMessageChunk","AIMessageChunk","SystemMessageChunk","FunctionMessageChunk","ToolMessageChunk","ChatMessageChunk","messageToOpenAIRole","isReasoningModel","ToolMessage","convertLangChainToolCallToOpenAI"],"sources":["../../src/converters/completions.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n BaseMessageChunk,\n ChatMessage,\n ChatMessageChunk,\n FunctionMessageChunk,\n HumanMessageChunk,\n OpenAIToolCall,\n SystemMessageChunk,\n ToolCallChunk,\n ToolMessage,\n ToolMessageChunk,\n parseBase64DataUrl,\n parseMimeType,\n StandardContentBlockConverter,\n isDataContentBlock,\n ContentBlock,\n iife,\n convertToProviderContentBlock,\n} from \"@langchain/core/messages\";\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport { Converter } from \"@langchain/core/utils/format\";\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from \"openai/resources/chat/completions\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { handleMultiModalOutput } from \"../utils/output.js\";\nimport {\n getRequiredFilenameFromMetadata,\n isReasoningModel,\n messageToOpenAIRole,\n} from \"../utils/misc.js\";\n\n/**\n * @deprecated This converter is an internal detail of the OpenAI provider. Do not use it directly. This will be revisited in a future release.\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\n const filename = getRequiredFilenameFromMetadata(block);\n\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 filename,\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n const filename = getRequiredFilenameFromMetadata(block);\n\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mime_type ?? \"\"};base64,${block.data}`,\n filename,\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\n/**\n * Converts an OpenAI Chat Completions API message to a LangChain BaseMessage.\n *\n * This converter transforms messages from OpenAI's Chat Completions API format into\n * LangChain's internal message representation, handling various message types and\n * preserving metadata, tool calls, and other relevant information.\n *\n * @remarks\n * The converter handles the following message roles:\n * - `assistant`: Converted to {@link AIMessage} with support for tool calls, function calls,\n * audio content, and multi-modal outputs\n * - Other roles: Converted to generic {@link ChatMessage}\n *\n * For assistant messages, the converter:\n * - Parses and validates tool calls, separating valid and invalid calls\n * - Preserves function call information in additional_kwargs\n * - Includes usage statistics and system fingerprint in response_metadata\n * - Handles multi-modal content (text, images, audio)\n * - Optionally includes the raw API response for debugging\n *\n * @param params - Conversion parameters\n * @param params.message - The OpenAI chat completion message to convert\n * @param params.rawResponse - The complete raw response from OpenAI's API, used to extract\n * metadata like model name, usage statistics, and system fingerprint\n * @param params.includeRawResponse - If true, includes the raw OpenAI response in the\n * message's additional_kwargs under the `__raw_response` key. Useful for debugging\n * or accessing provider-specific fields. Defaults to false.\n *\n * @returns A LangChain BaseMessage instance:\n * - {@link AIMessage} for assistant messages with tool calls, metadata, and content\n * - {@link ChatMessage} for all other message types\n *\n * @example\n * ```typescript\n * const baseMessage = convertCompletionsMessageToBaseMessage({\n * message: {\n * role: \"assistant\",\n * content: \"Hello! How can I help you?\",\n * tool_calls: [\n * {\n * id: \"call_123\",\n * type: \"function\",\n * function: { name: \"get_weather\", arguments: '{\"location\":\"NYC\"}' }\n * }\n * ]\n * },\n * rawResponse: completionResponse,\n * includeRawResponse: true\n * });\n * // Returns an AIMessage with parsed tool calls and metadata\n * ```\n *\n * @throws {Error} If tool call parsing fails, the invalid tool call is captured in\n * the `invalid_tool_calls` array rather than throwing an error\n *\n */\nexport const convertCompletionsMessageToBaseMessage: Converter<\n {\n message: OpenAIClient.Chat.Completions.ChatCompletionMessage;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletion;\n includeRawResponse?: boolean;\n },\n BaseMessage\n> = ({ message, rawResponse, includeRawResponse }) => {\n const rawToolCalls: OpenAIToolCall[] | undefined = message.tool_calls as\n | OpenAIToolCall[]\n | undefined;\n const providerReasoningContent = (message as { reasoning_content?: string })\n .reasoning_content;\n switch (message.role) {\n case \"assistant\": {\n const toolCalls = [];\n const invalidToolCalls = [];\n for (const rawToolCall of rawToolCalls ?? []) {\n try {\n toolCalls.push(parseToolCall(rawToolCall, { returnId: true }));\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n invalidToolCalls.push(makeInvalidToolCall(rawToolCall, e.message));\n }\n }\n const additional_kwargs: Record<string, unknown> = {\n function_call: message.function_call,\n tool_calls: rawToolCalls,\n };\n if (includeRawResponse !== undefined) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (providerReasoningContent !== undefined) {\n additional_kwargs.reasoning_content = providerReasoningContent;\n }\n const response_metadata: Record<string, unknown> | undefined = {\n model_provider: \"openai\",\n model_name: rawResponse.model,\n ...(rawResponse.system_fingerprint\n ? {\n usage: { ...rawResponse.usage },\n system_fingerprint: rawResponse.system_fingerprint,\n }\n : {}),\n };\n\n if (message.audio) {\n additional_kwargs.audio = message.audio;\n }\n\n const content = handleMultiModalOutput(\n message.content || \"\",\n rawResponse.choices?.[0]?.message\n );\n return new AIMessage({\n content,\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n additional_kwargs,\n response_metadata,\n id: rawResponse.id,\n });\n }\n default:\n return new ChatMessage(message.content || \"\", message.role ?? \"unknown\");\n }\n};\n\n/**\n * Converts an OpenAI Chat Completions API delta (streaming chunk) to a LangChain BaseMessageChunk.\n *\n * This converter is used during streaming responses to transform incremental updates from OpenAI's\n * Chat Completions API into LangChain message chunks. It handles various message types, tool calls,\n * function calls, audio content, and role-specific message chunk creation.\n *\n * @param params - Conversion parameters\n * @param params.delta - The delta object from an OpenAI streaming chunk containing incremental\n * message updates. May include content, role, tool_calls, function_call, audio, etc.\n * @param params.rawResponse - The complete raw ChatCompletionChunk response from OpenAI,\n * containing metadata like model info, usage stats, and the delta\n * @param params.includeRawResponse - Optional flag to include the raw OpenAI response in the\n * message chunk's additional_kwargs. Useful for debugging or accessing provider-specific data\n * @param params.defaultRole - Optional default role to use if the delta doesn't specify one.\n * Typically used to maintain role consistency across chunks in a streaming response\n *\n * @returns A BaseMessageChunk subclass appropriate for the message role:\n * - HumanMessageChunk for \"user\" role\n * - AIMessageChunk for \"assistant\" role (includes tool call chunks)\n * - SystemMessageChunk for \"system\" or \"developer\" roles\n * - FunctionMessageChunk for \"function\" role\n * - ToolMessageChunk for \"tool\" role\n * - ChatMessageChunk for any other role\n *\n * @example\n * Basic streaming text chunk:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: { role: \"assistant\", content: \"Hello\" },\n * rawResponse: { id: \"chatcmpl-123\", model: \"gpt-4\", ... }\n * });\n * // Returns: AIMessageChunk with content \"Hello\"\n * ```\n *\n * @example\n * Streaming chunk with tool call:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: {\n * role: \"assistant\",\n * tool_calls: [{\n * index: 0,\n * id: \"call_123\",\n * function: { name: \"get_weather\", arguments: '{\"location\":' }\n * }]\n * },\n * rawResponse: { id: \"chatcmpl-123\", ... }\n * });\n * // Returns: AIMessageChunk with tool_call_chunks containing partial tool call data\n * ```\n *\n * @remarks\n * - Tool calls are converted to ToolCallChunk objects with incremental data\n * - Audio content includes the chunk index from the raw response\n * - The \"developer\" role is mapped to SystemMessageChunk with a special marker\n * - Response metadata includes model provider info and usage statistics\n * - Function calls and tool calls are stored in additional_kwargs for compatibility\n */\nexport const convertCompletionsDeltaToBaseMessageChunk: Converter<\n {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk;\n includeRawResponse?: boolean;\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole;\n },\n BaseMessageChunk\n> = ({ delta, rawResponse, includeRawResponse, defaultRole }) => {\n const role = delta.role ?? defaultRole;\n const content = delta.content ?? \"\";\n let additional_kwargs: Record<string, unknown>;\n if (delta.function_call) {\n additional_kwargs = {\n function_call: delta.function_call,\n };\n } else if (delta.tool_calls) {\n additional_kwargs = {\n tool_calls: delta.tool_calls,\n };\n } else {\n additional_kwargs = {};\n }\n if (includeRawResponse) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (delta.reasoning_content !== undefined) {\n additional_kwargs.reasoning_content = delta.reasoning_content;\n }\n\n if (delta.audio) {\n additional_kwargs.audio = {\n ...delta.audio,\n index: rawResponse.choices[0].index,\n };\n }\n\n const response_metadata = {\n model_provider: \"openai\",\n usage: { ...rawResponse.usage },\n };\n if (role === \"user\") {\n return new HumanMessageChunk({ content, response_metadata });\n } else if (role === \"assistant\") {\n const toolCallChunks: ToolCallChunk[] = [];\n if (Array.isArray(delta.tool_calls)) {\n for (const rawToolCall of delta.tool_calls) {\n toolCallChunks.push({\n name: rawToolCall.function?.name,\n args: rawToolCall.function?.arguments,\n id: rawToolCall.id,\n index: rawToolCall.index,\n type: \"tool_call_chunk\",\n });\n }\n }\n return new AIMessageChunk({\n content,\n tool_call_chunks: toolCallChunks,\n additional_kwargs,\n id: rawResponse.id,\n response_metadata,\n });\n } else if (role === \"system\") {\n return new SystemMessageChunk({ content, response_metadata });\n } else if (role === \"developer\") {\n return new SystemMessageChunk({\n content,\n response_metadata,\n additional_kwargs: {\n __openai_role__: \"developer\",\n },\n });\n } else if (role === \"function\") {\n return new FunctionMessageChunk({\n content,\n additional_kwargs,\n name: delta.name,\n response_metadata,\n });\n } else if (role === \"tool\") {\n return new ToolMessageChunk({\n content,\n additional_kwargs,\n tool_call_id: delta.tool_call_id,\n response_metadata,\n });\n } else {\n return new ChatMessageChunk({ content, role, response_metadata });\n }\n};\n\n/**\n * Converts a standard LangChain content block to an OpenAI Completions API content part.\n *\n * This converter transforms LangChain's standardized content blocks (image, audio, file)\n * into the format expected by OpenAI's Chat Completions API. It handles various content\n * types including images (URL or base64), audio (base64), and files (data or file ID).\n *\n * @param block - The standard content block to convert. Can be an image, audio, or file block.\n *\n * @returns An OpenAI Chat Completions content part object, or undefined if the block\n * cannot be converted (e.g., missing required data).\n *\n * @example\n * Image with URL:\n * ```typescript\n * const block = { type: \"image\", url: \"https://example.com/image.jpg\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * ```\n *\n * @example\n * Image with base64 data:\n * ```typescript\n * const block = { type: \"image\", data: \"iVBORw0KGgo...\", mimeType: \"image/png\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"data:image/png;base64,iVBORw0KGgo...\" } }\n * ```\n */\nexport const convertStandardContentBlockToCompletionsContentPart: Converter<\n ContentBlock.Standard,\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartImage\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartInputAudio\n | OpenAIClient.Chat.Completions.ChatCompletionContentPart.File\n | undefined\n> = (block) => {\n if (block.type === \"image\") {\n if (block.url) {\n return {\n type: \"image_url\",\n image_url: {\n url: block.url,\n },\n };\n } else if (block.data) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${block.mimeType};base64,${block.data}`,\n },\n };\n }\n }\n if (block.type === \"audio\") {\n if (block.data) {\n const format = iife(() => {\n const [, format] = block.mimeType.split(\"/\");\n if (format === \"wav\" || format === \"mp3\") {\n return format;\n }\n return \"wav\";\n });\n return {\n type: \"input_audio\",\n input_audio: {\n data: block.data.toString(),\n format,\n },\n };\n }\n }\n if (block.type === \"file\") {\n if (block.data) {\n const filename = getRequiredFilenameFromMetadata(block);\n\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mimeType};base64,${block.data}`,\n filename: filename,\n },\n };\n }\n if (block.fileId) {\n return {\n type: \"file\",\n file: {\n file_id: block.fileId,\n },\n };\n }\n }\n return undefined;\n};\n\n/**\n * Converts a LangChain BaseMessage with standard content blocks to an OpenAI Chat Completions API message parameter.\n *\n * This converter transforms LangChain's standardized message format (using contentBlocks) into the format\n * expected by OpenAI's Chat Completions API. It handles role mapping, content filtering, and multi-modal\n * content conversion for various message types.\n *\n * @remarks\n * The converter performs the following transformations:\n * - Maps LangChain message roles to OpenAI API roles (user, assistant, system, developer, tool, function)\n * - For reasoning models, automatically converts \"system\" role to \"developer\" role\n * - Filters content blocks based on message role (most roles only include text blocks)\n * - For user messages, converts multi-modal content blocks (images, audio, files) to OpenAI format\n * - Preserves tool call IDs for tool messages and function names for function messages\n *\n * Role-specific behavior:\n * - **developer**: Returns only text content blocks (used for reasoning models)\n * - **system**: Returns only text content blocks\n * - **assistant**: Returns only text content blocks\n * - **tool**: Returns only text content blocks with tool_call_id preserved\n * - **function**: Returns text content blocks joined as a single string with function name\n * - **user** (default): Returns multi-modal content including text, images, audio, and files\n *\n * @param params - Conversion parameters\n * @param params.message - The LangChain BaseMessage to convert. Must have contentBlocks property\n * containing an array of standard content blocks (text, image, audio, file, etc.)\n * @param params.model - Optional model name. Used to determine if special role mapping is needed\n * (e.g., \"system\" -> \"developer\" for reasoning models like o1)\n *\n * @returns An OpenAI ChatCompletionMessageParam object formatted for the Chat Completions API.\n * The structure varies by role:\n * - Developer/System/Assistant: `{ role, content: TextBlock[] }`\n * - Tool: `{ role: \"tool\", tool_call_id, content: TextBlock[] }`\n * - Function: `{ role: \"function\", name, content: string }`\n * - User: `{ role: \"user\", content: Array<TextPart | ImagePart | AudioPart | FilePart> }`\n *\n * @example\n * Simple text message:\n * ```typescript\n * const message = new HumanMessage({\n * content: [{ type: \"text\", text: \"Hello!\" }]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: { role: \"user\", content: [{ type: \"text\", text: \"Hello!\" }] }\n * ```\n *\n * @example\n * Multi-modal user message with image:\n * ```typescript\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", url: \"https://example.com/image.jpg\" }\n * ]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: {\n * // role: \"user\",\n * // content: [\n * // { type: \"text\", text: \"What's in this image?\" },\n * // { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * // ]\n * // }\n * ```\n */\nexport const convertStandardContentMessageToCompletionsMessage: Converter<\n { message: BaseMessage; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam\n> = ({ message, model }) => {\n let role = messageToOpenAIRole(message);\n if (role === \"system\" && isReasoningModel(model)) {\n role = \"developer\";\n }\n if (role === \"developer\") {\n return {\n role: \"developer\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"system\") {\n return {\n role: \"system\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"assistant\") {\n return {\n role: \"assistant\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"tool\" && ToolMessage.isInstance(message)) {\n return {\n role: \"tool\",\n tool_call_id: message.tool_call_id,\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"function\") {\n return {\n role: \"function\",\n name: message.name ?? \"\",\n content: message.contentBlocks\n .filter((block) => block.type === \"text\")\n .join(\"\"),\n };\n }\n // Default to user message handling\n function* iterateUserContent(blocks: ContentBlock.Standard[]) {\n for (const block of blocks) {\n if (block.type === \"text\") {\n yield {\n type: \"text\" as const,\n text: block.text,\n };\n }\n const data = convertStandardContentBlockToCompletionsContentPart(block);\n if (data) {\n yield data;\n }\n }\n }\n return {\n role: \"user\",\n content: Array.from(iterateUserContent(message.contentBlocks)),\n };\n};\n\n/**\n * Converts an array of LangChain BaseMessages to OpenAI Chat Completions API message parameters.\n *\n * This converter transforms LangChain's internal message representation into the format required\n * by OpenAI's Chat Completions API. It handles various message types, roles, content formats,\n * tool calls, function calls, audio messages, and special model-specific requirements.\n *\n * @remarks\n * The converter performs several key transformations:\n * - Maps LangChain message types to OpenAI roles (user, assistant, system, tool, function, developer)\n * - Converts standard content blocks (v1 format) using a specialized converter\n * - Handles multimodal content including text, images, audio, and data blocks\n * - Preserves tool calls and function calls with proper formatting\n * - Applies model-specific role mappings (e.g., \"system\" → \"developer\" for reasoning models)\n * - Splits audio messages into separate message parameters when needed\n *\n * @param params - Conversion parameters\n * @param params.messages - Array of LangChain BaseMessages to convert. Can include any message\n * type: HumanMessage, AIMessage, SystemMessage, ToolMessage, FunctionMessage, etc.\n * @param params.model - Optional model name used to determine if special role mapping is needed.\n * For reasoning models (o1, o3, etc.), \"system\" role is converted to \"developer\" role.\n *\n * @returns Array of ChatCompletionMessageParam objects formatted for OpenAI's Chat Completions API.\n * Some messages may be split into multiple parameters (e.g., audio messages).\n *\n * @example\n * Basic message conversion:\n * ```typescript\n * const messages = [\n * new HumanMessage(\"What's the weather like?\"),\n * new AIMessage(\"Let me check that for you.\")\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({\n * messages,\n * model: \"gpt-4\"\n * });\n * // Returns:\n * // [\n * // { role: \"user\", content: \"What's the weather like?\" },\n * // { role: \"assistant\", content: \"Let me check that for you.\" }\n * // ]\n * ```\n *\n * @example\n * Message with tool calls:\n * ```typescript\n * const messages = [\n * new AIMessage({\n * content: \"\",\n * tool_calls: [{\n * id: \"call_123\",\n * name: \"get_weather\",\n * args: { location: \"San Francisco\" }\n * }]\n * })\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({ messages });\n * // Returns:\n * // [{\n * // role: \"assistant\",\n * // content: \"\",\n * // tool_calls: [{\n * // id: \"call_123\",\n * // type: \"function\",\n * // function: { name: \"get_weather\", arguments: '{\"location\":\"San Francisco\"}' }\n * // }]\n * // }]\n * ```\n */\nexport const convertMessagesToCompletionsMessageParams: Converter<\n { messages: BaseMessage[]; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam[]\n> = ({ messages, model }) => {\n return messages.flatMap((message) => {\n if (\n \"output_version\" in message.response_metadata &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return convertStandardContentMessageToCompletionsMessage({ 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.flatMap((m) => {\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n // Drop Anthropic tool_use blocks from content — these are\n // already represented in message.tool_calls and would cause\n // an API error if passed through to OpenAI.\n if (\n typeof m === \"object\" &&\n m !== null &&\n \"type\" in m &&\n m.type === \"tool_use\"\n ) {\n return [];\n }\n return m;\n });\n // oxlint-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 }\n if (AIMessage.isInstance(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if (ToolMessage.isInstance(message) && message.tool_call_id != null) {\n completionParam.tool_call_id = message.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":";;;;;;;;AA6CA,MAAa,sCAKR;CACH,cAAc;CAEd,sBAAsB,OAAsC;AAC1D,SAAO;GAAE,MAAM;GAAQ,MAAM,MAAM;GAAM;;CAG3C,uBAAuB,OAAuC;AAC5D,MAAI,MAAM,gBAAgB,MACxB,QAAO;GACL,MAAM;GACN,WAAW;IACT,KAAK,MAAM;IACX,GAAI,MAAM,UAAU,SAChB,EAAE,QAAQ,MAAM,SAAS,QAAmC,GAC5D,EAAE;IACP;GACF;AAGH,MAAI,MAAM,gBAAgB,SAExB,QAAO;GACL,MAAM;GACN,WAAW;IACT,KAJQ,QAAQ,MAAM,aAAa,GAAG,UAAU,MAAM;IAKtD,GAAI,MAAM,UAAU,SAChB,EAAE,QAAQ,MAAM,SAAS,QAAmC,GAC5D,EAAE;IACP;GACF;AAGH,QAAM,IAAI,MACR,yCAAyC,MAAM,YAAY,mCAC5D;;CAGH,uBAAuB,OAA4C;AACjE,MAAI,MAAM,gBAAgB,OAAO;GAC/B,MAAM,QAAA,GAAA,yBAAA,oBAA0B,EAAE,SAAS,MAAM,KAAK,CAAC;AACvD,OAAI,CAAC,KACH,OAAM,IAAI,MACR,qCAAqC,MAAM,YAAY,iDACxD;GAGH,MAAM,cAAc,KAAK,aAAa,MAAM,aAAa;GACzD,IAAI;AAEJ,OAAI;AACF,gBAAA,GAAA,yBAAA,eAAyB,YAAY;WAC/B;AACN,UAAM,IAAI,MACR,iCAAiC,MAAM,YAAY,gDACpD;;AAGH,OACE,SAAS,SAAS,WACjB,SAAS,YAAY,SAAS,SAAS,YAAY,MAEpD,OAAM,IAAI,MACR,iCAAiC,MAAM,YAAY,gDACpD;AAGH,UAAO;IACL,MAAM;IACN,aAAa;KACX,QAAQ,SAAS;KACjB,MAAM,KAAK;KACZ;IACF;;AAGH,MAAI,MAAM,gBAAgB,UAAU;GAClC,IAAI;AAEJ,OAAI;AACF,gBAAA,GAAA,yBAAA,eAAyB,MAAM,aAAa,GAAG;WACzC;AACN,UAAM,IAAI,MACR,iCAAiC,MAAM,YAAY,gDACpD;;AAGH,OACE,SAAS,SAAS,WACjB,SAAS,YAAY,SAAS,SAAS,YAAY,MAEpD,OAAM,IAAI,MACR,iCAAiC,MAAM,YAAY,gDACpD;AAGH,UAAO;IACL,MAAM;IACN,aAAa;KACX,QAAQ,SAAS;KACjB,MAAM,MAAM;KACb;IACF;;AAGH,QAAM,IAAI,MACR,yCAAyC,MAAM,YAAY,mCAC5D;;CAGH,sBAAsB,OAAuC;AAC3D,MAAI,MAAM,gBAAgB,OAAO;GAC/B,MAAM,QAAA,GAAA,yBAAA,oBAA0B,EAAE,SAAS,MAAM,KAAK,CAAC;GAEvD,MAAM,WAAWA,aAAAA,gCAAgC,MAAM;AAEvD,OAAI,CAAC,KACH,OAAM,IAAI,MACR,oCAAoC,MAAM,YAAY,iDACvD;AAGH,UAAO;IACL,MAAM;IACN,MAAM;KACJ,WAAW,MAAM;KACjB;KACD;IACF;;AAGH,MAAI,MAAM,gBAAgB,UAAU;GAClC,MAAM,WAAWA,aAAAA,gCAAgC,MAAM;AAEvD,UAAO;IACL,MAAM;IACN,MAAM;KACJ,WAAW,QAAQ,MAAM,aAAa,GAAG,UAAU,MAAM;KACzD;KACD;IACF;;AAGH,MAAI,MAAM,gBAAgB,KACxB,QAAO;GACL,MAAM;GACN,MAAM,EACJ,SAAS,MAAM,IAChB;GACF;AAGH,QAAM,IAAI,MACR,wCAAwC,MAAM,YAAY,mCAC3D;;CAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DD,MAAa,0CAOR,EAAE,SAAS,aAAa,yBAAyB;CACpD,MAAM,eAA6C,QAAQ;CAG3D,MAAM,2BAA4B,QAC/B;AACH,SAAQ,QAAQ,MAAhB;EACE,KAAK,aAAa;GAChB,MAAM,YAAY,EAAE;GACpB,MAAM,mBAAmB,EAAE;AAC3B,QAAK,MAAM,eAAe,gBAAgB,EAAE,CAC1C,KAAI;AACF,cAAU,MAAA,GAAA,4CAAA,eAAmB,aAAa,EAAE,UAAU,MAAM,CAAC,CAAC;YAEvD,GAAQ;AACf,qBAAiB,MAAA,GAAA,4CAAA,qBAAyB,aAAa,EAAE,QAAQ,CAAC;;GAGtE,MAAM,oBAA6C;IACjD,eAAe,QAAQ;IACvB,YAAY;IACb;AACD,OAAI,uBAAuB,KAAA,EACzB,mBAAkB,iBAAiB;AAErC,OAAI,6BAA6B,KAAA,EAC/B,mBAAkB,oBAAoB;GAExC,MAAM,oBAAyD;IAC7D,gBAAgB;IAChB,YAAY,YAAY;IACxB,GAAI,YAAY,qBACZ;KACE,OAAO,EAAE,GAAG,YAAY,OAAO;KAC/B,oBAAoB,YAAY;KACjC,GACD,EAAE;IACP;AAED,OAAI,QAAQ,MACV,mBAAkB,QAAQ,QAAQ;AAOpC,UAAO,IAAIC,yBAAAA,UAAU;IACnB,SALcC,eAAAA,uBACd,QAAQ,WAAW,IACnB,YAAY,UAAU,IAAI,QAC3B;IAGC,YAAY;IACZ,oBAAoB;IACpB;IACA;IACA,IAAI,YAAY;IACjB,CAAC;;EAEJ,QACE,QAAO,IAAIC,yBAAAA,YAAY,QAAQ,WAAW,IAAI,QAAQ,QAAQ,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+D9E,MAAa,6CASR,EAAE,OAAO,aAAa,oBAAoB,kBAAkB;CAC/D,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,UAAU,MAAM,WAAW;CACjC,IAAI;AACJ,KAAI,MAAM,cACR,qBAAoB,EAClB,eAAe,MAAM,eACtB;UACQ,MAAM,WACf,qBAAoB,EAClB,YAAY,MAAM,YACnB;KAED,qBAAoB,EAAE;AAExB,KAAI,mBACF,mBAAkB,iBAAiB;AAErC,KAAI,MAAM,sBAAsB,KAAA,EAC9B,mBAAkB,oBAAoB,MAAM;AAG9C,KAAI,MAAM,MACR,mBAAkB,QAAQ;EACxB,GAAG,MAAM;EACT,OAAO,YAAY,QAAQ,GAAG;EAC/B;CAGH,MAAM,oBAAoB;EACxB,gBAAgB;EAChB,OAAO,EAAE,GAAG,YAAY,OAAO;EAChC;AACD,KAAI,SAAS,OACX,QAAO,IAAIC,yBAAAA,kBAAkB;EAAE;EAAS;EAAmB,CAAC;UACnD,SAAS,aAAa;EAC/B,MAAM,iBAAkC,EAAE;AAC1C,MAAI,MAAM,QAAQ,MAAM,WAAW,CACjC,MAAK,MAAM,eAAe,MAAM,WAC9B,gBAAe,KAAK;GAClB,MAAM,YAAY,UAAU;GAC5B,MAAM,YAAY,UAAU;GAC5B,IAAI,YAAY;GAChB,OAAO,YAAY;GACnB,MAAM;GACP,CAAC;AAGN,SAAO,IAAIC,yBAAAA,eAAe;GACxB;GACA,kBAAkB;GAClB;GACA,IAAI,YAAY;GAChB;GACD,CAAC;YACO,SAAS,SAClB,QAAO,IAAIC,yBAAAA,mBAAmB;EAAE;EAAS;EAAmB,CAAC;UACpD,SAAS,YAClB,QAAO,IAAIA,yBAAAA,mBAAmB;EAC5B;EACA;EACA,mBAAmB,EACjB,iBAAiB,aAClB;EACF,CAAC;UACO,SAAS,WAClB,QAAO,IAAIC,yBAAAA,qBAAqB;EAC9B;EACA;EACA,MAAM,MAAM;EACZ;EACD,CAAC;UACO,SAAS,OAClB,QAAO,IAAIC,yBAAAA,iBAAiB;EAC1B;EACA;EACA,cAAc,MAAM;EACpB;EACD,CAAC;KAEF,QAAO,IAAIC,yBAAAA,iBAAiB;EAAE;EAAS;EAAM;EAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCrE,MAAa,uDAMR,UAAU;AACb,KAAI,MAAM,SAAS;MACb,MAAM,IACR,QAAO;GACL,MAAM;GACN,WAAW,EACT,KAAK,MAAM,KACZ;GACF;WACQ,MAAM,KACf,QAAO;GACL,MAAM;GACN,WAAW,EACT,KAAK,QAAQ,MAAM,SAAS,UAAU,MAAM,QAC7C;GACF;;AAGL,KAAI,MAAM,SAAS;MACb,MAAM,MAAM;GACd,MAAM,UAAA,GAAA,yBAAA,YAAoB;IACxB,MAAM,GAAG,UAAU,MAAM,SAAS,MAAM,IAAI;AAC5C,QAAI,WAAW,SAAS,WAAW,MACjC,QAAO;AAET,WAAO;KACP;AACF,UAAO;IACL,MAAM;IACN,aAAa;KACX,MAAM,MAAM,KAAK,UAAU;KAC3B;KACD;IACF;;;AAGL,KAAI,MAAM,SAAS,QAAQ;AACzB,MAAI,MAAM,MAAM;GACd,MAAM,WAAWT,aAAAA,gCAAgC,MAAM;AAEvD,UAAO;IACL,MAAM;IACN,MAAM;KACJ,WAAW,QAAQ,MAAM,SAAS,UAAU,MAAM;KACxC;KACX;IACF;;AAEH,MAAI,MAAM,OACR,QAAO;GACL,MAAM;GACN,MAAM,EACJ,SAAS,MAAM,QAChB;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuEP,MAAa,qDAGR,EAAE,SAAS,YAAY;CAC1B,IAAI,OAAOU,aAAAA,oBAAoB,QAAQ;AACvC,KAAI,SAAS,YAAYC,aAAAA,iBAAiB,MAAM,CAC9C,QAAO;AAET,KAAI,SAAS,YACX,QAAO;EACL,MAAM;EACN,SAAS,QAAQ,cAAc,QAAQ,UAAU,MAAM,SAAS,OAAO;EACxE;UACQ,SAAS,SAClB,QAAO;EACL,MAAM;EACN,SAAS,QAAQ,cAAc,QAAQ,UAAU,MAAM,SAAS,OAAO;EACxE;UACQ,SAAS,YAClB,QAAO;EACL,MAAM;EACN,SAAS,QAAQ,cAAc,QAAQ,UAAU,MAAM,SAAS,OAAO;EACxE;UACQ,SAAS,UAAUC,yBAAAA,YAAY,WAAW,QAAQ,CAC3D,QAAO;EACL,MAAM;EACN,cAAc,QAAQ;EACtB,SAAS,QAAQ,cAAc,QAAQ,UAAU,MAAM,SAAS,OAAO;EACxE;UACQ,SAAS,WAClB,QAAO;EACL,MAAM;EACN,MAAM,QAAQ,QAAQ;EACtB,SAAS,QAAQ,cACd,QAAQ,UAAU,MAAM,SAAS,OAAO,CACxC,KAAK,GAAG;EACZ;CAGH,UAAU,mBAAmB,QAAiC;AAC5D,OAAK,MAAM,SAAS,QAAQ;AAC1B,OAAI,MAAM,SAAS,OACjB,OAAM;IACJ,MAAM;IACN,MAAM,MAAM;IACb;GAEH,MAAM,OAAO,oDAAoD,MAAM;AACvE,OAAI,KACF,OAAM;;;AAIZ,QAAO;EACL,MAAM;EACN,SAAS,MAAM,KAAK,mBAAmB,QAAQ,cAAc,CAAC;EAC/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EH,MAAa,6CAGR,EAAE,UAAU,YAAY;AAC3B,QAAO,SAAS,SAAS,YAAY;AACnC,MACE,oBAAoB,QAAQ,qBAC5B,QAAQ,mBAAmB,mBAAmB,KAE9C,QAAO,kDAAkD,EAAE,SAAS,CAAC;EAEvE,IAAI,OAAOF,aAAAA,oBAAoB,QAAQ;AACvC,MAAI,SAAS,YAAYC,aAAAA,iBAAiB,MAAM,CAC9C,QAAO;EAGT,MAAM,UACJ,OAAO,QAAQ,YAAY,WACvB,QAAQ,UACR,QAAQ,QAAQ,SAAS,MAAM;AAC7B,QAAA,GAAA,yBAAA,oBAAuB,EAAE,CACvB,SAAA,GAAA,yBAAA,+BACE,GACA,oCACD;AAKH,OACE,OAAO,MAAM,YACb,MAAM,QACN,UAAU,KACV,EAAE,SAAS,WAEX,QAAO,EAAE;AAEX,UAAO;IACP;EAER,MAAM,kBAAuC;GAC3C;GACA;GACD;AACD,MAAI,QAAQ,QAAQ,KAClB,iBAAgB,OAAO,QAAQ;AAEjC,MAAI,QAAQ,kBAAkB,iBAAiB,KAC7C,iBAAgB,gBAAgB,QAAQ,kBAAkB;AAE5D,MAAIV,yBAAAA,UAAU,WAAW,QAAQ,IAAI,CAAC,CAAC,QAAQ,YAAY,OACzD,iBAAgB,aAAa,QAAQ,WAAW,IAC9CY,4CAAAA,iCACD;OACI;AACL,OAAI,QAAQ,kBAAkB,cAAc,KAC1C,iBAAgB,aAAa,QAAQ,kBAAkB;AAEzD,OAAID,yBAAAA,YAAY,WAAW,QAAQ,IAAI,QAAQ,gBAAgB,KAC7D,iBAAgB,eAAe,QAAQ;;AAI3C,MACE,QAAQ,kBAAkB,SAC1B,OAAO,QAAQ,kBAAkB,UAAU,YAC3C,QAAQ,QAAQ,kBAAkB,MAQlC,QAAO,CACL,iBAPmB;GACnB,MAAM;GACN,OAAO,EACL,IAAI,QAAQ,kBAAkB,MAAM,IACrC;GACF,CAIA;AAGH,SAAO;GACP"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"completions.d.cts","names":[],"sources":["../../src/converters/completions.ts"],"mappings":";;;;;;;;AA6CA;cAAa,mCAAA,EAAqC,6BAAA;EAChD,IAAA,EAAM,6BAAA;EACN,KAAA,EAAO,8BAAA;EACP,KAAA,EAAO,mCAAA;EACP,IAAA,EAAM,yBAAA,CAA0B,IAAA;AAAA;;;;;;;;;;;;;;;;AAiOlC;;;;;;;;;;;;;;;;;;;;;;;;AA+HA;;;;;;;;;;;;;;;;;cA/Ha,sCAAA,EAAwC,SAAA;EAEjD,OAAA,EAAS,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,qBAAA;EACvC,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,cAAA;EAC3C,kBAAA;AAAA,GAEF,WAAA;;;;;AAkPF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmIA;;;;;;;;;;;;;;;;;;AAkIA;;;;;;;;;cA9Xa,yCAAA,EAA2C,SAAA;EAGpD,KAAA,EAAO,MAAA;EACP,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mBAAA;EAC3C,kBAAA;EACA,WAAA,GAAc,MAAA,CAAa,IAAA,CAAK,kBAAA;AAAA,GAElC,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiHW,mDAAA,EAAqD,SAAA,CAChE,YAAA,CAAa,QAAA,EACX,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,8BAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mCAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,yBAAA,CAA0B,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+H/C,iDAAA,EAAmD,SAAA;EAC5D,OAAA,EAAS,WAAA;EAAa,KAAA;AAAA,GACxB,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgInB,yCAAA,EAA2C,SAAA;EACpD,QAAA,EAAU,WAAA;EAAe,KAAA;AAAA,GAC3B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA"} | ||
| {"version":3,"file":"completions.d.cts","names":[],"sources":["../../src/converters/completions.ts"],"mappings":";;;;;;;;AA6CA;cAAa,mCAAA,EAAqC,6BAAA;EAChD,IAAA,EAAM,6BAAA;EACN,KAAA,EAAO,8BAAA;EACP,KAAA,EAAO,mCAAA;EACP,IAAA,EAAM,yBAAA,CAA0B,IAAA;AAAA;;;;;;;;;;;;;;;;AAuNlC;;;;;;;;;;;;;;;;;;;;;;;;AA+HA;;;;;;;;;;;;;;;;;cA/Ha,sCAAA,EAAwC,SAAA;EAEjD,OAAA,EAAS,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,qBAAA;EACvC,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,cAAA;EAC3C,kBAAA;AAAA,GAEF,WAAA;;;;;AAkPF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmIA;;;;;;;;;;;;;;;;;;AAkIA;;;;;;;;;cA9Xa,yCAAA,EAA2C,SAAA;EAGpD,KAAA,EAAO,MAAA;EACP,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mBAAA;EAC3C,kBAAA;EACA,WAAA,GAAc,MAAA,CAAa,IAAA,CAAK,kBAAA;AAAA,GAElC,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiHW,mDAAA,EAAqD,SAAA,CAChE,YAAA,CAAa,QAAA,EACX,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,8BAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mCAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,yBAAA,CAA0B,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+H/C,iDAAA,EAAmD,SAAA;EAC5D,OAAA,EAAS,WAAA;EAAa,KAAA;AAAA,GACxB,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgInB,yCAAA,EAA2C,SAAA;EACpD,QAAA,EAAU,WAAA;EAAe,KAAA;AAAA,GAC3B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"completions.d.ts","names":[],"sources":["../../src/converters/completions.ts"],"mappings":";;;;;;;;AA6CA;cAAa,mCAAA,EAAqC,6BAAA;EAChD,IAAA,EAAM,6BAAA;EACN,KAAA,EAAO,8BAAA;EACP,KAAA,EAAO,mCAAA;EACP,IAAA,EAAM,yBAAA,CAA0B,IAAA;AAAA;;;;;;;;;;;;;;;;AAiOlC;;;;;;;;;;;;;;;;;;;;;;;;AA+HA;;;;;;;;;;;;;;;;;cA/Ha,sCAAA,EAAwC,SAAA;EAEjD,OAAA,EAAS,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,qBAAA;EACvC,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,cAAA;EAC3C,kBAAA;AAAA,GAEF,WAAA;;;;;AAkPF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmIA;;;;;;;;;;;;;;;;;;AAkIA;;;;;;;;;cA9Xa,yCAAA,EAA2C,SAAA;EAGpD,KAAA,EAAO,MAAA;EACP,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mBAAA;EAC3C,kBAAA;EACA,WAAA,GAAc,MAAA,CAAa,IAAA,CAAK,kBAAA;AAAA,GAElC,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiHW,mDAAA,EAAqD,SAAA,CAChE,YAAA,CAAa,QAAA,EACX,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,8BAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mCAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,yBAAA,CAA0B,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+H/C,iDAAA,EAAmD,SAAA;EAC5D,OAAA,EAAS,WAAA;EAAa,KAAA;AAAA,GACxB,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgInB,yCAAA,EAA2C,SAAA;EACpD,QAAA,EAAU,WAAA;EAAe,KAAA;AAAA,GAC3B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA"} | ||
| {"version":3,"file":"completions.d.ts","names":[],"sources":["../../src/converters/completions.ts"],"mappings":";;;;;;;;AA6CA;cAAa,mCAAA,EAAqC,6BAAA;EAChD,IAAA,EAAM,6BAAA;EACN,KAAA,EAAO,8BAAA;EACP,KAAA,EAAO,mCAAA;EACP,IAAA,EAAM,yBAAA,CAA0B,IAAA;AAAA;;;;;;;;;;;;;;;;AAuNlC;;;;;;;;;;;;;;;;;;;;;;;;AA+HA;;;;;;;;;;;;;;;;;cA/Ha,sCAAA,EAAwC,SAAA;EAEjD,OAAA,EAAS,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,qBAAA;EACvC,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,cAAA;EAC3C,kBAAA;AAAA,GAEF,WAAA;;;;;AAkPF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmIA;;;;;;;;;;;;;;;;;;AAkIA;;;;;;;;;cA9Xa,yCAAA,EAA2C,SAAA;EAGpD,KAAA,EAAO,MAAA;EACP,WAAA,EAAa,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mBAAA;EAC3C,kBAAA;EACA,WAAA,GAAc,MAAA,CAAa,IAAA,CAAK,kBAAA;AAAA,GAElC,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiHW,mDAAA,EAAqD,SAAA,CAChE,YAAA,CAAa,QAAA,EACX,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,8BAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,mCAAA,GAC9B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,yBAAA,CAA0B,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+H/C,iDAAA,EAAmD,SAAA;EAC5D,OAAA,EAAS,WAAA;EAAa,KAAA;AAAA,GACxB,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgInB,yCAAA,EAA2C,SAAA;EACpD,QAAA,EAAU,WAAA;EAAe,KAAA;AAAA,GAC3B,MAAA,CAAa,IAAA,CAAK,WAAA,CAAY,0BAAA"} |
@@ -81,3 +81,3 @@ import { getRequiredFilenameFromMetadata, isReasoningModel, messageToOpenAIRole } from "../utils/misc.js"; | ||
| file_data: block.url, | ||
| ...block.metadata?.filename || block.metadata?.name ? { filename } : {} | ||
| filename | ||
| } | ||
@@ -92,3 +92,3 @@ }; | ||
| file_data: `data:${block.mime_type ?? ""};base64,${block.data}`, | ||
| ...block.metadata?.filename || block.metadata?.name || block.metadata?.title ? { filename } : {} | ||
| filename | ||
| } | ||
@@ -95,0 +95,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"completions.js","names":[],"sources":["../../src/converters/completions.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n BaseMessageChunk,\n ChatMessage,\n ChatMessageChunk,\n FunctionMessageChunk,\n HumanMessageChunk,\n OpenAIToolCall,\n SystemMessageChunk,\n ToolCallChunk,\n ToolMessage,\n ToolMessageChunk,\n parseBase64DataUrl,\n parseMimeType,\n StandardContentBlockConverter,\n isDataContentBlock,\n ContentBlock,\n iife,\n convertToProviderContentBlock,\n} from \"@langchain/core/messages\";\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport { Converter } from \"@langchain/core/utils/format\";\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from \"openai/resources/chat/completions\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { handleMultiModalOutput } from \"../utils/output.js\";\nimport {\n getRequiredFilenameFromMetadata,\n isReasoningModel,\n messageToOpenAIRole,\n} from \"../utils/misc.js\";\n\n/**\n * @deprecated This converter is an internal detail of the OpenAI provider. Do not use it directly. This will be revisited in a future release.\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\n const filename = getRequiredFilenameFromMetadata(block);\n\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,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n const filename = getRequiredFilenameFromMetadata(block);\n\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,\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\n/**\n * Converts an OpenAI Chat Completions API message to a LangChain BaseMessage.\n *\n * This converter transforms messages from OpenAI's Chat Completions API format into\n * LangChain's internal message representation, handling various message types and\n * preserving metadata, tool calls, and other relevant information.\n *\n * @remarks\n * The converter handles the following message roles:\n * - `assistant`: Converted to {@link AIMessage} with support for tool calls, function calls,\n * audio content, and multi-modal outputs\n * - Other roles: Converted to generic {@link ChatMessage}\n *\n * For assistant messages, the converter:\n * - Parses and validates tool calls, separating valid and invalid calls\n * - Preserves function call information in additional_kwargs\n * - Includes usage statistics and system fingerprint in response_metadata\n * - Handles multi-modal content (text, images, audio)\n * - Optionally includes the raw API response for debugging\n *\n * @param params - Conversion parameters\n * @param params.message - The OpenAI chat completion message to convert\n * @param params.rawResponse - The complete raw response from OpenAI's API, used to extract\n * metadata like model name, usage statistics, and system fingerprint\n * @param params.includeRawResponse - If true, includes the raw OpenAI response in the\n * message's additional_kwargs under the `__raw_response` key. Useful for debugging\n * or accessing provider-specific fields. Defaults to false.\n *\n * @returns A LangChain BaseMessage instance:\n * - {@link AIMessage} for assistant messages with tool calls, metadata, and content\n * - {@link ChatMessage} for all other message types\n *\n * @example\n * ```typescript\n * const baseMessage = convertCompletionsMessageToBaseMessage({\n * message: {\n * role: \"assistant\",\n * content: \"Hello! How can I help you?\",\n * tool_calls: [\n * {\n * id: \"call_123\",\n * type: \"function\",\n * function: { name: \"get_weather\", arguments: '{\"location\":\"NYC\"}' }\n * }\n * ]\n * },\n * rawResponse: completionResponse,\n * includeRawResponse: true\n * });\n * // Returns an AIMessage with parsed tool calls and metadata\n * ```\n *\n * @throws {Error} If tool call parsing fails, the invalid tool call is captured in\n * the `invalid_tool_calls` array rather than throwing an error\n *\n */\nexport const convertCompletionsMessageToBaseMessage: Converter<\n {\n message: OpenAIClient.Chat.Completions.ChatCompletionMessage;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletion;\n includeRawResponse?: boolean;\n },\n BaseMessage\n> = ({ message, rawResponse, includeRawResponse }) => {\n const rawToolCalls: OpenAIToolCall[] | undefined = message.tool_calls as\n | OpenAIToolCall[]\n | undefined;\n const providerReasoningContent = (message as { reasoning_content?: string })\n .reasoning_content;\n switch (message.role) {\n case \"assistant\": {\n const toolCalls = [];\n const invalidToolCalls = [];\n for (const rawToolCall of rawToolCalls ?? []) {\n try {\n toolCalls.push(parseToolCall(rawToolCall, { returnId: true }));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n invalidToolCalls.push(makeInvalidToolCall(rawToolCall, e.message));\n }\n }\n const additional_kwargs: Record<string, unknown> = {\n function_call: message.function_call,\n tool_calls: rawToolCalls,\n };\n if (includeRawResponse !== undefined) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (providerReasoningContent !== undefined) {\n additional_kwargs.reasoning_content = providerReasoningContent;\n }\n const response_metadata: Record<string, unknown> | undefined = {\n model_provider: \"openai\",\n model_name: rawResponse.model,\n ...(rawResponse.system_fingerprint\n ? {\n usage: { ...rawResponse.usage },\n system_fingerprint: rawResponse.system_fingerprint,\n }\n : {}),\n };\n\n if (message.audio) {\n additional_kwargs.audio = message.audio;\n }\n\n const content = handleMultiModalOutput(\n message.content || \"\",\n rawResponse.choices?.[0]?.message\n );\n return new AIMessage({\n content,\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n additional_kwargs,\n response_metadata,\n id: rawResponse.id,\n });\n }\n default:\n return new ChatMessage(message.content || \"\", message.role ?? \"unknown\");\n }\n};\n\n/**\n * Converts an OpenAI Chat Completions API delta (streaming chunk) to a LangChain BaseMessageChunk.\n *\n * This converter is used during streaming responses to transform incremental updates from OpenAI's\n * Chat Completions API into LangChain message chunks. It handles various message types, tool calls,\n * function calls, audio content, and role-specific message chunk creation.\n *\n * @param params - Conversion parameters\n * @param params.delta - The delta object from an OpenAI streaming chunk containing incremental\n * message updates. May include content, role, tool_calls, function_call, audio, etc.\n * @param params.rawResponse - The complete raw ChatCompletionChunk response from OpenAI,\n * containing metadata like model info, usage stats, and the delta\n * @param params.includeRawResponse - Optional flag to include the raw OpenAI response in the\n * message chunk's additional_kwargs. Useful for debugging or accessing provider-specific data\n * @param params.defaultRole - Optional default role to use if the delta doesn't specify one.\n * Typically used to maintain role consistency across chunks in a streaming response\n *\n * @returns A BaseMessageChunk subclass appropriate for the message role:\n * - HumanMessageChunk for \"user\" role\n * - AIMessageChunk for \"assistant\" role (includes tool call chunks)\n * - SystemMessageChunk for \"system\" or \"developer\" roles\n * - FunctionMessageChunk for \"function\" role\n * - ToolMessageChunk for \"tool\" role\n * - ChatMessageChunk for any other role\n *\n * @example\n * Basic streaming text chunk:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: { role: \"assistant\", content: \"Hello\" },\n * rawResponse: { id: \"chatcmpl-123\", model: \"gpt-4\", ... }\n * });\n * // Returns: AIMessageChunk with content \"Hello\"\n * ```\n *\n * @example\n * Streaming chunk with tool call:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: {\n * role: \"assistant\",\n * tool_calls: [{\n * index: 0,\n * id: \"call_123\",\n * function: { name: \"get_weather\", arguments: '{\"location\":' }\n * }]\n * },\n * rawResponse: { id: \"chatcmpl-123\", ... }\n * });\n * // Returns: AIMessageChunk with tool_call_chunks containing partial tool call data\n * ```\n *\n * @remarks\n * - Tool calls are converted to ToolCallChunk objects with incremental data\n * - Audio content includes the chunk index from the raw response\n * - The \"developer\" role is mapped to SystemMessageChunk with a special marker\n * - Response metadata includes model provider info and usage statistics\n * - Function calls and tool calls are stored in additional_kwargs for compatibility\n */\nexport const convertCompletionsDeltaToBaseMessageChunk: Converter<\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk;\n includeRawResponse?: boolean;\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole;\n },\n BaseMessageChunk\n> = ({ delta, rawResponse, includeRawResponse, defaultRole }) => {\n const role = delta.role ?? defaultRole;\n const content = delta.content ?? \"\";\n let additional_kwargs: Record<string, unknown>;\n if (delta.function_call) {\n additional_kwargs = {\n function_call: delta.function_call,\n };\n } else if (delta.tool_calls) {\n additional_kwargs = {\n tool_calls: delta.tool_calls,\n };\n } else {\n additional_kwargs = {};\n }\n if (includeRawResponse) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (delta.reasoning_content !== undefined) {\n additional_kwargs.reasoning_content = delta.reasoning_content;\n }\n\n if (delta.audio) {\n additional_kwargs.audio = {\n ...delta.audio,\n index: rawResponse.choices[0].index,\n };\n }\n\n const response_metadata = {\n model_provider: \"openai\",\n usage: { ...rawResponse.usage },\n };\n if (role === \"user\") {\n return new HumanMessageChunk({ content, response_metadata });\n } else if (role === \"assistant\") {\n const toolCallChunks: ToolCallChunk[] = [];\n if (Array.isArray(delta.tool_calls)) {\n for (const rawToolCall of delta.tool_calls) {\n toolCallChunks.push({\n name: rawToolCall.function?.name,\n args: rawToolCall.function?.arguments,\n id: rawToolCall.id,\n index: rawToolCall.index,\n type: \"tool_call_chunk\",\n });\n }\n }\n return new AIMessageChunk({\n content,\n tool_call_chunks: toolCallChunks,\n additional_kwargs,\n id: rawResponse.id,\n response_metadata,\n });\n } else if (role === \"system\") {\n return new SystemMessageChunk({ content, response_metadata });\n } else if (role === \"developer\") {\n return new SystemMessageChunk({\n content,\n response_metadata,\n additional_kwargs: {\n __openai_role__: \"developer\",\n },\n });\n } else if (role === \"function\") {\n return new FunctionMessageChunk({\n content,\n additional_kwargs,\n name: delta.name,\n response_metadata,\n });\n } else if (role === \"tool\") {\n return new ToolMessageChunk({\n content,\n additional_kwargs,\n tool_call_id: delta.tool_call_id,\n response_metadata,\n });\n } else {\n return new ChatMessageChunk({ content, role, response_metadata });\n }\n};\n\n/**\n * Converts a standard LangChain content block to an OpenAI Completions API content part.\n *\n * This converter transforms LangChain's standardized content blocks (image, audio, file)\n * into the format expected by OpenAI's Chat Completions API. It handles various content\n * types including images (URL or base64), audio (base64), and files (data or file ID).\n *\n * @param block - The standard content block to convert. Can be an image, audio, or file block.\n *\n * @returns An OpenAI Chat Completions content part object, or undefined if the block\n * cannot be converted (e.g., missing required data).\n *\n * @example\n * Image with URL:\n * ```typescript\n * const block = { type: \"image\", url: \"https://example.com/image.jpg\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * ```\n *\n * @example\n * Image with base64 data:\n * ```typescript\n * const block = { type: \"image\", data: \"iVBORw0KGgo...\", mimeType: \"image/png\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"data:image/png;base64,iVBORw0KGgo...\" } }\n * ```\n */\nexport const convertStandardContentBlockToCompletionsContentPart: Converter<\n ContentBlock.Standard,\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartImage\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartInputAudio\n | OpenAIClient.Chat.Completions.ChatCompletionContentPart.File\n | undefined\n> = (block) => {\n if (block.type === \"image\") {\n if (block.url) {\n return {\n type: \"image_url\",\n image_url: {\n url: block.url,\n },\n };\n } else if (block.data) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${block.mimeType};base64,${block.data}`,\n },\n };\n }\n }\n if (block.type === \"audio\") {\n if (block.data) {\n const format = iife(() => {\n const [, format] = block.mimeType.split(\"/\");\n if (format === \"wav\" || format === \"mp3\") {\n return format;\n }\n return \"wav\";\n });\n return {\n type: \"input_audio\",\n input_audio: {\n data: block.data.toString(),\n format,\n },\n };\n }\n }\n if (block.type === \"file\") {\n if (block.data) {\n const filename = getRequiredFilenameFromMetadata(block);\n\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mimeType};base64,${block.data}`,\n filename: filename,\n },\n };\n }\n if (block.fileId) {\n return {\n type: \"file\",\n file: {\n file_id: block.fileId,\n },\n };\n }\n }\n return undefined;\n};\n\n/**\n * Converts a LangChain BaseMessage with standard content blocks to an OpenAI Chat Completions API message parameter.\n *\n * This converter transforms LangChain's standardized message format (using contentBlocks) into the format\n * expected by OpenAI's Chat Completions API. It handles role mapping, content filtering, and multi-modal\n * content conversion for various message types.\n *\n * @remarks\n * The converter performs the following transformations:\n * - Maps LangChain message roles to OpenAI API roles (user, assistant, system, developer, tool, function)\n * - For reasoning models, automatically converts \"system\" role to \"developer\" role\n * - Filters content blocks based on message role (most roles only include text blocks)\n * - For user messages, converts multi-modal content blocks (images, audio, files) to OpenAI format\n * - Preserves tool call IDs for tool messages and function names for function messages\n *\n * Role-specific behavior:\n * - **developer**: Returns only text content blocks (used for reasoning models)\n * - **system**: Returns only text content blocks\n * - **assistant**: Returns only text content blocks\n * - **tool**: Returns only text content blocks with tool_call_id preserved\n * - **function**: Returns text content blocks joined as a single string with function name\n * - **user** (default): Returns multi-modal content including text, images, audio, and files\n *\n * @param params - Conversion parameters\n * @param params.message - The LangChain BaseMessage to convert. Must have contentBlocks property\n * containing an array of standard content blocks (text, image, audio, file, etc.)\n * @param params.model - Optional model name. Used to determine if special role mapping is needed\n * (e.g., \"system\" -> \"developer\" for reasoning models like o1)\n *\n * @returns An OpenAI ChatCompletionMessageParam object formatted for the Chat Completions API.\n * The structure varies by role:\n * - Developer/System/Assistant: `{ role, content: TextBlock[] }`\n * - Tool: `{ role: \"tool\", tool_call_id, content: TextBlock[] }`\n * - Function: `{ role: \"function\", name, content: string }`\n * - User: `{ role: \"user\", content: Array<TextPart | ImagePart | AudioPart | FilePart> }`\n *\n * @example\n * Simple text message:\n * ```typescript\n * const message = new HumanMessage({\n * content: [{ type: \"text\", text: \"Hello!\" }]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: { role: \"user\", content: [{ type: \"text\", text: \"Hello!\" }] }\n * ```\n *\n * @example\n * Multi-modal user message with image:\n * ```typescript\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", url: \"https://example.com/image.jpg\" }\n * ]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: {\n * // role: \"user\",\n * // content: [\n * // { type: \"text\", text: \"What's in this image?\" },\n * // { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * // ]\n * // }\n * ```\n */\nexport const convertStandardContentMessageToCompletionsMessage: Converter<\n { message: BaseMessage; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam\n> = ({ message, model }) => {\n let role = messageToOpenAIRole(message);\n if (role === \"system\" && isReasoningModel(model)) {\n role = \"developer\";\n }\n if (role === \"developer\") {\n return {\n role: \"developer\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"system\") {\n return {\n role: \"system\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"assistant\") {\n return {\n role: \"assistant\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"tool\" && ToolMessage.isInstance(message)) {\n return {\n role: \"tool\",\n tool_call_id: message.tool_call_id,\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"function\") {\n return {\n role: \"function\",\n name: message.name ?? \"\",\n content: message.contentBlocks\n .filter((block) => block.type === \"text\")\n .join(\"\"),\n };\n }\n // Default to user message handling\n function* iterateUserContent(blocks: ContentBlock.Standard[]) {\n for (const block of blocks) {\n if (block.type === \"text\") {\n yield {\n type: \"text\" as const,\n text: block.text,\n };\n }\n const data = convertStandardContentBlockToCompletionsContentPart(block);\n if (data) {\n yield data;\n }\n }\n }\n return {\n role: \"user\",\n content: Array.from(iterateUserContent(message.contentBlocks)),\n };\n};\n\n/**\n * Converts an array of LangChain BaseMessages to OpenAI Chat Completions API message parameters.\n *\n * This converter transforms LangChain's internal message representation into the format required\n * by OpenAI's Chat Completions API. It handles various message types, roles, content formats,\n * tool calls, function calls, audio messages, and special model-specific requirements.\n *\n * @remarks\n * The converter performs several key transformations:\n * - Maps LangChain message types to OpenAI roles (user, assistant, system, tool, function, developer)\n * - Converts standard content blocks (v1 format) using a specialized converter\n * - Handles multimodal content including text, images, audio, and data blocks\n * - Preserves tool calls and function calls with proper formatting\n * - Applies model-specific role mappings (e.g., \"system\" → \"developer\" for reasoning models)\n * - Splits audio messages into separate message parameters when needed\n *\n * @param params - Conversion parameters\n * @param params.messages - Array of LangChain BaseMessages to convert. Can include any message\n * type: HumanMessage, AIMessage, SystemMessage, ToolMessage, FunctionMessage, etc.\n * @param params.model - Optional model name used to determine if special role mapping is needed.\n * For reasoning models (o1, o3, etc.), \"system\" role is converted to \"developer\" role.\n *\n * @returns Array of ChatCompletionMessageParam objects formatted for OpenAI's Chat Completions API.\n * Some messages may be split into multiple parameters (e.g., audio messages).\n *\n * @example\n * Basic message conversion:\n * ```typescript\n * const messages = [\n * new HumanMessage(\"What's the weather like?\"),\n * new AIMessage(\"Let me check that for you.\")\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({\n * messages,\n * model: \"gpt-4\"\n * });\n * // Returns:\n * // [\n * // { role: \"user\", content: \"What's the weather like?\" },\n * // { role: \"assistant\", content: \"Let me check that for you.\" }\n * // ]\n * ```\n *\n * @example\n * Message with tool calls:\n * ```typescript\n * const messages = [\n * new AIMessage({\n * content: \"\",\n * tool_calls: [{\n * id: \"call_123\",\n * name: \"get_weather\",\n * args: { location: \"San Francisco\" }\n * }]\n * })\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({ messages });\n * // Returns:\n * // [{\n * // role: \"assistant\",\n * // content: \"\",\n * // tool_calls: [{\n * // id: \"call_123\",\n * // type: \"function\",\n * // function: { name: \"get_weather\", arguments: '{\"location\":\"San Francisco\"}' }\n * // }]\n * // }]\n * ```\n */\nexport const convertMessagesToCompletionsMessageParams: Converter<\n { messages: BaseMessage[]; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam[]\n> = ({ messages, model }) => {\n return messages.flatMap((message) => {\n if (\n \"output_version\" in message.response_metadata &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return convertStandardContentMessageToCompletionsMessage({ 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.flatMap((m) => {\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n // Drop Anthropic tool_use blocks from content — these are\n // already represented in message.tool_calls and would cause\n // an API error if passed through to OpenAI.\n if (\n typeof m === \"object\" &&\n m !== null &&\n \"type\" in m &&\n m.type === \"tool_use\"\n ) {\n return [];\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 }\n if (AIMessage.isInstance(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if (ToolMessage.isInstance(message) && message.tool_call_id != null) {\n completionParam.tool_call_id = message.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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"} | ||
| {"version":3,"file":"completions.js","names":[],"sources":["../../src/converters/completions.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n BaseMessageChunk,\n ChatMessage,\n ChatMessageChunk,\n FunctionMessageChunk,\n HumanMessageChunk,\n OpenAIToolCall,\n SystemMessageChunk,\n ToolCallChunk,\n ToolMessage,\n ToolMessageChunk,\n parseBase64DataUrl,\n parseMimeType,\n StandardContentBlockConverter,\n isDataContentBlock,\n ContentBlock,\n iife,\n convertToProviderContentBlock,\n} from \"@langchain/core/messages\";\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport { Converter } from \"@langchain/core/utils/format\";\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from \"openai/resources/chat/completions\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { handleMultiModalOutput } from \"../utils/output.js\";\nimport {\n getRequiredFilenameFromMetadata,\n isReasoningModel,\n messageToOpenAIRole,\n} from \"../utils/misc.js\";\n\n/**\n * @deprecated This converter is an internal detail of the OpenAI provider. Do not use it directly. This will be revisited in a future release.\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\n const filename = getRequiredFilenameFromMetadata(block);\n\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 filename,\n },\n };\n }\n\n if (block.source_type === \"base64\") {\n const filename = getRequiredFilenameFromMetadata(block);\n\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mime_type ?? \"\"};base64,${block.data}`,\n filename,\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\n/**\n * Converts an OpenAI Chat Completions API message to a LangChain BaseMessage.\n *\n * This converter transforms messages from OpenAI's Chat Completions API format into\n * LangChain's internal message representation, handling various message types and\n * preserving metadata, tool calls, and other relevant information.\n *\n * @remarks\n * The converter handles the following message roles:\n * - `assistant`: Converted to {@link AIMessage} with support for tool calls, function calls,\n * audio content, and multi-modal outputs\n * - Other roles: Converted to generic {@link ChatMessage}\n *\n * For assistant messages, the converter:\n * - Parses and validates tool calls, separating valid and invalid calls\n * - Preserves function call information in additional_kwargs\n * - Includes usage statistics and system fingerprint in response_metadata\n * - Handles multi-modal content (text, images, audio)\n * - Optionally includes the raw API response for debugging\n *\n * @param params - Conversion parameters\n * @param params.message - The OpenAI chat completion message to convert\n * @param params.rawResponse - The complete raw response from OpenAI's API, used to extract\n * metadata like model name, usage statistics, and system fingerprint\n * @param params.includeRawResponse - If true, includes the raw OpenAI response in the\n * message's additional_kwargs under the `__raw_response` key. Useful for debugging\n * or accessing provider-specific fields. Defaults to false.\n *\n * @returns A LangChain BaseMessage instance:\n * - {@link AIMessage} for assistant messages with tool calls, metadata, and content\n * - {@link ChatMessage} for all other message types\n *\n * @example\n * ```typescript\n * const baseMessage = convertCompletionsMessageToBaseMessage({\n * message: {\n * role: \"assistant\",\n * content: \"Hello! How can I help you?\",\n * tool_calls: [\n * {\n * id: \"call_123\",\n * type: \"function\",\n * function: { name: \"get_weather\", arguments: '{\"location\":\"NYC\"}' }\n * }\n * ]\n * },\n * rawResponse: completionResponse,\n * includeRawResponse: true\n * });\n * // Returns an AIMessage with parsed tool calls and metadata\n * ```\n *\n * @throws {Error} If tool call parsing fails, the invalid tool call is captured in\n * the `invalid_tool_calls` array rather than throwing an error\n *\n */\nexport const convertCompletionsMessageToBaseMessage: Converter<\n {\n message: OpenAIClient.Chat.Completions.ChatCompletionMessage;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletion;\n includeRawResponse?: boolean;\n },\n BaseMessage\n> = ({ message, rawResponse, includeRawResponse }) => {\n const rawToolCalls: OpenAIToolCall[] | undefined = message.tool_calls as\n | OpenAIToolCall[]\n | undefined;\n const providerReasoningContent = (message as { reasoning_content?: string })\n .reasoning_content;\n switch (message.role) {\n case \"assistant\": {\n const toolCalls = [];\n const invalidToolCalls = [];\n for (const rawToolCall of rawToolCalls ?? []) {\n try {\n toolCalls.push(parseToolCall(rawToolCall, { returnId: true }));\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n invalidToolCalls.push(makeInvalidToolCall(rawToolCall, e.message));\n }\n }\n const additional_kwargs: Record<string, unknown> = {\n function_call: message.function_call,\n tool_calls: rawToolCalls,\n };\n if (includeRawResponse !== undefined) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (providerReasoningContent !== undefined) {\n additional_kwargs.reasoning_content = providerReasoningContent;\n }\n const response_metadata: Record<string, unknown> | undefined = {\n model_provider: \"openai\",\n model_name: rawResponse.model,\n ...(rawResponse.system_fingerprint\n ? {\n usage: { ...rawResponse.usage },\n system_fingerprint: rawResponse.system_fingerprint,\n }\n : {}),\n };\n\n if (message.audio) {\n additional_kwargs.audio = message.audio;\n }\n\n const content = handleMultiModalOutput(\n message.content || \"\",\n rawResponse.choices?.[0]?.message\n );\n return new AIMessage({\n content,\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n additional_kwargs,\n response_metadata,\n id: rawResponse.id,\n });\n }\n default:\n return new ChatMessage(message.content || \"\", message.role ?? \"unknown\");\n }\n};\n\n/**\n * Converts an OpenAI Chat Completions API delta (streaming chunk) to a LangChain BaseMessageChunk.\n *\n * This converter is used during streaming responses to transform incremental updates from OpenAI's\n * Chat Completions API into LangChain message chunks. It handles various message types, tool calls,\n * function calls, audio content, and role-specific message chunk creation.\n *\n * @param params - Conversion parameters\n * @param params.delta - The delta object from an OpenAI streaming chunk containing incremental\n * message updates. May include content, role, tool_calls, function_call, audio, etc.\n * @param params.rawResponse - The complete raw ChatCompletionChunk response from OpenAI,\n * containing metadata like model info, usage stats, and the delta\n * @param params.includeRawResponse - Optional flag to include the raw OpenAI response in the\n * message chunk's additional_kwargs. Useful for debugging or accessing provider-specific data\n * @param params.defaultRole - Optional default role to use if the delta doesn't specify one.\n * Typically used to maintain role consistency across chunks in a streaming response\n *\n * @returns A BaseMessageChunk subclass appropriate for the message role:\n * - HumanMessageChunk for \"user\" role\n * - AIMessageChunk for \"assistant\" role (includes tool call chunks)\n * - SystemMessageChunk for \"system\" or \"developer\" roles\n * - FunctionMessageChunk for \"function\" role\n * - ToolMessageChunk for \"tool\" role\n * - ChatMessageChunk for any other role\n *\n * @example\n * Basic streaming text chunk:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: { role: \"assistant\", content: \"Hello\" },\n * rawResponse: { id: \"chatcmpl-123\", model: \"gpt-4\", ... }\n * });\n * // Returns: AIMessageChunk with content \"Hello\"\n * ```\n *\n * @example\n * Streaming chunk with tool call:\n * ```typescript\n * const chunk = convertCompletionsDeltaToBaseMessageChunk({\n * delta: {\n * role: \"assistant\",\n * tool_calls: [{\n * index: 0,\n * id: \"call_123\",\n * function: { name: \"get_weather\", arguments: '{\"location\":' }\n * }]\n * },\n * rawResponse: { id: \"chatcmpl-123\", ... }\n * });\n * // Returns: AIMessageChunk with tool_call_chunks containing partial tool call data\n * ```\n *\n * @remarks\n * - Tool calls are converted to ToolCallChunk objects with incremental data\n * - Audio content includes the chunk index from the raw response\n * - The \"developer\" role is mapped to SystemMessageChunk with a special marker\n * - Response metadata includes model provider info and usage statistics\n * - Function calls and tool calls are stored in additional_kwargs for compatibility\n */\nexport const convertCompletionsDeltaToBaseMessageChunk: Converter<\n {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>;\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk;\n includeRawResponse?: boolean;\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole;\n },\n BaseMessageChunk\n> = ({ delta, rawResponse, includeRawResponse, defaultRole }) => {\n const role = delta.role ?? defaultRole;\n const content = delta.content ?? \"\";\n let additional_kwargs: Record<string, unknown>;\n if (delta.function_call) {\n additional_kwargs = {\n function_call: delta.function_call,\n };\n } else if (delta.tool_calls) {\n additional_kwargs = {\n tool_calls: delta.tool_calls,\n };\n } else {\n additional_kwargs = {};\n }\n if (includeRawResponse) {\n additional_kwargs.__raw_response = rawResponse;\n }\n if (delta.reasoning_content !== undefined) {\n additional_kwargs.reasoning_content = delta.reasoning_content;\n }\n\n if (delta.audio) {\n additional_kwargs.audio = {\n ...delta.audio,\n index: rawResponse.choices[0].index,\n };\n }\n\n const response_metadata = {\n model_provider: \"openai\",\n usage: { ...rawResponse.usage },\n };\n if (role === \"user\") {\n return new HumanMessageChunk({ content, response_metadata });\n } else if (role === \"assistant\") {\n const toolCallChunks: ToolCallChunk[] = [];\n if (Array.isArray(delta.tool_calls)) {\n for (const rawToolCall of delta.tool_calls) {\n toolCallChunks.push({\n name: rawToolCall.function?.name,\n args: rawToolCall.function?.arguments,\n id: rawToolCall.id,\n index: rawToolCall.index,\n type: \"tool_call_chunk\",\n });\n }\n }\n return new AIMessageChunk({\n content,\n tool_call_chunks: toolCallChunks,\n additional_kwargs,\n id: rawResponse.id,\n response_metadata,\n });\n } else if (role === \"system\") {\n return new SystemMessageChunk({ content, response_metadata });\n } else if (role === \"developer\") {\n return new SystemMessageChunk({\n content,\n response_metadata,\n additional_kwargs: {\n __openai_role__: \"developer\",\n },\n });\n } else if (role === \"function\") {\n return new FunctionMessageChunk({\n content,\n additional_kwargs,\n name: delta.name,\n response_metadata,\n });\n } else if (role === \"tool\") {\n return new ToolMessageChunk({\n content,\n additional_kwargs,\n tool_call_id: delta.tool_call_id,\n response_metadata,\n });\n } else {\n return new ChatMessageChunk({ content, role, response_metadata });\n }\n};\n\n/**\n * Converts a standard LangChain content block to an OpenAI Completions API content part.\n *\n * This converter transforms LangChain's standardized content blocks (image, audio, file)\n * into the format expected by OpenAI's Chat Completions API. It handles various content\n * types including images (URL or base64), audio (base64), and files (data or file ID).\n *\n * @param block - The standard content block to convert. Can be an image, audio, or file block.\n *\n * @returns An OpenAI Chat Completions content part object, or undefined if the block\n * cannot be converted (e.g., missing required data).\n *\n * @example\n * Image with URL:\n * ```typescript\n * const block = { type: \"image\", url: \"https://example.com/image.jpg\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * ```\n *\n * @example\n * Image with base64 data:\n * ```typescript\n * const block = { type: \"image\", data: \"iVBORw0KGgo...\", mimeType: \"image/png\" };\n * const part = convertStandardContentBlockToCompletionsContentPart(block);\n * // Returns: { type: \"image_url\", image_url: { url: \"data:image/png;base64,iVBORw0KGgo...\" } }\n * ```\n */\nexport const convertStandardContentBlockToCompletionsContentPart: Converter<\n ContentBlock.Standard,\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartImage\n | OpenAIClient.Chat.Completions.ChatCompletionContentPartInputAudio\n | OpenAIClient.Chat.Completions.ChatCompletionContentPart.File\n | undefined\n> = (block) => {\n if (block.type === \"image\") {\n if (block.url) {\n return {\n type: \"image_url\",\n image_url: {\n url: block.url,\n },\n };\n } else if (block.data) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${block.mimeType};base64,${block.data}`,\n },\n };\n }\n }\n if (block.type === \"audio\") {\n if (block.data) {\n const format = iife(() => {\n const [, format] = block.mimeType.split(\"/\");\n if (format === \"wav\" || format === \"mp3\") {\n return format;\n }\n return \"wav\";\n });\n return {\n type: \"input_audio\",\n input_audio: {\n data: block.data.toString(),\n format,\n },\n };\n }\n }\n if (block.type === \"file\") {\n if (block.data) {\n const filename = getRequiredFilenameFromMetadata(block);\n\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.mimeType};base64,${block.data}`,\n filename: filename,\n },\n };\n }\n if (block.fileId) {\n return {\n type: \"file\",\n file: {\n file_id: block.fileId,\n },\n };\n }\n }\n return undefined;\n};\n\n/**\n * Converts a LangChain BaseMessage with standard content blocks to an OpenAI Chat Completions API message parameter.\n *\n * This converter transforms LangChain's standardized message format (using contentBlocks) into the format\n * expected by OpenAI's Chat Completions API. It handles role mapping, content filtering, and multi-modal\n * content conversion for various message types.\n *\n * @remarks\n * The converter performs the following transformations:\n * - Maps LangChain message roles to OpenAI API roles (user, assistant, system, developer, tool, function)\n * - For reasoning models, automatically converts \"system\" role to \"developer\" role\n * - Filters content blocks based on message role (most roles only include text blocks)\n * - For user messages, converts multi-modal content blocks (images, audio, files) to OpenAI format\n * - Preserves tool call IDs for tool messages and function names for function messages\n *\n * Role-specific behavior:\n * - **developer**: Returns only text content blocks (used for reasoning models)\n * - **system**: Returns only text content blocks\n * - **assistant**: Returns only text content blocks\n * - **tool**: Returns only text content blocks with tool_call_id preserved\n * - **function**: Returns text content blocks joined as a single string with function name\n * - **user** (default): Returns multi-modal content including text, images, audio, and files\n *\n * @param params - Conversion parameters\n * @param params.message - The LangChain BaseMessage to convert. Must have contentBlocks property\n * containing an array of standard content blocks (text, image, audio, file, etc.)\n * @param params.model - Optional model name. Used to determine if special role mapping is needed\n * (e.g., \"system\" -> \"developer\" for reasoning models like o1)\n *\n * @returns An OpenAI ChatCompletionMessageParam object formatted for the Chat Completions API.\n * The structure varies by role:\n * - Developer/System/Assistant: `{ role, content: TextBlock[] }`\n * - Tool: `{ role: \"tool\", tool_call_id, content: TextBlock[] }`\n * - Function: `{ role: \"function\", name, content: string }`\n * - User: `{ role: \"user\", content: Array<TextPart | ImagePart | AudioPart | FilePart> }`\n *\n * @example\n * Simple text message:\n * ```typescript\n * const message = new HumanMessage({\n * content: [{ type: \"text\", text: \"Hello!\" }]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: { role: \"user\", content: [{ type: \"text\", text: \"Hello!\" }] }\n * ```\n *\n * @example\n * Multi-modal user message with image:\n * ```typescript\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", url: \"https://example.com/image.jpg\" }\n * ]\n * });\n * const param = convertStandardContentMessageToCompletionsMessage({ message });\n * // Returns: {\n * // role: \"user\",\n * // content: [\n * // { type: \"text\", text: \"What's in this image?\" },\n * // { type: \"image_url\", image_url: { url: \"https://example.com/image.jpg\" } }\n * // ]\n * // }\n * ```\n */\nexport const convertStandardContentMessageToCompletionsMessage: Converter<\n { message: BaseMessage; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam\n> = ({ message, model }) => {\n let role = messageToOpenAIRole(message);\n if (role === \"system\" && isReasoningModel(model)) {\n role = \"developer\";\n }\n if (role === \"developer\") {\n return {\n role: \"developer\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"system\") {\n return {\n role: \"system\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"assistant\") {\n return {\n role: \"assistant\",\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"tool\" && ToolMessage.isInstance(message)) {\n return {\n role: \"tool\",\n tool_call_id: message.tool_call_id,\n content: message.contentBlocks.filter((block) => block.type === \"text\"),\n };\n } else if (role === \"function\") {\n return {\n role: \"function\",\n name: message.name ?? \"\",\n content: message.contentBlocks\n .filter((block) => block.type === \"text\")\n .join(\"\"),\n };\n }\n // Default to user message handling\n function* iterateUserContent(blocks: ContentBlock.Standard[]) {\n for (const block of blocks) {\n if (block.type === \"text\") {\n yield {\n type: \"text\" as const,\n text: block.text,\n };\n }\n const data = convertStandardContentBlockToCompletionsContentPart(block);\n if (data) {\n yield data;\n }\n }\n }\n return {\n role: \"user\",\n content: Array.from(iterateUserContent(message.contentBlocks)),\n };\n};\n\n/**\n * Converts an array of LangChain BaseMessages to OpenAI Chat Completions API message parameters.\n *\n * This converter transforms LangChain's internal message representation into the format required\n * by OpenAI's Chat Completions API. It handles various message types, roles, content formats,\n * tool calls, function calls, audio messages, and special model-specific requirements.\n *\n * @remarks\n * The converter performs several key transformations:\n * - Maps LangChain message types to OpenAI roles (user, assistant, system, tool, function, developer)\n * - Converts standard content blocks (v1 format) using a specialized converter\n * - Handles multimodal content including text, images, audio, and data blocks\n * - Preserves tool calls and function calls with proper formatting\n * - Applies model-specific role mappings (e.g., \"system\" → \"developer\" for reasoning models)\n * - Splits audio messages into separate message parameters when needed\n *\n * @param params - Conversion parameters\n * @param params.messages - Array of LangChain BaseMessages to convert. Can include any message\n * type: HumanMessage, AIMessage, SystemMessage, ToolMessage, FunctionMessage, etc.\n * @param params.model - Optional model name used to determine if special role mapping is needed.\n * For reasoning models (o1, o3, etc.), \"system\" role is converted to \"developer\" role.\n *\n * @returns Array of ChatCompletionMessageParam objects formatted for OpenAI's Chat Completions API.\n * Some messages may be split into multiple parameters (e.g., audio messages).\n *\n * @example\n * Basic message conversion:\n * ```typescript\n * const messages = [\n * new HumanMessage(\"What's the weather like?\"),\n * new AIMessage(\"Let me check that for you.\")\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({\n * messages,\n * model: \"gpt-4\"\n * });\n * // Returns:\n * // [\n * // { role: \"user\", content: \"What's the weather like?\" },\n * // { role: \"assistant\", content: \"Let me check that for you.\" }\n * // ]\n * ```\n *\n * @example\n * Message with tool calls:\n * ```typescript\n * const messages = [\n * new AIMessage({\n * content: \"\",\n * tool_calls: [{\n * id: \"call_123\",\n * name: \"get_weather\",\n * args: { location: \"San Francisco\" }\n * }]\n * })\n * ];\n *\n * const params = convertMessagesToCompletionsMessageParams({ messages });\n * // Returns:\n * // [{\n * // role: \"assistant\",\n * // content: \"\",\n * // tool_calls: [{\n * // id: \"call_123\",\n * // type: \"function\",\n * // function: { name: \"get_weather\", arguments: '{\"location\":\"San Francisco\"}' }\n * // }]\n * // }]\n * ```\n */\nexport const convertMessagesToCompletionsMessageParams: Converter<\n { messages: BaseMessage[]; model?: string },\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam[]\n> = ({ messages, model }) => {\n return messages.flatMap((message) => {\n if (\n \"output_version\" in message.response_metadata &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return convertStandardContentMessageToCompletionsMessage({ 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.flatMap((m) => {\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n // Drop Anthropic tool_use blocks from content — these are\n // already represented in message.tool_calls and would cause\n // an API error if passed through to OpenAI.\n if (\n typeof m === \"object\" &&\n m !== null &&\n \"type\" in m &&\n m.type === \"tool_use\"\n ) {\n return [];\n }\n return m;\n });\n // oxlint-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 }\n if (AIMessage.isInstance(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if (ToolMessage.isInstance(message) && message.tool_call_id != null) {\n completionParam.tool_call_id = message.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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"} |
@@ -718,3 +718,3 @@ const require_tools = require("../utils/tools.cjs"); | ||
| file_data: `data:${block.mimeType ?? "application/octet-stream"};base64,${encoded}`, | ||
| ...filename ? { filename } : {} | ||
| filename | ||
| }; | ||
@@ -721,0 +721,0 @@ } |
@@ -718,3 +718,3 @@ import { isComputerToolCall, isCustomToolCall, parseComputerCall, parseCustomToolCall } from "../utils/tools.js"; | ||
| file_data: `data:${block.mimeType ?? "application/octet-stream"};base64,${encoded}`, | ||
| ...filename ? { filename } : {} | ||
| filename | ||
| }; | ||
@@ -721,0 +721,0 @@ } |
@@ -114,3 +114,3 @@ import { OpenAIApiKey } from "./types.cjs"; | ||
| protected embeddingWithRetry(request: OpenAI.EmbeddingCreateParams): Promise<OpenAI.CreateEmbeddingResponse & { | ||
| _request_id?: string | null | undefined; | ||
| _request_id?: string | null; | ||
| }>; | ||
@@ -117,0 +117,0 @@ } |
@@ -114,3 +114,3 @@ import { OpenAIApiKey } from "./types.js"; | ||
| protected embeddingWithRetry(request: OpenAI.EmbeddingCreateParams): Promise<OpenAI.CreateEmbeddingResponse & { | ||
| _request_id?: string | null | undefined; | ||
| _request_id?: string | null; | ||
| }>; | ||
@@ -117,0 +117,0 @@ } |
+1
-1
@@ -85,3 +85,3 @@ const require_client = require("./utils/client.cjs"); | ||
| super(fields ?? {}); | ||
| this._addVersion("@langchain/openai", "1.4.1"); | ||
| this._addVersion("@langchain/openai", "1.4.2"); | ||
| this.openAIApiKey = fields?.apiKey ?? fields?.openAIApiKey ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("OPENAI_API_KEY"); | ||
@@ -88,0 +88,0 @@ this.apiKey = this.openAIApiKey; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llms.cjs","names":["BaseLLM","GenerationChunk","wrapOpenAIClientError","getEndpoint","getHeadersWithUserAgent","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAIApiKey,\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: OpenAIApiKey;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"llms.cjs","names":["BaseLLM","GenerationChunk","wrapOpenAIClientError","getEndpoint","getHeadersWithUserAgent","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAIApiKey,\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: OpenAIApiKey;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // oxlint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // oxlint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,IAAa,SAAb,cACUA,qCAAAA,QAEV;CACE,OAAO,UAAU;AACf,SAAO;;CAGT,IAAI,WAAW;AACb,SAAO,CAAC,GAAG,MAAM,UAAU,UAAU;;CAGvC,kBAAkB;CAElB,IAAI,aAAoD;AACtD,SAAO;GACL,cAAc;GACd,QAAQ;GACR,cAAc;GACf;;CAGH,IAAI,aAAqC;AACvC,SAAO;GACL,WAAW;GACX,cAAc;GACd,QAAQ;GACT;;CAGH;CAEA;CAEA;CAEA;CAEA;CAEA,IAAI;CAEJ;CAEA;CAEA,QAAQ;;CAGR;CAEA;CAEA,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA;CAEA,YACE,QAIA;AACA,QAAM,UAAU,EAAE,CAAC;AACnB,OAAK,YAAY,qBAAA,QAAqC;AAEtD,OAAK,eACH,QAAQ,UACR,QAAQ,iBAAA,GAAA,0BAAA,wBACe,iBAAiB;AAC1C,OAAK,SAAS,KAAK;AAEnB,OAAK,eACH,QAAQ,eAAe,iBAAA,GAAA,0BAAA,wBACA,sBAAsB;AAE/C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OACG,KAAK,OAAO,WAAW,gBAAgB,IACtC,KAAK,OAAO,WAAW,QAAQ,IAC/B,KAAK,OAAO,WAAW,KAAK,KAC9B,CAAC,KAAK,OAAO,SAAS,YAAY,CAElC,OAAM,IAAI,MACR;GACE,8BAA8B,KAAK,MAAM;GACzC;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,KAAK,KAAK,CACb;AAEH,OAAK,YAAY,KAAK;AACtB,OAAK,cAAc,QAAQ,eAAe,EAAE;AAC5C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,UAAU,QAAQ;AAEvB,OAAK,cAAc,QAAQ,eAAe,KAAK;AAC/C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,mBAAmB,QAAQ,oBAAoB,KAAK;AACzD,OAAK,kBAAkB,QAAQ,mBAAmB,KAAK;AACvD,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,SAAS,QAAQ,UAAU,KAAK;AACrC,OAAK,YAAY,QAAQ;AACzB,OAAK,OAAO,QAAQ,iBAAiB,QAAQ;AAC7C,OAAK,gBAAgB,KAAK;AAC1B,OAAK,OAAO,QAAQ;AAEpB,OAAK,YAAY,QAAQ,aAAa;AAEtC,MAAI,KAAK,aAAa,KAAK,UAAU,KAAK,SAAS,EACjD,OAAM,IAAI,MAAM,wCAAwC;AAG1D,OAAK,eAAe;GAClB,QAAQ,KAAK;GACb,cAAc,KAAK;GACnB,yBAAyB;GACzB,GAAG,QAAQ;GACZ;;;;;CAMH,iBACE,SACqD;AACrD,SAAO;GACL,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,OAAO,KAAK;GACZ,mBAAmB,KAAK;GACxB,kBAAkB,KAAK;GACvB,GAAG,KAAK;GACR,SAAS,KAAK;GACd,YAAY,KAAK;GACjB,MAAM,SAAS,QAAQ,KAAK;GAC5B,MAAM,KAAK;GACX,QAAQ,KAAK;GACb,GAAG,KAAK;GACT;;;CAIH,qBAEkB;AAChB,SAAO;GACL,YAAY,KAAK;GACjB,GAAG,KAAK,kBAAkB;GAC1B,GAAG,KAAK;GACT;;;;;CAMH,oBAEkB;AAChB,SAAO,KAAK,oBAAoB;;;;;;;;;;;;;;;;;;CAmBlC,MAAM,UACJ,SACA,SACA,YACoB;EACpB,MAAM,cAAA,GAAA,kCAAA,YAAwB,SAAS,KAAK,UAAU;EACtD,MAAM,UAA2C,EAAE;EACnD,MAAM,aAAyB,EAAE;EAEjC,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAE7C,MAAI,OAAO,eAAe,IAAI;AAC5B,OAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MACR,yDACD;AAEH,UAAO,aAAa,OAAA,GAAA,qCAAA,oBAAyB;IAC3C,QAAQ,QAAQ;IAEhB,WAAW,KAAK;IACjB,CAAC;;AAGJ,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;GAC7C,MAAM,OAAO,OAAO,SAChB,OAAO,YAAY;IACjB,MAAM,UAA2C,EAAE;IACnD,IAAI;IACJ,MAAM,SAAS,MAAM,KAAK,oBACxB;KACE,GAAG;KACH,QAAQ;KACR,QAAQ,WAAW;KACpB,EACD,QACD;AACD,eAAW,MAAM,WAAW,QAAQ;AAElC,SAAI,CAAC,SACH,YAAW;MACT,IAAI,QAAQ;MACZ,QAAQ,QAAQ;MAChB,SAAS,QAAQ;MACjB,OAAO,QAAQ;MAChB;AAIH,UAAK,MAAM,QAAQ,QAAQ,SAAS;AAClC,UAAI,CAAC,QAAQ,KAAK,OAChB,SAAQ,KAAK,SAAS;WACjB;OACL,MAAM,SAAS,QAAQ,KAAK;AAC5B,cAAO,QAAQ,KAAK;AACpB,cAAO,gBAAgB,KAAK;AAC5B,cAAO,WAAW,KAAK;;AAGpB,kBAAY,kBAAkB,KAAK,MAAM;OAC5C,QAAQ,KAAK,MAAM,KAAK,QAAQ,KAAK,EAAE;OACvC,YAAY,KAAK,QAAQ,KAAK;OAC/B,CAAC;;;AAGN,QAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,MAAM,aAAa;AAE/B,WAAO;KAAE,GAAG;KAAU;KAAS;OAC7B,GACJ,MAAM,KAAK,oBACT;IACE,GAAG;IACH,QAAQ;IACR,QAAQ,WAAW;IACpB,EACD;IACE,QAAQ,QAAQ;IAChB,GAAG,QAAQ;IACZ,CACF;AAEL,WAAQ,KAAK,GAAG,KAAK,QAAQ;GAC7B,MAAM,EACJ,mBAAmB,kBACnB,eAAe,cACf,cAAc,gBACZ,KAAK,QACL,KAAK,QACL;IACE,mBAAmB,KAAA;IACnB,eAAe,KAAA;IACf,cAAc,KAAA;IACf;AAEL,OAAI,iBACF,YAAW,oBACR,WAAW,oBAAoB,KAAK;AAGzC,OAAI,aACF,YAAW,gBAAgB,WAAW,gBAAgB,KAAK;AAG7D,OAAI,YACF,YAAW,eAAe,WAAW,eAAe,KAAK;;AAa7D,SAAO;GACL,cAAA,GAAA,kCAAA,YAV6B,SAAS,KAAK,EAAE,CAAC,KAAK,kBACnD,cAAc,KAAK,YAAY;IAC7B,MAAM,OAAO,QAAQ;IACrB,gBAAgB;KACd,cAAc,OAAO;KACrB,UAAU,OAAO;KAClB;IACF,EAAE,CACJ;GAGC,WAAW,EAAE,YAAY;GAC1B;;CAIH,OAAO,sBACL,OACA,SACA,YACiC;EACjC,MAAM,SAAS;GACb,GAAG,KAAK,iBAAiB,QAAQ;GACjC,QAAQ;GACR,QAAQ;GACT;EACD,MAAM,SAAS,MAAM,KAAK,oBAAoB,QAAQ,QAAQ;AAC9D,aAAW,MAAM,QAAQ,QAAQ;GAC/B,MAAM,SAAS,MAAM,QAAQ;AAC7B,OAAI,CAAC,OACH;GAEF,MAAM,QAAQ,IAAIC,wBAAAA,gBAAgB;IAChC,MAAM,OAAO;IACb,gBAAgB,EACd,cAAc,OAAO,eACtB;IACF,CAAC;AACF,SAAM;AAED,eAAY,kBAAkB,MAAM,QAAQ,GAAG;;AAEtD,MAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,MAAM,aAAa;;CAoBjC,MAAM,oBACJ,SAGA,SAGA;EACA,MAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AACtD,SAAO,KAAK,OAAO,KAAK,YAAY;AAClC,OAAI;AAKF,WAJY,MAAM,KAAK,OAAO,YAAY,OACxC,SACA,eACD;YAEM,GAAG;AAEV,UADcC,eAAAA,sBAAsB,EAAE;;IAGxC;;;;;;;;CASJ,kBACE,SAC0B;AAC1B,MAAI,CAAC,KAAK,QAAQ;GAKhB,MAAM,WAAWC,cAAAA,YAJkC,EACjD,SAAS,KAAK,aAAa,SAC5B,CAEiD;GAElD,MAAM,SAAS;IACb,GAAG,KAAK;IACR,SAAS;IACT,SAAS,KAAK;IACd,YAAY;IACb;AAED,OAAI,CAAC,OAAO,QACV,QAAO,OAAO;AAGhB,UAAO,iBAAiBC,cAAAA,wBAAwB,OAAO,eAAe;AAEtE,QAAK,SAAS,IAAIC,OAAAA,OAAa,OAAO;;AAMxC,SAJuB;GACrB,GAAG,KAAK;GACR,GAAG;GACJ;;CAIH,WAAW;AACT,SAAO"} |
+1
-1
@@ -85,3 +85,3 @@ import { wrapOpenAIClientError } from "./utils/client.js"; | ||
| super(fields ?? {}); | ||
| this._addVersion("@langchain/openai", "1.4.1"); | ||
| this._addVersion("@langchain/openai", "1.4.2"); | ||
| this.openAIApiKey = fields?.apiKey ?? fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); | ||
@@ -88,0 +88,0 @@ this.apiKey = this.openAIApiKey; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llms.js","names":["OpenAI","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAIApiKey,\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: OpenAIApiKey;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,IAAaA,WAAb,cACU,QAEV;CACE,OAAO,UAAU;AACf,SAAO;;CAGT,IAAI,WAAW;AACb,SAAO,CAAC,GAAG,MAAM,UAAU,UAAU;;CAGvC,kBAAkB;CAElB,IAAI,aAAoD;AACtD,SAAO;GACL,cAAc;GACd,QAAQ;GACR,cAAc;GACf;;CAGH,IAAI,aAAqC;AACvC,SAAO;GACL,WAAW;GACX,cAAc;GACd,QAAQ;GACT;;CAGH;CAEA;CAEA;CAEA;CAEA;CAEA,IAAI;CAEJ;CAEA;CAEA,QAAQ;;CAGR;CAEA;CAEA,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA;CAEA,YACE,QAIA;AACA,QAAM,UAAU,EAAE,CAAC;AACnB,OAAK,YAAY,qBAAA,QAAqC;AAEtD,OAAK,eACH,QAAQ,UACR,QAAQ,gBACR,uBAAuB,iBAAiB;AAC1C,OAAK,SAAS,KAAK;AAEnB,OAAK,eACH,QAAQ,eAAe,gBACvB,uBAAuB,sBAAsB;AAE/C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OACG,KAAK,OAAO,WAAW,gBAAgB,IACtC,KAAK,OAAO,WAAW,QAAQ,IAC/B,KAAK,OAAO,WAAW,KAAK,KAC9B,CAAC,KAAK,OAAO,SAAS,YAAY,CAElC,OAAM,IAAI,MACR;GACE,8BAA8B,KAAK,MAAM;GACzC;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,KAAK,KAAK,CACb;AAEH,OAAK,YAAY,KAAK;AACtB,OAAK,cAAc,QAAQ,eAAe,EAAE;AAC5C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,UAAU,QAAQ;AAEvB,OAAK,cAAc,QAAQ,eAAe,KAAK;AAC/C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,mBAAmB,QAAQ,oBAAoB,KAAK;AACzD,OAAK,kBAAkB,QAAQ,mBAAmB,KAAK;AACvD,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,SAAS,QAAQ,UAAU,KAAK;AACrC,OAAK,YAAY,QAAQ;AACzB,OAAK,OAAO,QAAQ,iBAAiB,QAAQ;AAC7C,OAAK,gBAAgB,KAAK;AAC1B,OAAK,OAAO,QAAQ;AAEpB,OAAK,YAAY,QAAQ,aAAa;AAEtC,MAAI,KAAK,aAAa,KAAK,UAAU,KAAK,SAAS,EACjD,OAAM,IAAI,MAAM,wCAAwC;AAG1D,OAAK,eAAe;GAClB,QAAQ,KAAK;GACb,cAAc,KAAK;GACnB,yBAAyB;GACzB,GAAG,QAAQ;GACZ;;;;;CAMH,iBACE,SACqD;AACrD,SAAO;GACL,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,OAAO,KAAK;GACZ,mBAAmB,KAAK;GACxB,kBAAkB,KAAK;GACvB,GAAG,KAAK;GACR,SAAS,KAAK;GACd,YAAY,KAAK;GACjB,MAAM,SAAS,QAAQ,KAAK;GAC5B,MAAM,KAAK;GACX,QAAQ,KAAK;GACb,GAAG,KAAK;GACT;;;CAIH,qBAEkB;AAChB,SAAO;GACL,YAAY,KAAK;GACjB,GAAG,KAAK,kBAAkB;GAC1B,GAAG,KAAK;GACT;;;;;CAMH,oBAEkB;AAChB,SAAO,KAAK,oBAAoB;;;;;;;;;;;;;;;;;;CAmBlC,MAAM,UACJ,SACA,SACA,YACoB;EACpB,MAAM,aAAa,WAAW,SAAS,KAAK,UAAU;EACtD,MAAM,UAA2C,EAAE;EACnD,MAAM,aAAyB,EAAE;EAEjC,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAE7C,MAAI,OAAO,eAAe,IAAI;AAC5B,OAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MACR,yDACD;AAEH,UAAO,aAAa,MAAM,mBAAmB;IAC3C,QAAQ,QAAQ;IAEhB,WAAW,KAAK;IACjB,CAAC;;AAGJ,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;GAC7C,MAAM,OAAO,OAAO,SAChB,OAAO,YAAY;IACjB,MAAM,UAA2C,EAAE;IACnD,IAAI;IACJ,MAAM,SAAS,MAAM,KAAK,oBACxB;KACE,GAAG;KACH,QAAQ;KACR,QAAQ,WAAW;KACpB,EACD,QACD;AACD,eAAW,MAAM,WAAW,QAAQ;AAElC,SAAI,CAAC,SACH,YAAW;MACT,IAAI,QAAQ;MACZ,QAAQ,QAAQ;MAChB,SAAS,QAAQ;MACjB,OAAO,QAAQ;MAChB;AAIH,UAAK,MAAM,QAAQ,QAAQ,SAAS;AAClC,UAAI,CAAC,QAAQ,KAAK,OAChB,SAAQ,KAAK,SAAS;WACjB;OACL,MAAM,SAAS,QAAQ,KAAK;AAC5B,cAAO,QAAQ,KAAK;AACpB,cAAO,gBAAgB,KAAK;AAC5B,cAAO,WAAW,KAAK;;AAGpB,kBAAY,kBAAkB,KAAK,MAAM;OAC5C,QAAQ,KAAK,MAAM,KAAK,QAAQ,KAAK,EAAE;OACvC,YAAY,KAAK,QAAQ,KAAK;OAC/B,CAAC;;;AAGN,QAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,MAAM,aAAa;AAE/B,WAAO;KAAE,GAAG;KAAU;KAAS;OAC7B,GACJ,MAAM,KAAK,oBACT;IACE,GAAG;IACH,QAAQ;IACR,QAAQ,WAAW;IACpB,EACD;IACE,QAAQ,QAAQ;IAChB,GAAG,QAAQ;IACZ,CACF;AAEL,WAAQ,KAAK,GAAG,KAAK,QAAQ;GAC7B,MAAM,EACJ,mBAAmB,kBACnB,eAAe,cACf,cAAc,gBACZ,KAAK,QACL,KAAK,QACL;IACE,mBAAmB,KAAA;IACnB,eAAe,KAAA;IACf,cAAc,KAAA;IACf;AAEL,OAAI,iBACF,YAAW,oBACR,WAAW,oBAAoB,KAAK;AAGzC,OAAI,aACF,YAAW,gBAAgB,WAAW,gBAAgB,KAAK;AAG7D,OAAI,YACF,YAAW,eAAe,WAAW,eAAe,KAAK;;AAa7D,SAAO;GACL,aAVkB,WAAW,SAAS,KAAK,EAAE,CAAC,KAAK,kBACnD,cAAc,KAAK,YAAY;IAC7B,MAAM,OAAO,QAAQ;IACrB,gBAAgB;KACd,cAAc,OAAO;KACrB,UAAU,OAAO;KAClB;IACF,EAAE,CACJ;GAGC,WAAW,EAAE,YAAY;GAC1B;;CAIH,OAAO,sBACL,OACA,SACA,YACiC;EACjC,MAAM,SAAS;GACb,GAAG,KAAK,iBAAiB,QAAQ;GACjC,QAAQ;GACR,QAAQ;GACT;EACD,MAAM,SAAS,MAAM,KAAK,oBAAoB,QAAQ,QAAQ;AAC9D,aAAW,MAAM,QAAQ,QAAQ;GAC/B,MAAM,SAAS,MAAM,QAAQ;AAC7B,OAAI,CAAC,OACH;GAEF,MAAM,QAAQ,IAAI,gBAAgB;IAChC,MAAM,OAAO;IACb,gBAAgB,EACd,cAAc,OAAO,eACtB;IACF,CAAC;AACF,SAAM;AAED,eAAY,kBAAkB,MAAM,QAAQ,GAAG;;AAEtD,MAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,MAAM,aAAa;;CAoBjC,MAAM,oBACJ,SAGA,SAGA;EACA,MAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AACtD,SAAO,KAAK,OAAO,KAAK,YAAY;AAClC,OAAI;AAKF,WAJY,MAAM,KAAK,OAAO,YAAY,OACxC,SACA,eACD;YAEM,GAAG;AAEV,UADc,sBAAsB,EAAE;;IAGxC;;;;;;;;CASJ,kBACE,SAC0B;AAC1B,MAAI,CAAC,KAAK,QAAQ;GAKhB,MAAM,WAAW,YAJkC,EACjD,SAAS,KAAK,aAAa,SAC5B,CAEiD;GAElD,MAAM,SAAS;IACb,GAAG,KAAK;IACR,SAAS;IACT,SAAS,KAAK;IACd,YAAY;IACb;AAED,OAAI,CAAC,OAAO,QACV,QAAO,OAAO;AAGhB,UAAO,iBAAiB,wBAAwB,OAAO,eAAe;AAEtE,QAAK,SAAS,IAAIC,OAAa,OAAO;;AAMxC,SAJuB;GACrB,GAAG,KAAK;GACR,GAAG;GACJ;;CAIH,WAAW;AACT,SAAO"} | ||
| {"version":3,"file":"llms.js","names":["OpenAI","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAIApiKey,\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: OpenAIApiKey;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n this._addVersion(\"@langchain/openai\", __PKG_VERSION__);\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // oxlint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // oxlint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":"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"} |
@@ -16,2 +16,14 @@ import { OpenAI } from "openai"; | ||
| type ApplyPatchOperation = NonNullable<OpenAI.Responses.ResponseApplyPatchToolCall["operation"]>; | ||
| declare const ApplyPatchOperationSchema: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"create_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"update_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"delete_file">; | ||
| path: z.ZodString; | ||
| }, z.core.$strip>]>; | ||
| /** | ||
@@ -134,16 +146,5 @@ * Options for the Apply Patch tool. | ||
| */ | ||
| declare function applyPatch(options: ApplyPatchOptions): DynamicStructuredTool<z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"create_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"update_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"delete_file">; | ||
| path: z.ZodString; | ||
| }, z.core.$strip>]>, ApplyPatchOperation, unknown, string, unknown, string>; | ||
| declare function applyPatch(options: ApplyPatchOptions): DynamicStructuredTool<typeof ApplyPatchOperationSchema, ApplyPatchOperation, unknown, string>; | ||
| //#endregion | ||
| export { ApplyPatchCreateFileOperation, ApplyPatchDeleteFileOperation, ApplyPatchOperation, ApplyPatchOptions, ApplyPatchTool, ApplyPatchUpdateFileOperation, applyPatch }; | ||
| //# sourceMappingURL=applyPatch.d.cts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"applyPatch.d.cts","names":[],"sources":["../../src/tools/applyPatch.ts"],"mappings":";;;;;;;AAOA;KAAY,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;;;;KAKxC,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,0BAAA;;;;UA+BR,iBAAA;EA/BkC;;AA+BnD;;;;;;;;;;AAuCA;;;;;;;;;AA+EA;;;;;;;;;;;EArFE,OAAA,GAAU,SAAA,EAAW,mBAAA,cAAiC,OAAA;AAAA;;;;KAM5C,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+EpC,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAiB,qBAAA,CAAA,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"applyPatch.d.cts","names":[],"sources":["../../src/tools/applyPatch.ts"],"mappings":";;;;;;;AAOA;KAAY,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;;;;KAKxC,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,0BAAA;AAAA,cAsBZ,yBAAA,EAAyB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;UASrB,iBAAA;EA/BkC;;AAsBnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CE,OAAA,GAAU,SAAA,EAAW,mBAAA,cAAiC,OAAA;AAAA;;;;KAM5C,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAvCpD;;;;;;;;;;AAuCA;;;;;;;;;AA+EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAed,qBAAA,QACX,yBAAA,EACP,mBAAA"} |
@@ -16,2 +16,14 @@ import { OpenAI } from "openai"; | ||
| type ApplyPatchOperation = NonNullable<OpenAI.Responses.ResponseApplyPatchToolCall["operation"]>; | ||
| declare const ApplyPatchOperationSchema: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"create_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"update_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"delete_file">; | ||
| path: z.ZodString; | ||
| }, z.core.$strip>]>; | ||
| /** | ||
@@ -134,16 +146,5 @@ * Options for the Apply Patch tool. | ||
| */ | ||
| declare function applyPatch(options: ApplyPatchOptions): DynamicStructuredTool<z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"create_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"update_file">; | ||
| path: z.ZodString; | ||
| diff: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"delete_file">; | ||
| path: z.ZodString; | ||
| }, z.core.$strip>]>, ApplyPatchOperation, unknown, string, unknown, string>; | ||
| declare function applyPatch(options: ApplyPatchOptions): DynamicStructuredTool<typeof ApplyPatchOperationSchema, ApplyPatchOperation, unknown, string>; | ||
| //#endregion | ||
| export { ApplyPatchCreateFileOperation, ApplyPatchDeleteFileOperation, ApplyPatchOperation, ApplyPatchOptions, ApplyPatchTool, ApplyPatchUpdateFileOperation, applyPatch }; | ||
| //# sourceMappingURL=applyPatch.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"applyPatch.d.ts","names":[],"sources":["../../src/tools/applyPatch.ts"],"mappings":";;;;;;;AAOA;KAAY,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;;;;KAKxC,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,0BAAA;;;;UA+BR,iBAAA;EA/BkC;;AA+BnD;;;;;;;;;;AAuCA;;;;;;;;;AA+EA;;;;;;;;;;;EArFE,OAAA,GAAU,SAAA,EAAW,mBAAA,cAAiC,OAAA;AAAA;;;;KAM5C,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+EpC,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAiB,qBAAA,CAAA,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"applyPatch.d.ts","names":[],"sources":["../../src/tools/applyPatch.ts"],"mappings":";;;;;;;AAOA;KAAY,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;AAAA,KACxC,6BAAA,GACV,MAAA,CAAa,SAAA,CAAU,0BAAA,CAA2B,UAAA;;;;KAKxC,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,0BAAA;AAAA,cAsBZ,yBAAA,EAAyB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;UASrB,iBAAA;EA/BkC;;AAsBnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CE,OAAA,GAAU,SAAA,EAAW,mBAAA,cAAiC,OAAA;AAAA;;;;KAM5C,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAvCpD;;;;;;;;;;AAuCA;;;;;;;;;AA+EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAed,qBAAA,QACX,yBAAA,EACP,mBAAA"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"computerUse.cjs","names":["z","ToolMessage"],"sources":["../../src/tools/computerUse.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from \"zod/v4\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { tool, type DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { type ToolRuntime } from \"@langchain/core/tools\";\nimport {\n ToolMessage,\n type AIMessage,\n type BaseMessage,\n} from \"@langchain/core/messages\";\n\n/**\n * The type of computer environment to control.\n */\nexport type ComputerUseEnvironment =\n | \"browser\"\n | \"mac\"\n | \"windows\"\n | \"linux\"\n | \"ubuntu\";\n\n/**\n * Re-export action types from OpenAI SDK for convenience.\n */\nexport type ComputerUseClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Click;\nexport type ComputerUseDoubleClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.DoubleClick;\nexport type ComputerUseDragAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Drag;\nexport type ComputerUseKeypressAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Keypress;\nexport type ComputerUseMoveAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Move;\nexport type ComputerUseScreenshotAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Screenshot;\nexport type ComputerUseScrollAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Scroll;\nexport type ComputerUseTypeAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Type;\nexport type ComputerUseWaitAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Wait;\n\n/**\n * Union type of all computer use actions from OpenAI SDK.\n */\nexport type ComputerUseAction =\n OpenAIClient.Responses.ResponseComputerToolCall[\"action\"];\n\n// Zod schemas for computer use actions\nconst ComputerUseScreenshotActionSchema = z.object({\n type: z.literal(\"screenshot\"),\n});\n\nconst ComputerUseClickActionSchema = z.object({\n type: z.literal(\"click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDoubleClickActionSchema = z.object({\n type: z.literal(\"double_click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDragActionSchema = z.object({\n type: z.literal(\"drag\"),\n path: z.array(z.object({ x: z.number(), y: z.number() })),\n});\n\nconst ComputerUseKeypressActionSchema = z.object({\n type: z.literal(\"keypress\"),\n keys: z.array(z.string()),\n});\n\nconst ComputerUseMoveActionSchema = z.object({\n type: z.literal(\"move\"),\n x: z.number(),\n y: z.number(),\n});\n\nconst ComputerUseScrollActionSchema = z.object({\n type: z.literal(\"scroll\"),\n x: z.number(),\n y: z.number(),\n scroll_x: z.number(),\n scroll_y: z.number(),\n});\n\nconst ComputerUseTypeActionSchema = z.object({\n type: z.literal(\"type\"),\n text: z.string(),\n});\n\nconst ComputerUseWaitActionSchema = z.object({\n type: z.literal(\"wait\"),\n duration: z.number().optional(),\n});\n\n// Union schema for individual action types\nconst ComputerUseActionUnionSchema = z.union([\n ComputerUseScreenshotActionSchema,\n ComputerUseClickActionSchema,\n ComputerUseDoubleClickActionSchema,\n ComputerUseDragActionSchema,\n ComputerUseKeypressActionSchema,\n ComputerUseMoveActionSchema,\n ComputerUseScrollActionSchema,\n ComputerUseTypeActionSchema,\n ComputerUseWaitActionSchema,\n]);\n\n// Schema for the input structure received from parseComputerCall\n// The action is wrapped in an `action` property: { action: { type: 'screenshot' } }\nexport const ComputerUseActionSchema = z.object({\n action: ComputerUseActionUnionSchema,\n});\n\n// TypeScript types derived from Zod schemas\nexport type ComputerUseScreenshotActionType = z.infer<\n typeof ComputerUseScreenshotActionSchema\n>;\nexport type ComputerUseClickActionType = z.infer<\n typeof ComputerUseClickActionSchema\n>;\nexport type ComputerUseDoubleClickActionType = z.infer<\n typeof ComputerUseDoubleClickActionSchema\n>;\nexport type ComputerUseDragActionType = z.infer<\n typeof ComputerUseDragActionSchema\n>;\nexport type ComputerUseKeypressActionType = z.infer<\n typeof ComputerUseKeypressActionSchema\n>;\nexport type ComputerUseMoveActionType = z.infer<\n typeof ComputerUseMoveActionSchema\n>;\nexport type ComputerUseScrollActionType = z.infer<\n typeof ComputerUseScrollActionSchema\n>;\nexport type ComputerUseTypeActionType = z.infer<\n typeof ComputerUseTypeActionSchema\n>;\nexport type ComputerUseWaitActionType = z.infer<\n typeof ComputerUseWaitActionSchema\n>;\n\n/**\n * Input structure for the Computer Use tool.\n * The action is wrapped in an `action` property.\n */\nexport interface ComputerUseInput {\n action: ComputerUseAction;\n}\n\nexport type ComputerUseReturnType =\n | string\n | Promise<string>\n | ToolMessage<any>\n | Promise<ToolMessage<any>>;\n\n/**\n * Options for the Computer Use tool.\n */\nexport interface ComputerUseOptions {\n /**\n * The width of the computer display in pixels.\n */\n displayWidth: number;\n\n /**\n * The height of the computer display in pixels.\n */\n displayHeight: number;\n\n /**\n * The type of computer environment to control.\n * - `browser`: Browser automation (recommended for most use cases)\n * - `mac`: macOS environment\n * - `windows`: Windows environment\n * - `linux`: Linux environment\n * - `ubuntu`: Ubuntu environment\n */\n environment: ComputerUseEnvironment;\n\n /**\n * Execute function that handles computer action execution.\n * This function receives the action input and should return a base64-encoded\n * screenshot of the result.\n */\n execute: (\n action: ComputerUseAction,\n runtime: ToolRuntime<any, any>\n ) => ComputerUseReturnType;\n}\n\n/**\n * OpenAI Computer Use tool type for the Responses API.\n */\nexport type ComputerUseTool = OpenAIClient.Responses.ComputerUsePreviewTool;\n\nconst TOOL_NAME = \"computer_use\";\n\n/**\n * Creates a Computer Use tool that allows models to control computer interfaces\n * and perform tasks by simulating mouse clicks, keyboard input, scrolling, and more.\n *\n * **Computer Use** is a practical application of OpenAI's Computer-Using Agent (CUA)\n * model (`computer-use-preview`), which combines vision capabilities with advanced\n * reasoning to simulate controlling computer interfaces.\n *\n * **How it works**:\n * The tool operates in a continuous loop:\n * 1. Model sends computer actions (click, type, scroll, etc.)\n * 2. Your code executes these actions in a controlled environment\n * 3. You capture a screenshot of the result\n * 4. Send the screenshot back to the model\n * 5. Repeat until the task is complete\n *\n * **Important**: Computer use is in beta and requires careful consideration:\n * - Use in sandboxed environments only\n * - Do not use for high-stakes or authenticated tasks\n * - Always implement human-in-the-loop for important decisions\n * - Handle safety checks appropriately\n *\n * @see {@link https://platform.openai.com/docs/guides/tools-computer-use | OpenAI Computer Use Documentation}\n *\n * @param options - Configuration options for the Computer Use tool\n * @returns A Computer Use tool that can be passed to `bindTools`\n *\n * @example\n * ```typescript\n * import { ChatOpenAI, tools } from \"@langchain/openai\";\n *\n * const model = new ChatOpenAI({ model: \"computer-use-preview\" });\n *\n * // With execute callback for automatic action handling\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * execute: async (action) => {\n * if (action.type === \"screenshot\") {\n * return captureScreenshot();\n * }\n * if (action.type === \"click\") {\n * await page.mouse.click(action.x, action.y, { button: action.button });\n * return captureScreenshot();\n * }\n * if (action.type === \"type\") {\n * await page.keyboard.type(action.text);\n * return captureScreenshot();\n * }\n * // Handle other actions...\n * return captureScreenshot();\n * },\n * });\n *\n * const llmWithComputer = model.bindTools([computer]);\n * const response = await llmWithComputer.invoke(\n * \"Check the latest news on bing.com\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Without execute callback (manual action handling)\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * });\n *\n * const response = await model.invoke(\"Check the news\", {\n * tools: [computer],\n * });\n *\n * // Access the computer call from the response\n * const computerCall = response.additional_kwargs.tool_outputs?.find(\n * (output) => output.type === \"computer_call\"\n * );\n * if (computerCall) {\n * console.log(\"Action to execute:\", computerCall.action);\n * // Execute the action manually, then send back a screenshot\n * }\n * ```\n *\n * @example\n * ```typescript\n * // For macOS desktop automation with Docker\n * const computer = tools.computerUse({\n * displayWidth: 1920,\n * displayHeight: 1080,\n * environment: \"mac\",\n * execute: async (action) => {\n * if (action.type === \"click\") {\n * await dockerExec(\n * `DISPLAY=:99 xdotool mousemove ${action.x} ${action.y} click 1`,\n * containerName\n * );\n * }\n * // Capture screenshot from container\n * return await getDockerScreenshot(containerName);\n * },\n * });\n * ```\n *\n * @remarks\n * - Only available through the Responses API (not Chat Completions)\n * - Requires `computer-use-preview` model\n * - Actions include: click, double_click, drag, keypress, move, screenshot, scroll, type, wait\n * - Safety checks may be returned that require acknowledgment before proceeding\n * - Use `truncation: \"auto\"` parameter when making requests\n * - Recommended to use with `reasoning.summary` for debugging\n */\nexport function computerUse(options: ComputerUseOptions) {\n const computerTool = tool(\n async (\n input: ComputerUseInput,\n runtime: ToolRuntime<{ messages: BaseMessage[] }>\n ) => {\n /**\n * get computer_use call id from runtime\n */\n const aiMessage = runtime.state?.messages.at(-1) as AIMessage | undefined;\n const computerToolCall = aiMessage?.tool_calls?.find(\n (tc) => tc.name === \"computer_use\"\n );\n const computerToolCallId = computerToolCall?.id;\n if (!computerToolCallId) {\n throw new Error(\"Computer use call id not found\");\n }\n\n const result = await options.execute(input.action, runtime);\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n if (typeof result === \"string\") {\n return new ToolMessage({\n content: result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n },\n });\n }\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n return new ToolMessage({\n ...result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n ...result.additional_kwargs,\n },\n });\n },\n {\n name: TOOL_NAME,\n description:\n \"Control a computer interface by executing mouse clicks, keyboard input, scrolling, and other actions.\",\n schema: ComputerUseActionSchema,\n }\n );\n\n computerTool.extras = {\n ...(computerTool.extras ?? {}),\n providerToolDefinition: {\n type: \"computer_use_preview\",\n display_width: options.displayWidth,\n display_height: options.displayHeight,\n environment: options.environment,\n } satisfies ComputerUseTool,\n };\n\n /**\n * return as typed {@link DynamicStructuredTool} so we don't get any type\n * errors like \"can't export tool without reference\"\n */\n return computerTool as DynamicStructuredTool<\n typeof ComputerUseActionSchema,\n ComputerUseInput,\n unknown,\n ComputerUseReturnType\n >;\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"computerUse.cjs","names":["z","ToolMessage"],"sources":["../../src/tools/computerUse.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport { z } from \"zod/v4\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { tool, type DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { type ToolRuntime } from \"@langchain/core/tools\";\nimport {\n ToolMessage,\n type AIMessage,\n type BaseMessage,\n} from \"@langchain/core/messages\";\n\n/**\n * The type of computer environment to control.\n */\nexport type ComputerUseEnvironment =\n | \"browser\"\n | \"mac\"\n | \"windows\"\n | \"linux\"\n | \"ubuntu\";\n\n/**\n * Re-export action types from OpenAI SDK for convenience.\n */\nexport type ComputerUseClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Click;\nexport type ComputerUseDoubleClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.DoubleClick;\nexport type ComputerUseDragAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Drag;\nexport type ComputerUseKeypressAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Keypress;\nexport type ComputerUseMoveAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Move;\nexport type ComputerUseScreenshotAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Screenshot;\nexport type ComputerUseScrollAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Scroll;\nexport type ComputerUseTypeAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Type;\nexport type ComputerUseWaitAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Wait;\n\n/**\n * Union type of all computer use actions from OpenAI SDK.\n */\nexport type ComputerUseAction =\n OpenAIClient.Responses.ResponseComputerToolCall[\"action\"];\n\n// Zod schemas for computer use actions\nconst ComputerUseScreenshotActionSchema = z.object({\n type: z.literal(\"screenshot\"),\n});\n\nconst ComputerUseClickActionSchema = z.object({\n type: z.literal(\"click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDoubleClickActionSchema = z.object({\n type: z.literal(\"double_click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDragActionSchema = z.object({\n type: z.literal(\"drag\"),\n path: z.array(z.object({ x: z.number(), y: z.number() })),\n});\n\nconst ComputerUseKeypressActionSchema = z.object({\n type: z.literal(\"keypress\"),\n keys: z.array(z.string()),\n});\n\nconst ComputerUseMoveActionSchema = z.object({\n type: z.literal(\"move\"),\n x: z.number(),\n y: z.number(),\n});\n\nconst ComputerUseScrollActionSchema = z.object({\n type: z.literal(\"scroll\"),\n x: z.number(),\n y: z.number(),\n scroll_x: z.number(),\n scroll_y: z.number(),\n});\n\nconst ComputerUseTypeActionSchema = z.object({\n type: z.literal(\"type\"),\n text: z.string(),\n});\n\nconst ComputerUseWaitActionSchema = z.object({\n type: z.literal(\"wait\"),\n duration: z.number().optional(),\n});\n\n// Union schema for individual action types\nconst ComputerUseActionUnionSchema = z.union([\n ComputerUseScreenshotActionSchema,\n ComputerUseClickActionSchema,\n ComputerUseDoubleClickActionSchema,\n ComputerUseDragActionSchema,\n ComputerUseKeypressActionSchema,\n ComputerUseMoveActionSchema,\n ComputerUseScrollActionSchema,\n ComputerUseTypeActionSchema,\n ComputerUseWaitActionSchema,\n]);\n\n// Schema for the input structure received from parseComputerCall\n// The action is wrapped in an `action` property: { action: { type: 'screenshot' } }\nexport const ComputerUseActionSchema = z.object({\n action: ComputerUseActionUnionSchema,\n});\n\n// TypeScript types derived from Zod schemas\nexport type ComputerUseScreenshotActionType = z.infer<\n typeof ComputerUseScreenshotActionSchema\n>;\nexport type ComputerUseClickActionType = z.infer<\n typeof ComputerUseClickActionSchema\n>;\nexport type ComputerUseDoubleClickActionType = z.infer<\n typeof ComputerUseDoubleClickActionSchema\n>;\nexport type ComputerUseDragActionType = z.infer<\n typeof ComputerUseDragActionSchema\n>;\nexport type ComputerUseKeypressActionType = z.infer<\n typeof ComputerUseKeypressActionSchema\n>;\nexport type ComputerUseMoveActionType = z.infer<\n typeof ComputerUseMoveActionSchema\n>;\nexport type ComputerUseScrollActionType = z.infer<\n typeof ComputerUseScrollActionSchema\n>;\nexport type ComputerUseTypeActionType = z.infer<\n typeof ComputerUseTypeActionSchema\n>;\nexport type ComputerUseWaitActionType = z.infer<\n typeof ComputerUseWaitActionSchema\n>;\n\n/**\n * Input structure for the Computer Use tool.\n * The action is wrapped in an `action` property.\n */\nexport interface ComputerUseInput {\n action: ComputerUseAction;\n}\n\nexport type ComputerUseReturnType =\n | string\n | Promise<string>\n | ToolMessage<any>\n | Promise<ToolMessage<any>>;\n\n/**\n * Options for the Computer Use tool.\n */\nexport interface ComputerUseOptions {\n /**\n * The width of the computer display in pixels.\n */\n displayWidth: number;\n\n /**\n * The height of the computer display in pixels.\n */\n displayHeight: number;\n\n /**\n * The type of computer environment to control.\n * - `browser`: Browser automation (recommended for most use cases)\n * - `mac`: macOS environment\n * - `windows`: Windows environment\n * - `linux`: Linux environment\n * - `ubuntu`: Ubuntu environment\n */\n environment: ComputerUseEnvironment;\n\n /**\n * Execute function that handles computer action execution.\n * This function receives the action input and should return a base64-encoded\n * screenshot of the result.\n */\n execute: (\n action: ComputerUseAction,\n runtime: ToolRuntime<any, any>\n ) => ComputerUseReturnType;\n}\n\n/**\n * OpenAI Computer Use tool type for the Responses API.\n */\nexport type ComputerUseTool = OpenAIClient.Responses.ComputerUsePreviewTool;\n\nconst TOOL_NAME = \"computer_use\";\n\n/**\n * Creates a Computer Use tool that allows models to control computer interfaces\n * and perform tasks by simulating mouse clicks, keyboard input, scrolling, and more.\n *\n * **Computer Use** is a practical application of OpenAI's Computer-Using Agent (CUA)\n * model (`computer-use-preview`), which combines vision capabilities with advanced\n * reasoning to simulate controlling computer interfaces.\n *\n * **How it works**:\n * The tool operates in a continuous loop:\n * 1. Model sends computer actions (click, type, scroll, etc.)\n * 2. Your code executes these actions in a controlled environment\n * 3. You capture a screenshot of the result\n * 4. Send the screenshot back to the model\n * 5. Repeat until the task is complete\n *\n * **Important**: Computer use is in beta and requires careful consideration:\n * - Use in sandboxed environments only\n * - Do not use for high-stakes or authenticated tasks\n * - Always implement human-in-the-loop for important decisions\n * - Handle safety checks appropriately\n *\n * @see {@link https://platform.openai.com/docs/guides/tools-computer-use | OpenAI Computer Use Documentation}\n *\n * @param options - Configuration options for the Computer Use tool\n * @returns A Computer Use tool that can be passed to `bindTools`\n *\n * @example\n * ```typescript\n * import { ChatOpenAI, tools } from \"@langchain/openai\";\n *\n * const model = new ChatOpenAI({ model: \"computer-use-preview\" });\n *\n * // With execute callback for automatic action handling\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * execute: async (action) => {\n * if (action.type === \"screenshot\") {\n * return captureScreenshot();\n * }\n * if (action.type === \"click\") {\n * await page.mouse.click(action.x, action.y, { button: action.button });\n * return captureScreenshot();\n * }\n * if (action.type === \"type\") {\n * await page.keyboard.type(action.text);\n * return captureScreenshot();\n * }\n * // Handle other actions...\n * return captureScreenshot();\n * },\n * });\n *\n * const llmWithComputer = model.bindTools([computer]);\n * const response = await llmWithComputer.invoke(\n * \"Check the latest news on bing.com\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Without execute callback (manual action handling)\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * });\n *\n * const response = await model.invoke(\"Check the news\", {\n * tools: [computer],\n * });\n *\n * // Access the computer call from the response\n * const computerCall = response.additional_kwargs.tool_outputs?.find(\n * (output) => output.type === \"computer_call\"\n * );\n * if (computerCall) {\n * console.log(\"Action to execute:\", computerCall.action);\n * // Execute the action manually, then send back a screenshot\n * }\n * ```\n *\n * @example\n * ```typescript\n * // For macOS desktop automation with Docker\n * const computer = tools.computerUse({\n * displayWidth: 1920,\n * displayHeight: 1080,\n * environment: \"mac\",\n * execute: async (action) => {\n * if (action.type === \"click\") {\n * await dockerExec(\n * `DISPLAY=:99 xdotool mousemove ${action.x} ${action.y} click 1`,\n * containerName\n * );\n * }\n * // Capture screenshot from container\n * return await getDockerScreenshot(containerName);\n * },\n * });\n * ```\n *\n * @remarks\n * - Only available through the Responses API (not Chat Completions)\n * - Requires `computer-use-preview` model\n * - Actions include: click, double_click, drag, keypress, move, screenshot, scroll, type, wait\n * - Safety checks may be returned that require acknowledgment before proceeding\n * - Use `truncation: \"auto\"` parameter when making requests\n * - Recommended to use with `reasoning.summary` for debugging\n */\nexport function computerUse(options: ComputerUseOptions) {\n const computerTool = tool(\n async (\n input: ComputerUseInput,\n runtime: ToolRuntime<{ messages: BaseMessage[] }>\n ) => {\n /**\n * get computer_use call id from runtime\n */\n const aiMessage = runtime.state?.messages.at(-1) as AIMessage | undefined;\n const computerToolCall = aiMessage?.tool_calls?.find(\n (tc) => tc.name === \"computer_use\"\n );\n const computerToolCallId = computerToolCall?.id;\n if (!computerToolCallId) {\n throw new Error(\"Computer use call id not found\");\n }\n\n const result = await options.execute(input.action, runtime);\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n if (typeof result === \"string\") {\n return new ToolMessage({\n content: result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n },\n });\n }\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n return new ToolMessage({\n ...result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n ...result.additional_kwargs,\n },\n });\n },\n {\n name: TOOL_NAME,\n description:\n \"Control a computer interface by executing mouse clicks, keyboard input, scrolling, and other actions.\",\n schema: ComputerUseActionSchema,\n }\n );\n\n computerTool.extras = {\n ...(computerTool.extras ?? {}),\n providerToolDefinition: {\n type: \"computer_use_preview\",\n display_width: options.displayWidth,\n display_height: options.displayHeight,\n environment: options.environment,\n } satisfies ComputerUseTool,\n };\n\n /**\n * return as typed {@link DynamicStructuredTool} so we don't get any type\n * errors like \"can't export tool without reference\"\n */\n return computerTool as DynamicStructuredTool<\n typeof ComputerUseActionSchema,\n ComputerUseInput,\n unknown,\n ComputerUseReturnType\n >;\n}\n"],"mappings":";;;;AAkDA,MAAM,oCAAoCA,OAAAA,EAAE,OAAO,EACjD,MAAMA,OAAAA,EAAE,QAAQ,aAAa,EAC9B,CAAC;AAEF,MAAM,+BAA+BA,OAAAA,EAAE,OAAO;CAC5C,MAAMA,OAAAA,EAAE,QAAQ,QAAQ;CACxB,GAAGA,OAAAA,EAAE,QAAQ;CACb,GAAGA,OAAAA,EAAE,QAAQ;CACb,QAAQA,OAAAA,EAAE,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAQ;EAAU,CAAC,CAAC,QAAQ,OAAO;CAC9E,CAAC;AAEF,MAAM,qCAAqCA,OAAAA,EAAE,OAAO;CAClD,MAAMA,OAAAA,EAAE,QAAQ,eAAe;CAC/B,GAAGA,OAAAA,EAAE,QAAQ;CACb,GAAGA,OAAAA,EAAE,QAAQ;CACb,QAAQA,OAAAA,EAAE,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAQ;EAAU,CAAC,CAAC,QAAQ,OAAO;CAC9E,CAAC;AAEF,MAAM,8BAA8BA,OAAAA,EAAE,OAAO;CAC3C,MAAMA,OAAAA,EAAE,QAAQ,OAAO;CACvB,MAAMA,OAAAA,EAAE,MAAMA,OAAAA,EAAE,OAAO;EAAE,GAAGA,OAAAA,EAAE,QAAQ;EAAE,GAAGA,OAAAA,EAAE,QAAQ;EAAE,CAAC,CAAC;CAC1D,CAAC;AAEF,MAAM,kCAAkCA,OAAAA,EAAE,OAAO;CAC/C,MAAMA,OAAAA,EAAE,QAAQ,WAAW;CAC3B,MAAMA,OAAAA,EAAE,MAAMA,OAAAA,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,8BAA8BA,OAAAA,EAAE,OAAO;CAC3C,MAAMA,OAAAA,EAAE,QAAQ,OAAO;CACvB,GAAGA,OAAAA,EAAE,QAAQ;CACb,GAAGA,OAAAA,EAAE,QAAQ;CACd,CAAC;AAEF,MAAM,gCAAgCA,OAAAA,EAAE,OAAO;CAC7C,MAAMA,OAAAA,EAAE,QAAQ,SAAS;CACzB,GAAGA,OAAAA,EAAE,QAAQ;CACb,GAAGA,OAAAA,EAAE,QAAQ;CACb,UAAUA,OAAAA,EAAE,QAAQ;CACpB,UAAUA,OAAAA,EAAE,QAAQ;CACrB,CAAC;AAEF,MAAM,8BAA8BA,OAAAA,EAAE,OAAO;CAC3C,MAAMA,OAAAA,EAAE,QAAQ,OAAO;CACvB,MAAMA,OAAAA,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,8BAA8BA,OAAAA,EAAE,OAAO;CAC3C,MAAMA,OAAAA,EAAE,QAAQ,OAAO;CACvB,UAAUA,OAAAA,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAGF,MAAM,+BAA+BA,OAAAA,EAAE,MAAM;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,MAAa,0BAA0BA,OAAAA,EAAE,OAAO,EAC9C,QAAQ,8BACT,CAAC;AAqFF,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkHlB,SAAgB,YAAY,SAA6B;CACvD,MAAM,gBAAA,GAAA,sBAAA,MACJ,OACE,OACA,YACG;EAQH,MAAM,uBAJY,QAAQ,OAAO,SAAS,GAAG,GAAG,GACZ,YAAY,MAC7C,OAAO,GAAG,SAAS,eACrB,GAC4C;AAC7C,MAAI,CAAC,mBACH,OAAM,IAAI,MAAM,iCAAiC;EAGnD,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ;;;;AAK3D,MAAI,OAAO,WAAW,SACpB,QAAO,IAAIC,yBAAAA,YAAY;GACrB,SAAS;GACT,cAAc;GACd,mBAAmB,EACjB,MAAM,wBACP;GACF,CAAC;;;;AAMJ,SAAO,IAAIA,yBAAAA,YAAY;GACrB,GAAG;GACH,cAAc;GACd,mBAAmB;IACjB,MAAM;IACN,GAAG,OAAO;IACX;GACF,CAAC;IAEJ;EACE,MAAM;EACN,aACE;EACF,QAAQ;EACT,CACF;AAED,cAAa,SAAS;EACpB,GAAI,aAAa,UAAU,EAAE;EAC7B,wBAAwB;GACtB,MAAM;GACN,eAAe,QAAQ;GACvB,gBAAgB,QAAQ;GACxB,aAAa,QAAQ;GACtB;EACF;;;;;AAMD,QAAO"} |
@@ -27,2 +27,54 @@ import { OpenAI } from "openai"; | ||
| type ComputerUseAction = OpenAI.Responses.ResponseComputerToolCall["action"]; | ||
| declare const ComputerUseActionSchema: z.ZodObject<{ | ||
| action: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"screenshot">; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"double_click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"drag">; | ||
| path: z.ZodArray<z.ZodObject<{ | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"keypress">; | ||
| keys: z.ZodArray<z.ZodString>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"move">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"scroll">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| scroll_x: z.ZodNumber; | ||
| scroll_y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"type">; | ||
| text: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"wait">; | ||
| duration: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>]>; | ||
| }, z.core.$strip>; | ||
| /** | ||
@@ -180,56 +232,5 @@ * Input structure for the Computer Use tool. | ||
| */ | ||
| declare function computerUse(options: ComputerUseOptions): DynamicStructuredTool<z.ZodObject<{ | ||
| action: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"screenshot">; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"double_click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"drag">; | ||
| path: z.ZodArray<z.ZodObject<{ | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"keypress">; | ||
| keys: z.ZodArray<z.ZodString>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"move">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"scroll">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| scroll_x: z.ZodNumber; | ||
| scroll_y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"type">; | ||
| text: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"wait">; | ||
| duration: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>]>; | ||
| }, z.core.$strip>, ComputerUseInput, unknown, ComputerUseReturnType, unknown, string>; | ||
| declare function computerUse(options: ComputerUseOptions): DynamicStructuredTool<typeof ComputerUseActionSchema, ComputerUseInput, unknown, ComputerUseReturnType>; | ||
| //#endregion | ||
| export { ComputerUseAction, ComputerUseClickAction, ComputerUseDoubleClickAction, ComputerUseDragAction, ComputerUseEnvironment, ComputerUseInput, ComputerUseKeypressAction, ComputerUseMoveAction, ComputerUseOptions, ComputerUseScreenshotAction, ComputerUseScrollAction, ComputerUseTool, ComputerUseTypeAction, ComputerUseWaitAction, computerUse }; | ||
| //# sourceMappingURL=computerUse.d.cts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"computerUse.d.cts","names":[],"sources":["../../src/tools/computerUse.ts"],"mappings":";;;;;;;AAcA;;KAAY,sBAAA;;;AAUZ;KAAY,sBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,KAAA;AAAA,KACtC,4BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,WAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,yBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,QAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,2BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,UAAA;AAAA,KACtC,uBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,MAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAflD;;;AAAA,KAoBY,iBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA;;;;;UA2GR,gBAAA;EACf,MAAA,EAAQ,iBAAA;AAAA;AAAA,KAGE,qBAAA,YAER,OAAA,WACA,WAAA,QACA,OAAA,CAAQ,WAAA;;;;UAKK,kBAAA;EAmC0B;;;EA/BzC,YAAA;EAmJc;;;EA9Id,aAAA;;;;;;;;;EAUA,WAAA,EAAa,sBAAA;;;;;;EAOb,OAAA,GACE,MAAA,EAAQ,iBAAA,EACR,OAAA,EAAS,WAAA,eACN,qBAAA;AAAA;;;;KAMK,eAAA,GAAkB,MAAA,CAAa,SAAA,CAAU,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoHrC,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAkB,qBAAA,CAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"computerUse.d.cts","names":[],"sources":["../../src/tools/computerUse.ts"],"mappings":";;;;;;;AAcA;;KAAY,sBAAA;;;AAUZ;KAAY,sBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,KAAA;AAAA,KACtC,4BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,WAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,yBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,QAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,2BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,UAAA;AAAA,KACtC,uBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,MAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAflD;;;AAAA,KAoBY,iBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA;AAAA,cAsEZ,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAqCnB,gBAAA;EACf,MAAA,EAAQ,iBAAA;AAAA;AAAA,KAGE,qBAAA,YAER,OAAA,WACA,WAAA,QACA,OAAA,CAAQ,WAAA;;;;UAKK,kBAAA;;;;EAIf,YAAA;;;;EAKA,aAAA;;;;;;;;;EAUA,WAAA,EAAa,sBAAA;;;;;;EAOb,OAAA,GACE,MAAA,EAAQ,iBAAA,EACR,OAAA,EAAS,WAAA,eACN,qBAAA;AAAA;;;;KAMK,eAAA,GAAkB,MAAA,CAAa,SAAA,CAAU,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoHrC,WAAA,CAAY,OAAA,EAAS,kBAAA,GAmEZ,qBAAA,QACd,uBAAA,EACP,gBAAA,WAEA,qBAAA"} |
@@ -27,2 +27,54 @@ import { OpenAI } from "openai"; | ||
| type ComputerUseAction = OpenAI.Responses.ResponseComputerToolCall["action"]; | ||
| declare const ComputerUseActionSchema: z.ZodObject<{ | ||
| action: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"screenshot">; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"double_click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"drag">; | ||
| path: z.ZodArray<z.ZodObject<{ | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"keypress">; | ||
| keys: z.ZodArray<z.ZodString>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"move">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"scroll">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| scroll_x: z.ZodNumber; | ||
| scroll_y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"type">; | ||
| text: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"wait">; | ||
| duration: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>]>; | ||
| }, z.core.$strip>; | ||
| /** | ||
@@ -180,56 +232,5 @@ * Input structure for the Computer Use tool. | ||
| */ | ||
| declare function computerUse(options: ComputerUseOptions): DynamicStructuredTool<z.ZodObject<{ | ||
| action: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"screenshot">; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"double_click">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| button: z.ZodDefault<z.ZodEnum<{ | ||
| back: "back"; | ||
| forward: "forward"; | ||
| left: "left"; | ||
| right: "right"; | ||
| wheel: "wheel"; | ||
| }>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"drag">; | ||
| path: z.ZodArray<z.ZodObject<{ | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"keypress">; | ||
| keys: z.ZodArray<z.ZodString>; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"move">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"scroll">; | ||
| x: z.ZodNumber; | ||
| y: z.ZodNumber; | ||
| scroll_x: z.ZodNumber; | ||
| scroll_y: z.ZodNumber; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"type">; | ||
| text: z.ZodString; | ||
| }, z.core.$strip>, z.ZodObject<{ | ||
| type: z.ZodLiteral<"wait">; | ||
| duration: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>]>; | ||
| }, z.core.$strip>, ComputerUseInput, unknown, ComputerUseReturnType, unknown, string>; | ||
| declare function computerUse(options: ComputerUseOptions): DynamicStructuredTool<typeof ComputerUseActionSchema, ComputerUseInput, unknown, ComputerUseReturnType>; | ||
| //#endregion | ||
| export { ComputerUseAction, ComputerUseClickAction, ComputerUseDoubleClickAction, ComputerUseDragAction, ComputerUseEnvironment, ComputerUseInput, ComputerUseKeypressAction, ComputerUseMoveAction, ComputerUseOptions, ComputerUseScreenshotAction, ComputerUseScrollAction, ComputerUseTool, ComputerUseTypeAction, ComputerUseWaitAction, computerUse }; | ||
| //# sourceMappingURL=computerUse.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"computerUse.d.ts","names":[],"sources":["../../src/tools/computerUse.ts"],"mappings":";;;;;;;AAcA;;KAAY,sBAAA;;;AAUZ;KAAY,sBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,KAAA;AAAA,KACtC,4BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,WAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,yBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,QAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,2BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,UAAA;AAAA,KACtC,uBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,MAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAflD;;;AAAA,KAoBY,iBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA;;;;;UA2GR,gBAAA;EACf,MAAA,EAAQ,iBAAA;AAAA;AAAA,KAGE,qBAAA,YAER,OAAA,WACA,WAAA,QACA,OAAA,CAAQ,WAAA;;;;UAKK,kBAAA;EAmC0B;;;EA/BzC,YAAA;EAmJc;;;EA9Id,aAAA;;;;;;;;;EAUA,WAAA,EAAa,sBAAA;;;;;;EAOb,OAAA,GACE,MAAA,EAAQ,iBAAA,EACR,OAAA,EAAS,WAAA,eACN,qBAAA;AAAA;;;;KAMK,eAAA,GAAkB,MAAA,CAAa,SAAA,CAAU,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoHrC,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAkB,qBAAA,CAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"computerUse.d.ts","names":[],"sources":["../../src/tools/computerUse.ts"],"mappings":";;;;;;;AAcA;;KAAY,sBAAA;;;AAUZ;KAAY,sBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,KAAA;AAAA,KACtC,4BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,WAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,yBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,QAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,2BAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,UAAA;AAAA,KACtC,uBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,MAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAAA,KACtC,qBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA,CAAyB,IAAA;AAflD;;;AAAA,KAoBY,iBAAA,GACV,MAAA,CAAa,SAAA,CAAU,wBAAA;AAAA,cAsEZ,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAqCnB,gBAAA;EACf,MAAA,EAAQ,iBAAA;AAAA;AAAA,KAGE,qBAAA,YAER,OAAA,WACA,WAAA,QACA,OAAA,CAAQ,WAAA;;;;UAKK,kBAAA;;;;EAIf,YAAA;;;;EAKA,aAAA;;;;;;;;;EAUA,WAAA,EAAa,sBAAA;;;;;;EAOb,OAAA,GACE,MAAA,EAAQ,iBAAA,EACR,OAAA,EAAS,WAAA,eACN,qBAAA;AAAA;;;;KAMK,eAAA,GAAkB,MAAA,CAAa,SAAA,CAAU,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoHrC,WAAA,CAAY,OAAA,EAAS,kBAAA,GAmEZ,qBAAA,QACd,uBAAA,EACP,gBAAA,WAEA,qBAAA"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"computerUse.js","names":[],"sources":["../../src/tools/computerUse.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from \"zod/v4\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { tool, type DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { type ToolRuntime } from \"@langchain/core/tools\";\nimport {\n ToolMessage,\n type AIMessage,\n type BaseMessage,\n} from \"@langchain/core/messages\";\n\n/**\n * The type of computer environment to control.\n */\nexport type ComputerUseEnvironment =\n | \"browser\"\n | \"mac\"\n | \"windows\"\n | \"linux\"\n | \"ubuntu\";\n\n/**\n * Re-export action types from OpenAI SDK for convenience.\n */\nexport type ComputerUseClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Click;\nexport type ComputerUseDoubleClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.DoubleClick;\nexport type ComputerUseDragAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Drag;\nexport type ComputerUseKeypressAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Keypress;\nexport type ComputerUseMoveAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Move;\nexport type ComputerUseScreenshotAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Screenshot;\nexport type ComputerUseScrollAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Scroll;\nexport type ComputerUseTypeAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Type;\nexport type ComputerUseWaitAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Wait;\n\n/**\n * Union type of all computer use actions from OpenAI SDK.\n */\nexport type ComputerUseAction =\n OpenAIClient.Responses.ResponseComputerToolCall[\"action\"];\n\n// Zod schemas for computer use actions\nconst ComputerUseScreenshotActionSchema = z.object({\n type: z.literal(\"screenshot\"),\n});\n\nconst ComputerUseClickActionSchema = z.object({\n type: z.literal(\"click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDoubleClickActionSchema = z.object({\n type: z.literal(\"double_click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDragActionSchema = z.object({\n type: z.literal(\"drag\"),\n path: z.array(z.object({ x: z.number(), y: z.number() })),\n});\n\nconst ComputerUseKeypressActionSchema = z.object({\n type: z.literal(\"keypress\"),\n keys: z.array(z.string()),\n});\n\nconst ComputerUseMoveActionSchema = z.object({\n type: z.literal(\"move\"),\n x: z.number(),\n y: z.number(),\n});\n\nconst ComputerUseScrollActionSchema = z.object({\n type: z.literal(\"scroll\"),\n x: z.number(),\n y: z.number(),\n scroll_x: z.number(),\n scroll_y: z.number(),\n});\n\nconst ComputerUseTypeActionSchema = z.object({\n type: z.literal(\"type\"),\n text: z.string(),\n});\n\nconst ComputerUseWaitActionSchema = z.object({\n type: z.literal(\"wait\"),\n duration: z.number().optional(),\n});\n\n// Union schema for individual action types\nconst ComputerUseActionUnionSchema = z.union([\n ComputerUseScreenshotActionSchema,\n ComputerUseClickActionSchema,\n ComputerUseDoubleClickActionSchema,\n ComputerUseDragActionSchema,\n ComputerUseKeypressActionSchema,\n ComputerUseMoveActionSchema,\n ComputerUseScrollActionSchema,\n ComputerUseTypeActionSchema,\n ComputerUseWaitActionSchema,\n]);\n\n// Schema for the input structure received from parseComputerCall\n// The action is wrapped in an `action` property: { action: { type: 'screenshot' } }\nexport const ComputerUseActionSchema = z.object({\n action: ComputerUseActionUnionSchema,\n});\n\n// TypeScript types derived from Zod schemas\nexport type ComputerUseScreenshotActionType = z.infer<\n typeof ComputerUseScreenshotActionSchema\n>;\nexport type ComputerUseClickActionType = z.infer<\n typeof ComputerUseClickActionSchema\n>;\nexport type ComputerUseDoubleClickActionType = z.infer<\n typeof ComputerUseDoubleClickActionSchema\n>;\nexport type ComputerUseDragActionType = z.infer<\n typeof ComputerUseDragActionSchema\n>;\nexport type ComputerUseKeypressActionType = z.infer<\n typeof ComputerUseKeypressActionSchema\n>;\nexport type ComputerUseMoveActionType = z.infer<\n typeof ComputerUseMoveActionSchema\n>;\nexport type ComputerUseScrollActionType = z.infer<\n typeof ComputerUseScrollActionSchema\n>;\nexport type ComputerUseTypeActionType = z.infer<\n typeof ComputerUseTypeActionSchema\n>;\nexport type ComputerUseWaitActionType = z.infer<\n typeof ComputerUseWaitActionSchema\n>;\n\n/**\n * Input structure for the Computer Use tool.\n * The action is wrapped in an `action` property.\n */\nexport interface ComputerUseInput {\n action: ComputerUseAction;\n}\n\nexport type ComputerUseReturnType =\n | string\n | Promise<string>\n | ToolMessage<any>\n | Promise<ToolMessage<any>>;\n\n/**\n * Options for the Computer Use tool.\n */\nexport interface ComputerUseOptions {\n /**\n * The width of the computer display in pixels.\n */\n displayWidth: number;\n\n /**\n * The height of the computer display in pixels.\n */\n displayHeight: number;\n\n /**\n * The type of computer environment to control.\n * - `browser`: Browser automation (recommended for most use cases)\n * - `mac`: macOS environment\n * - `windows`: Windows environment\n * - `linux`: Linux environment\n * - `ubuntu`: Ubuntu environment\n */\n environment: ComputerUseEnvironment;\n\n /**\n * Execute function that handles computer action execution.\n * This function receives the action input and should return a base64-encoded\n * screenshot of the result.\n */\n execute: (\n action: ComputerUseAction,\n runtime: ToolRuntime<any, any>\n ) => ComputerUseReturnType;\n}\n\n/**\n * OpenAI Computer Use tool type for the Responses API.\n */\nexport type ComputerUseTool = OpenAIClient.Responses.ComputerUsePreviewTool;\n\nconst TOOL_NAME = \"computer_use\";\n\n/**\n * Creates a Computer Use tool that allows models to control computer interfaces\n * and perform tasks by simulating mouse clicks, keyboard input, scrolling, and more.\n *\n * **Computer Use** is a practical application of OpenAI's Computer-Using Agent (CUA)\n * model (`computer-use-preview`), which combines vision capabilities with advanced\n * reasoning to simulate controlling computer interfaces.\n *\n * **How it works**:\n * The tool operates in a continuous loop:\n * 1. Model sends computer actions (click, type, scroll, etc.)\n * 2. Your code executes these actions in a controlled environment\n * 3. You capture a screenshot of the result\n * 4. Send the screenshot back to the model\n * 5. Repeat until the task is complete\n *\n * **Important**: Computer use is in beta and requires careful consideration:\n * - Use in sandboxed environments only\n * - Do not use for high-stakes or authenticated tasks\n * - Always implement human-in-the-loop for important decisions\n * - Handle safety checks appropriately\n *\n * @see {@link https://platform.openai.com/docs/guides/tools-computer-use | OpenAI Computer Use Documentation}\n *\n * @param options - Configuration options for the Computer Use tool\n * @returns A Computer Use tool that can be passed to `bindTools`\n *\n * @example\n * ```typescript\n * import { ChatOpenAI, tools } from \"@langchain/openai\";\n *\n * const model = new ChatOpenAI({ model: \"computer-use-preview\" });\n *\n * // With execute callback for automatic action handling\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * execute: async (action) => {\n * if (action.type === \"screenshot\") {\n * return captureScreenshot();\n * }\n * if (action.type === \"click\") {\n * await page.mouse.click(action.x, action.y, { button: action.button });\n * return captureScreenshot();\n * }\n * if (action.type === \"type\") {\n * await page.keyboard.type(action.text);\n * return captureScreenshot();\n * }\n * // Handle other actions...\n * return captureScreenshot();\n * },\n * });\n *\n * const llmWithComputer = model.bindTools([computer]);\n * const response = await llmWithComputer.invoke(\n * \"Check the latest news on bing.com\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Without execute callback (manual action handling)\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * });\n *\n * const response = await model.invoke(\"Check the news\", {\n * tools: [computer],\n * });\n *\n * // Access the computer call from the response\n * const computerCall = response.additional_kwargs.tool_outputs?.find(\n * (output) => output.type === \"computer_call\"\n * );\n * if (computerCall) {\n * console.log(\"Action to execute:\", computerCall.action);\n * // Execute the action manually, then send back a screenshot\n * }\n * ```\n *\n * @example\n * ```typescript\n * // For macOS desktop automation with Docker\n * const computer = tools.computerUse({\n * displayWidth: 1920,\n * displayHeight: 1080,\n * environment: \"mac\",\n * execute: async (action) => {\n * if (action.type === \"click\") {\n * await dockerExec(\n * `DISPLAY=:99 xdotool mousemove ${action.x} ${action.y} click 1`,\n * containerName\n * );\n * }\n * // Capture screenshot from container\n * return await getDockerScreenshot(containerName);\n * },\n * });\n * ```\n *\n * @remarks\n * - Only available through the Responses API (not Chat Completions)\n * - Requires `computer-use-preview` model\n * - Actions include: click, double_click, drag, keypress, move, screenshot, scroll, type, wait\n * - Safety checks may be returned that require acknowledgment before proceeding\n * - Use `truncation: \"auto\"` parameter when making requests\n * - Recommended to use with `reasoning.summary` for debugging\n */\nexport function computerUse(options: ComputerUseOptions) {\n const computerTool = tool(\n async (\n input: ComputerUseInput,\n runtime: ToolRuntime<{ messages: BaseMessage[] }>\n ) => {\n /**\n * get computer_use call id from runtime\n */\n const aiMessage = runtime.state?.messages.at(-1) as AIMessage | undefined;\n const computerToolCall = aiMessage?.tool_calls?.find(\n (tc) => tc.name === \"computer_use\"\n );\n const computerToolCallId = computerToolCall?.id;\n if (!computerToolCallId) {\n throw new Error(\"Computer use call id not found\");\n }\n\n const result = await options.execute(input.action, runtime);\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n if (typeof result === \"string\") {\n return new ToolMessage({\n content: result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n },\n });\n }\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n return new ToolMessage({\n ...result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n ...result.additional_kwargs,\n },\n });\n },\n {\n name: TOOL_NAME,\n description:\n \"Control a computer interface by executing mouse clicks, keyboard input, scrolling, and other actions.\",\n schema: ComputerUseActionSchema,\n }\n );\n\n computerTool.extras = {\n ...(computerTool.extras ?? {}),\n providerToolDefinition: {\n type: \"computer_use_preview\",\n display_width: options.displayWidth,\n display_height: options.displayHeight,\n environment: options.environment,\n } satisfies ComputerUseTool,\n };\n\n /**\n * return as typed {@link DynamicStructuredTool} so we don't get any type\n * errors like \"can't export tool without reference\"\n */\n return computerTool as DynamicStructuredTool<\n typeof ComputerUseActionSchema,\n ComputerUseInput,\n unknown,\n ComputerUseReturnType\n >;\n}\n"],"mappings":";;;;AAkDA,MAAM,oCAAoC,EAAE,OAAO,EACjD,MAAM,EAAE,QAAQ,aAAa,EAC9B,CAAC;AAEF,MAAM,+BAA+B,EAAE,OAAO;CAC5C,MAAM,EAAE,QAAQ,QAAQ;CACxB,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACb,QAAQ,EAAE,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAQ;EAAU,CAAC,CAAC,QAAQ,OAAO;CAC9E,CAAC;AAEF,MAAM,qCAAqC,EAAE,OAAO;CAClD,MAAM,EAAE,QAAQ,eAAe;CAC/B,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACb,QAAQ,EAAE,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAQ;EAAU,CAAC,CAAC,QAAQ,OAAO;CAC9E,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,MAAM,EAAE,MAAM,EAAE,OAAO;EAAE,GAAG,EAAE,QAAQ;EAAE,GAAG,EAAE,QAAQ;EAAE,CAAC,CAAC;CAC1D,CAAC;AAEF,MAAM,kCAAkC,EAAE,OAAO;CAC/C,MAAM,EAAE,QAAQ,WAAW;CAC3B,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,MAAM,gCAAgC,EAAE,OAAO;CAC7C,MAAM,EAAE,QAAQ,SAAS;CACzB,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACb,UAAU,EAAE,QAAQ;CACpB,UAAU,EAAE,QAAQ;CACrB,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAGF,MAAM,+BAA+B,EAAE,MAAM;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,MAAa,0BAA0B,EAAE,OAAO,EAC9C,QAAQ,8BACT,CAAC;AAqFF,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkHlB,SAAgB,YAAY,SAA6B;CACvD,MAAM,eAAe,KACnB,OACE,OACA,YACG;EAQH,MAAM,uBAJY,QAAQ,OAAO,SAAS,GAAG,GAAG,GACZ,YAAY,MAC7C,OAAO,GAAG,SAAS,eACrB,GAC4C;AAC7C,MAAI,CAAC,mBACH,OAAM,IAAI,MAAM,iCAAiC;EAGnD,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ;;;;AAK3D,MAAI,OAAO,WAAW,SACpB,QAAO,IAAI,YAAY;GACrB,SAAS;GACT,cAAc;GACd,mBAAmB,EACjB,MAAM,wBACP;GACF,CAAC;;;;AAMJ,SAAO,IAAI,YAAY;GACrB,GAAG;GACH,cAAc;GACd,mBAAmB;IACjB,MAAM;IACN,GAAG,OAAO;IACX;GACF,CAAC;IAEJ;EACE,MAAM;EACN,aACE;EACF,QAAQ;EACT,CACF;AAED,cAAa,SAAS;EACpB,GAAI,aAAa,UAAU,EAAE;EAC7B,wBAAwB;GACtB,MAAM;GACN,eAAe,QAAQ;GACvB,gBAAgB,QAAQ;GACxB,aAAa,QAAQ;GACtB;EACF;;;;;AAMD,QAAO"} | ||
| {"version":3,"file":"computerUse.js","names":[],"sources":["../../src/tools/computerUse.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport { z } from \"zod/v4\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { tool, type DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { type ToolRuntime } from \"@langchain/core/tools\";\nimport {\n ToolMessage,\n type AIMessage,\n type BaseMessage,\n} from \"@langchain/core/messages\";\n\n/**\n * The type of computer environment to control.\n */\nexport type ComputerUseEnvironment =\n | \"browser\"\n | \"mac\"\n | \"windows\"\n | \"linux\"\n | \"ubuntu\";\n\n/**\n * Re-export action types from OpenAI SDK for convenience.\n */\nexport type ComputerUseClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Click;\nexport type ComputerUseDoubleClickAction =\n OpenAIClient.Responses.ResponseComputerToolCall.DoubleClick;\nexport type ComputerUseDragAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Drag;\nexport type ComputerUseKeypressAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Keypress;\nexport type ComputerUseMoveAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Move;\nexport type ComputerUseScreenshotAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Screenshot;\nexport type ComputerUseScrollAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Scroll;\nexport type ComputerUseTypeAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Type;\nexport type ComputerUseWaitAction =\n OpenAIClient.Responses.ResponseComputerToolCall.Wait;\n\n/**\n * Union type of all computer use actions from OpenAI SDK.\n */\nexport type ComputerUseAction =\n OpenAIClient.Responses.ResponseComputerToolCall[\"action\"];\n\n// Zod schemas for computer use actions\nconst ComputerUseScreenshotActionSchema = z.object({\n type: z.literal(\"screenshot\"),\n});\n\nconst ComputerUseClickActionSchema = z.object({\n type: z.literal(\"click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDoubleClickActionSchema = z.object({\n type: z.literal(\"double_click\"),\n x: z.number(),\n y: z.number(),\n button: z.enum([\"left\", \"right\", \"wheel\", \"back\", \"forward\"]).default(\"left\"),\n});\n\nconst ComputerUseDragActionSchema = z.object({\n type: z.literal(\"drag\"),\n path: z.array(z.object({ x: z.number(), y: z.number() })),\n});\n\nconst ComputerUseKeypressActionSchema = z.object({\n type: z.literal(\"keypress\"),\n keys: z.array(z.string()),\n});\n\nconst ComputerUseMoveActionSchema = z.object({\n type: z.literal(\"move\"),\n x: z.number(),\n y: z.number(),\n});\n\nconst ComputerUseScrollActionSchema = z.object({\n type: z.literal(\"scroll\"),\n x: z.number(),\n y: z.number(),\n scroll_x: z.number(),\n scroll_y: z.number(),\n});\n\nconst ComputerUseTypeActionSchema = z.object({\n type: z.literal(\"type\"),\n text: z.string(),\n});\n\nconst ComputerUseWaitActionSchema = z.object({\n type: z.literal(\"wait\"),\n duration: z.number().optional(),\n});\n\n// Union schema for individual action types\nconst ComputerUseActionUnionSchema = z.union([\n ComputerUseScreenshotActionSchema,\n ComputerUseClickActionSchema,\n ComputerUseDoubleClickActionSchema,\n ComputerUseDragActionSchema,\n ComputerUseKeypressActionSchema,\n ComputerUseMoveActionSchema,\n ComputerUseScrollActionSchema,\n ComputerUseTypeActionSchema,\n ComputerUseWaitActionSchema,\n]);\n\n// Schema for the input structure received from parseComputerCall\n// The action is wrapped in an `action` property: { action: { type: 'screenshot' } }\nexport const ComputerUseActionSchema = z.object({\n action: ComputerUseActionUnionSchema,\n});\n\n// TypeScript types derived from Zod schemas\nexport type ComputerUseScreenshotActionType = z.infer<\n typeof ComputerUseScreenshotActionSchema\n>;\nexport type ComputerUseClickActionType = z.infer<\n typeof ComputerUseClickActionSchema\n>;\nexport type ComputerUseDoubleClickActionType = z.infer<\n typeof ComputerUseDoubleClickActionSchema\n>;\nexport type ComputerUseDragActionType = z.infer<\n typeof ComputerUseDragActionSchema\n>;\nexport type ComputerUseKeypressActionType = z.infer<\n typeof ComputerUseKeypressActionSchema\n>;\nexport type ComputerUseMoveActionType = z.infer<\n typeof ComputerUseMoveActionSchema\n>;\nexport type ComputerUseScrollActionType = z.infer<\n typeof ComputerUseScrollActionSchema\n>;\nexport type ComputerUseTypeActionType = z.infer<\n typeof ComputerUseTypeActionSchema\n>;\nexport type ComputerUseWaitActionType = z.infer<\n typeof ComputerUseWaitActionSchema\n>;\n\n/**\n * Input structure for the Computer Use tool.\n * The action is wrapped in an `action` property.\n */\nexport interface ComputerUseInput {\n action: ComputerUseAction;\n}\n\nexport type ComputerUseReturnType =\n | string\n | Promise<string>\n | ToolMessage<any>\n | Promise<ToolMessage<any>>;\n\n/**\n * Options for the Computer Use tool.\n */\nexport interface ComputerUseOptions {\n /**\n * The width of the computer display in pixels.\n */\n displayWidth: number;\n\n /**\n * The height of the computer display in pixels.\n */\n displayHeight: number;\n\n /**\n * The type of computer environment to control.\n * - `browser`: Browser automation (recommended for most use cases)\n * - `mac`: macOS environment\n * - `windows`: Windows environment\n * - `linux`: Linux environment\n * - `ubuntu`: Ubuntu environment\n */\n environment: ComputerUseEnvironment;\n\n /**\n * Execute function that handles computer action execution.\n * This function receives the action input and should return a base64-encoded\n * screenshot of the result.\n */\n execute: (\n action: ComputerUseAction,\n runtime: ToolRuntime<any, any>\n ) => ComputerUseReturnType;\n}\n\n/**\n * OpenAI Computer Use tool type for the Responses API.\n */\nexport type ComputerUseTool = OpenAIClient.Responses.ComputerUsePreviewTool;\n\nconst TOOL_NAME = \"computer_use\";\n\n/**\n * Creates a Computer Use tool that allows models to control computer interfaces\n * and perform tasks by simulating mouse clicks, keyboard input, scrolling, and more.\n *\n * **Computer Use** is a practical application of OpenAI's Computer-Using Agent (CUA)\n * model (`computer-use-preview`), which combines vision capabilities with advanced\n * reasoning to simulate controlling computer interfaces.\n *\n * **How it works**:\n * The tool operates in a continuous loop:\n * 1. Model sends computer actions (click, type, scroll, etc.)\n * 2. Your code executes these actions in a controlled environment\n * 3. You capture a screenshot of the result\n * 4. Send the screenshot back to the model\n * 5. Repeat until the task is complete\n *\n * **Important**: Computer use is in beta and requires careful consideration:\n * - Use in sandboxed environments only\n * - Do not use for high-stakes or authenticated tasks\n * - Always implement human-in-the-loop for important decisions\n * - Handle safety checks appropriately\n *\n * @see {@link https://platform.openai.com/docs/guides/tools-computer-use | OpenAI Computer Use Documentation}\n *\n * @param options - Configuration options for the Computer Use tool\n * @returns A Computer Use tool that can be passed to `bindTools`\n *\n * @example\n * ```typescript\n * import { ChatOpenAI, tools } from \"@langchain/openai\";\n *\n * const model = new ChatOpenAI({ model: \"computer-use-preview\" });\n *\n * // With execute callback for automatic action handling\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * execute: async (action) => {\n * if (action.type === \"screenshot\") {\n * return captureScreenshot();\n * }\n * if (action.type === \"click\") {\n * await page.mouse.click(action.x, action.y, { button: action.button });\n * return captureScreenshot();\n * }\n * if (action.type === \"type\") {\n * await page.keyboard.type(action.text);\n * return captureScreenshot();\n * }\n * // Handle other actions...\n * return captureScreenshot();\n * },\n * });\n *\n * const llmWithComputer = model.bindTools([computer]);\n * const response = await llmWithComputer.invoke(\n * \"Check the latest news on bing.com\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Without execute callback (manual action handling)\n * const computer = tools.computerUse({\n * displayWidth: 1024,\n * displayHeight: 768,\n * environment: \"browser\",\n * });\n *\n * const response = await model.invoke(\"Check the news\", {\n * tools: [computer],\n * });\n *\n * // Access the computer call from the response\n * const computerCall = response.additional_kwargs.tool_outputs?.find(\n * (output) => output.type === \"computer_call\"\n * );\n * if (computerCall) {\n * console.log(\"Action to execute:\", computerCall.action);\n * // Execute the action manually, then send back a screenshot\n * }\n * ```\n *\n * @example\n * ```typescript\n * // For macOS desktop automation with Docker\n * const computer = tools.computerUse({\n * displayWidth: 1920,\n * displayHeight: 1080,\n * environment: \"mac\",\n * execute: async (action) => {\n * if (action.type === \"click\") {\n * await dockerExec(\n * `DISPLAY=:99 xdotool mousemove ${action.x} ${action.y} click 1`,\n * containerName\n * );\n * }\n * // Capture screenshot from container\n * return await getDockerScreenshot(containerName);\n * },\n * });\n * ```\n *\n * @remarks\n * - Only available through the Responses API (not Chat Completions)\n * - Requires `computer-use-preview` model\n * - Actions include: click, double_click, drag, keypress, move, screenshot, scroll, type, wait\n * - Safety checks may be returned that require acknowledgment before proceeding\n * - Use `truncation: \"auto\"` parameter when making requests\n * - Recommended to use with `reasoning.summary` for debugging\n */\nexport function computerUse(options: ComputerUseOptions) {\n const computerTool = tool(\n async (\n input: ComputerUseInput,\n runtime: ToolRuntime<{ messages: BaseMessage[] }>\n ) => {\n /**\n * get computer_use call id from runtime\n */\n const aiMessage = runtime.state?.messages.at(-1) as AIMessage | undefined;\n const computerToolCall = aiMessage?.tool_calls?.find(\n (tc) => tc.name === \"computer_use\"\n );\n const computerToolCallId = computerToolCall?.id;\n if (!computerToolCallId) {\n throw new Error(\"Computer use call id not found\");\n }\n\n const result = await options.execute(input.action, runtime);\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n if (typeof result === \"string\") {\n return new ToolMessage({\n content: result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n },\n });\n }\n\n /**\n * make sure {@link ToolMessage} is returned with the correct additional kwargs\n */\n return new ToolMessage({\n ...result,\n tool_call_id: computerToolCallId,\n additional_kwargs: {\n type: \"computer_call_output\",\n ...result.additional_kwargs,\n },\n });\n },\n {\n name: TOOL_NAME,\n description:\n \"Control a computer interface by executing mouse clicks, keyboard input, scrolling, and other actions.\",\n schema: ComputerUseActionSchema,\n }\n );\n\n computerTool.extras = {\n ...(computerTool.extras ?? {}),\n providerToolDefinition: {\n type: \"computer_use_preview\",\n display_width: options.displayWidth,\n display_height: options.displayHeight,\n environment: options.environment,\n } satisfies ComputerUseTool,\n };\n\n /**\n * return as typed {@link DynamicStructuredTool} so we don't get any type\n * errors like \"can't export tool without reference\"\n */\n return computerTool as DynamicStructuredTool<\n typeof ComputerUseActionSchema,\n ComputerUseInput,\n unknown,\n ComputerUseReturnType\n >;\n}\n"],"mappings":";;;;AAkDA,MAAM,oCAAoC,EAAE,OAAO,EACjD,MAAM,EAAE,QAAQ,aAAa,EAC9B,CAAC;AAEF,MAAM,+BAA+B,EAAE,OAAO;CAC5C,MAAM,EAAE,QAAQ,QAAQ;CACxB,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACb,QAAQ,EAAE,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAQ;EAAU,CAAC,CAAC,QAAQ,OAAO;CAC9E,CAAC;AAEF,MAAM,qCAAqC,EAAE,OAAO;CAClD,MAAM,EAAE,QAAQ,eAAe;CAC/B,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACb,QAAQ,EAAE,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAQ;EAAU,CAAC,CAAC,QAAQ,OAAO;CAC9E,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,MAAM,EAAE,MAAM,EAAE,OAAO;EAAE,GAAG,EAAE,QAAQ;EAAE,GAAG,EAAE,QAAQ;EAAE,CAAC,CAAC;CAC1D,CAAC;AAEF,MAAM,kCAAkC,EAAE,OAAO;CAC/C,MAAM,EAAE,QAAQ,WAAW;CAC3B,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,MAAM,gCAAgC,EAAE,OAAO;CAC7C,MAAM,EAAE,QAAQ,SAAS;CACzB,GAAG,EAAE,QAAQ;CACb,GAAG,EAAE,QAAQ;CACb,UAAU,EAAE,QAAQ;CACpB,UAAU,EAAE,QAAQ;CACrB,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,QAAQ,OAAO;CACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAGF,MAAM,+BAA+B,EAAE,MAAM;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,MAAa,0BAA0B,EAAE,OAAO,EAC9C,QAAQ,8BACT,CAAC;AAqFF,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkHlB,SAAgB,YAAY,SAA6B;CACvD,MAAM,eAAe,KACnB,OACE,OACA,YACG;EAQH,MAAM,uBAJY,QAAQ,OAAO,SAAS,GAAG,GAAG,GACZ,YAAY,MAC7C,OAAO,GAAG,SAAS,eACrB,GAC4C;AAC7C,MAAI,CAAC,mBACH,OAAM,IAAI,MAAM,iCAAiC;EAGnD,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ;;;;AAK3D,MAAI,OAAO,WAAW,SACpB,QAAO,IAAI,YAAY;GACrB,SAAS;GACT,cAAc;GACd,mBAAmB,EACjB,MAAM,wBACP;GACF,CAAC;;;;AAMJ,SAAO,IAAI,YAAY;GACrB,GAAG;GACH,cAAc;GACd,mBAAmB;IACjB,MAAM;IACN,GAAG,OAAO;IACX;GACF,CAAC;IAEJ;EACE,MAAM;EACN,aACE;EACF,QAAQ;EACT,CACF;AAED,cAAa,SAAS;EACpB,GAAI,aAAa,UAAU,EAAE;EAC7B,wBAAwB;GACtB,MAAM;GACN,eAAe,QAAQ;GACvB,gBAAgB,QAAQ;GACxB,aAAa,QAAQ;GACtB;EACF;;;;;AAMD,QAAO"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"custom.cjs","names":["DynamicTool","AsyncLocalStorageProviderSingleton"],"sources":["../../src/tools/custom.ts"],"sourcesContent":["import {\n patchConfig,\n pickRunnableConfigKeys,\n RunnableFunc,\n} from \"@langchain/core/runnables\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { DynamicTool, ToolRunnableConfig } from \"@langchain/core/tools\";\nimport OpenAI from \"openai\";\n\nexport type CustomToolFields = Omit<OpenAI.Responses.CustomTool, \"type\">;\n\nexport function customTool(\n func: RunnableFunc<string, string, ToolRunnableConfig>,\n fields: CustomToolFields\n): DynamicTool<string> {\n return new DynamicTool({\n ...fields,\n description: \"\",\n metadata: {\n customTool: fields,\n },\n func: async (input, runManager, config) =>\n new Promise<string>((resolve, reject) => {\n const childConfig = patchConfig(config, {\n callbacks: runManager?.getChild(),\n });\n // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(childConfig),\n async () => {\n try {\n resolve(func(input, childConfig));\n } catch (e) {\n reject(e);\n }\n }\n );\n }),\n });\n}\n"],"mappings":";;;;AAWA,SAAgB,WACd,MACA,QACqB;AACrB,QAAO,IAAIA,sBAAAA,YAAY;EACrB,GAAG;EACH,aAAa;EACb,UAAU,EACR,YAAY,QACb;EACD,MAAM,OAAO,OAAO,YAAY,WAC9B,IAAI,SAAiB,SAAS,WAAW;GACvC,MAAM,eAAA,GAAA,0BAAA,aAA0B,QAAQ,EACtC,WAAW,YAAY,UAAU,EAClC,CAAC;AAEGC,8BAAAA,mCAAmC,eAAA,GAAA,0BAAA,wBACf,YAAY,EACnC,YAAY;AACV,QAAI;AACF,aAAQ,KAAK,OAAO,YAAY,CAAC;aAC1B,GAAG;AACV,YAAO,EAAE;;KAGd;IACD;EACL,CAAC"} | ||
| {"version":3,"file":"custom.cjs","names":["DynamicTool","AsyncLocalStorageProviderSingleton"],"sources":["../../src/tools/custom.ts"],"sourcesContent":["import {\n patchConfig,\n pickRunnableConfigKeys,\n RunnableFunc,\n} from \"@langchain/core/runnables\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { DynamicTool, ToolRunnableConfig } from \"@langchain/core/tools\";\nimport OpenAI from \"openai\";\n\nexport type CustomToolFields = Omit<OpenAI.Responses.CustomTool, \"type\">;\n\nexport function customTool(\n func: RunnableFunc<string, string, ToolRunnableConfig>,\n fields: CustomToolFields\n): DynamicTool<string> {\n return new DynamicTool({\n ...fields,\n description: \"\",\n metadata: {\n customTool: fields,\n },\n func: async (input, runManager, config) =>\n new Promise<string>((resolve, reject) => {\n const childConfig = patchConfig(config, {\n callbacks: runManager?.getChild(),\n });\n // oxlint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(childConfig),\n async () => {\n try {\n resolve(func(input, childConfig));\n } catch (e) {\n reject(e);\n }\n }\n );\n }),\n });\n}\n"],"mappings":";;;;AAWA,SAAgB,WACd,MACA,QACqB;AACrB,QAAO,IAAIA,sBAAAA,YAAY;EACrB,GAAG;EACH,aAAa;EACb,UAAU,EACR,YAAY,QACb;EACD,MAAM,OAAO,OAAO,YAAY,WAC9B,IAAI,SAAiB,SAAS,WAAW;GACvC,MAAM,eAAA,GAAA,0BAAA,aAA0B,QAAQ,EACtC,WAAW,YAAY,UAAU,EAClC,CAAC;AAEGC,8BAAAA,mCAAmC,eAAA,GAAA,0BAAA,wBACf,YAAY,EACnC,YAAY;AACV,QAAI;AACF,aAAQ,KAAK,OAAO,YAAY,CAAC;aAC1B,GAAG;AACV,YAAO,EAAE;;KAGd;IACD;EACL,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"custom.js","names":[],"sources":["../../src/tools/custom.ts"],"sourcesContent":["import {\n patchConfig,\n pickRunnableConfigKeys,\n RunnableFunc,\n} from \"@langchain/core/runnables\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { DynamicTool, ToolRunnableConfig } from \"@langchain/core/tools\";\nimport OpenAI from \"openai\";\n\nexport type CustomToolFields = Omit<OpenAI.Responses.CustomTool, \"type\">;\n\nexport function customTool(\n func: RunnableFunc<string, string, ToolRunnableConfig>,\n fields: CustomToolFields\n): DynamicTool<string> {\n return new DynamicTool({\n ...fields,\n description: \"\",\n metadata: {\n customTool: fields,\n },\n func: async (input, runManager, config) =>\n new Promise<string>((resolve, reject) => {\n const childConfig = patchConfig(config, {\n callbacks: runManager?.getChild(),\n });\n // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(childConfig),\n async () => {\n try {\n resolve(func(input, childConfig));\n } catch (e) {\n reject(e);\n }\n }\n );\n }),\n });\n}\n"],"mappings":";;;;AAWA,SAAgB,WACd,MACA,QACqB;AACrB,QAAO,IAAI,YAAY;EACrB,GAAG;EACH,aAAa;EACb,UAAU,EACR,YAAY,QACb;EACD,MAAM,OAAO,OAAO,YAAY,WAC9B,IAAI,SAAiB,SAAS,WAAW;GACvC,MAAM,cAAc,YAAY,QAAQ,EACtC,WAAW,YAAY,UAAU,EAClC,CAAC;AAEG,sCAAmC,cACtC,uBAAuB,YAAY,EACnC,YAAY;AACV,QAAI;AACF,aAAQ,KAAK,OAAO,YAAY,CAAC;aAC1B,GAAG;AACV,YAAO,EAAE;;KAGd;IACD;EACL,CAAC"} | ||
| {"version":3,"file":"custom.js","names":[],"sources":["../../src/tools/custom.ts"],"sourcesContent":["import {\n patchConfig,\n pickRunnableConfigKeys,\n RunnableFunc,\n} from \"@langchain/core/runnables\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { DynamicTool, ToolRunnableConfig } from \"@langchain/core/tools\";\nimport OpenAI from \"openai\";\n\nexport type CustomToolFields = Omit<OpenAI.Responses.CustomTool, \"type\">;\n\nexport function customTool(\n func: RunnableFunc<string, string, ToolRunnableConfig>,\n fields: CustomToolFields\n): DynamicTool<string> {\n return new DynamicTool({\n ...fields,\n description: \"\",\n metadata: {\n customTool: fields,\n },\n func: async (input, runManager, config) =>\n new Promise<string>((resolve, reject) => {\n const childConfig = patchConfig(config, {\n callbacks: runManager?.getChild(),\n });\n // oxlint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(childConfig),\n async () => {\n try {\n resolve(func(input, childConfig));\n } catch (e) {\n reject(e);\n }\n }\n );\n }),\n });\n}\n"],"mappings":";;;;AAWA,SAAgB,WACd,MACA,QACqB;AACrB,QAAO,IAAI,YAAY;EACrB,GAAG;EACH,aAAa;EACb,UAAU,EACR,YAAY,QACb;EACD,MAAM,OAAO,OAAO,YAAY,WAC9B,IAAI,SAAiB,SAAS,WAAW;GACvC,MAAM,cAAc,YAAY,QAAQ,EACtC,WAAW,YAAY,UAAU,EAClC,CAAC;AAEG,sCAAmC,cACtC,uBAAuB,YAAY,EACnC,YAAY;AACV,QAAI;AACF,aAAQ,KAAK,OAAO,YAAY,CAAC;aAC1B,GAAG;AACV,YAAO,EAAE;;KAGd;IACD;EACL,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"dalle.cjs","names":["Tool","OpenAIClient"],"sources":["../../src/tools/dalle.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport {\n MessageContentComplex,\n MessageContentImageUrl,\n} from \"@langchain/core/messages\";\n\n/**\n * @see https://platform.openai.com/docs/api-reference/images/create\n */\nexport type OpenAIImageModelId =\n | OpenAIClient.ImageModel\n | (string & NonNullable<unknown>);\n\n/**\n * An interface for the Dall-E API Wrapper.\n */\nexport interface DallEAPIWrapperParams extends ToolParams {\n /**\n * The OpenAI API key\n * Alias for `apiKey`\n */\n openAIApiKey?: string;\n /**\n * The OpenAI API key\n */\n apiKey?: string;\n /**\n * The model to use.\n * Alias for `model`\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n * @deprecated Use `model` instead.\n */\n modelName?: OpenAIImageModelId;\n /**\n * The model to use.\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n */\n model?: OpenAIImageModelId;\n /**\n * The style of the generated images. Must be one of vivid or natural.\n * Vivid causes the model to lean towards generating hyper-real and dramatic images.\n * Natural causes the model to produce more natural, less hyper-real looking images.\n * @default \"vivid\"\n */\n style?: \"natural\" | \"vivid\";\n /**\n * The quality of the image that will be generated. ‘hd’ creates images with finer\n * details and greater consistency across the image.\n * @default \"standard\"\n */\n quality?: \"standard\" | \"hd\";\n /**\n * The number of images to generate.\n * Must be between 1 and 10.\n * For dall-e-3, only `n: 1` is supported.\n * @default 1\n */\n n?: number;\n /**\n * The size of the generated images.\n * Must be one of 256x256, 512x512, or 1024x1024 for DALL·E-2 models.\n * Must be one of 1024x1024, 1792x1024, or 1024x1792 for DALL·E-3 models.\n * @default \"1024x1024\"\n */\n size?: \"256x256\" | \"512x512\" | \"1024x1024\" | \"1792x1024\" | \"1024x1792\";\n /**\n * The format in which the generated images are returned.\n * Must be one of \"url\" or \"b64_json\".\n * @default \"url\"\n */\n dallEResponseFormat?: \"url\" | \"b64_json\";\n /**\n * @deprecated Use dallEResponseFormat instead for the Dall-E response type.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n responseFormat?: any;\n /**\n * A unique identifier representing your end-user, which will help\n * OpenAI to monitor and detect abuse.\n */\n user?: string;\n /**\n * The organization to use\n */\n organization?: string;\n /**\n * The base URL of the OpenAI API.\n */\n baseUrl?: string;\n}\n\n/**\n * A tool for generating images with Open AIs Dall-E 2 or 3 API.\n */\nexport class DallEAPIWrapper extends Tool {\n static lc_name() {\n return \"DallEAPIWrapper\";\n }\n\n name = \"dalle_api_wrapper\";\n\n description =\n \"A wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.\";\n\n protected client: OpenAIClient;\n\n static readonly toolName = \"dalle_api_wrapper\";\n\n private model = \"dall-e-3\";\n\n private style: \"natural\" | \"vivid\" = \"vivid\";\n\n private quality: \"standard\" | \"hd\" = \"standard\";\n\n private n = 1;\n\n private size:\n | \"256x256\"\n | \"512x512\"\n | \"1024x1024\"\n | \"1792x1024\"\n | \"1024x1792\" = \"1024x1024\";\n\n private dallEResponseFormat: \"url\" | \"b64_json\" = \"url\";\n\n private user?: string;\n\n constructor(fields?: DallEAPIWrapperParams) {\n // Shim for new base tool param name\n if (\n fields?.responseFormat !== undefined &&\n [\"url\", \"b64_json\"].includes(fields.responseFormat)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields.dallEResponseFormat = fields.responseFormat as any;\n fields.responseFormat = \"content\";\n }\n super(fields);\n const openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n const organization =\n fields?.organization ?? getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n const clientConfig = {\n apiKey: openAIApiKey,\n organization,\n dangerouslyAllowBrowser: true,\n baseURL: fields?.baseUrl,\n };\n this.client = new OpenAIClient(clientConfig);\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.style = fields?.style ?? this.style;\n this.quality = fields?.quality ?? this.quality;\n this.n = fields?.n ?? this.n;\n this.size = fields?.size ?? this.size;\n this.dallEResponseFormat =\n fields?.dallEResponseFormat ?? this.dallEResponseFormat;\n this.user = fields?.user;\n }\n\n /**\n * Processes the API response if multiple images are generated.\n * Returns a list of MessageContentImageUrl objects. If the response\n * format is `url`, then the `image_url` field will contain the URL.\n * If it is `b64_json`, then the `image_url` field will contain an object\n * with a `url` field with the base64 encoded image.\n *\n * @param {OpenAIClient.Images.ImagesResponse[]} response The API response\n * @returns {MessageContentImageUrl[]}\n */\n private processMultipleGeneratedUrls(\n response: OpenAIClient.Images.ImagesResponse[]\n ): MessageContentImageUrl[] {\n if (this.dallEResponseFormat === \"url\") {\n return response.flatMap((res) => {\n const imageUrlContent =\n res.data\n ?.flatMap((item) => {\n if (!item.url) return [];\n return {\n type: \"image_url\" as const,\n image_url: item.url,\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"string\" &&\n item.image_url !== undefined\n ) ?? [];\n return imageUrlContent;\n });\n } else {\n return response.flatMap((res) => {\n const b64Content =\n res.data\n ?.flatMap((item) => {\n if (!item.b64_json) return [];\n return {\n type: \"image_url\" as const,\n image_url: {\n url: item.b64_json,\n },\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"object\" &&\n \"url\" in item.image_url &&\n typeof item.image_url.url === \"string\" &&\n item.image_url.url !== undefined\n ) ?? [];\n return b64Content;\n });\n }\n }\n\n /** @ignore */\n async _call(input: string): Promise<string | MessageContentComplex[]> {\n const generateImageFields = {\n model: this.model,\n prompt: input,\n n: 1,\n size: this.size,\n response_format: this.dallEResponseFormat,\n style: this.style,\n quality: this.quality,\n user: this.user,\n };\n\n if (this.n > 1) {\n const results = await Promise.all(\n Array.from({ length: this.n }).map(() =>\n this.client.images.generate(generateImageFields)\n )\n );\n\n return this.processMultipleGeneratedUrls(results);\n }\n\n const response = await this.client.images.generate(generateImageFields);\n\n let data = \"\";\n if (this.dallEResponseFormat === \"url\") {\n [data] =\n response.data\n ?.map((item) => item.url)\n .filter((url): url is string => url !== \"undefined\") ?? [];\n } else {\n [data] =\n response.data\n ?.map((item) => item.b64_json)\n .filter((b64_json): b64_json is string => b64_json !== \"undefined\") ??\n [];\n }\n return data;\n }\n}\n"],"mappings":";;;;;;;AAkGA,IAAa,kBAAb,cAAqCA,sBAAAA,KAAK;CACxC,OAAO,UAAU;AACf,SAAO;;CAGT,OAAO;CAEP,cACE;CAEF;CAEA,OAAgB,WAAW;CAE3B,QAAgB;CAEhB,QAAqC;CAErC,UAAqC;CAErC,IAAY;CAEZ,OAKkB;CAElB,sBAAkD;CAElD;CAEA,YAAY,QAAgC;AAE1C,MACE,QAAQ,mBAAmB,KAAA,KAC3B,CAAC,OAAO,WAAW,CAAC,SAAS,OAAO,eAAe,EACnD;AAEA,UAAO,sBAAsB,OAAO;AACpC,UAAO,iBAAiB;;AAE1B,QAAM,OAAO;AAeb,OAAK,SAAS,IAAIC,OAAAA,OANG;GACnB,QARA,QAAQ,UACR,QAAQ,iBAAA,GAAA,0BAAA,wBACe,iBAAiB;GAOxC,cAJA,QAAQ,iBAAA,GAAA,0BAAA,wBAAuC,sBAAsB;GAKrE,yBAAyB;GACzB,SAAS,QAAQ;GAClB,CAC2C;AAC5C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,UAAU,QAAQ,WAAW,KAAK;AACvC,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,sBACH,QAAQ,uBAAuB,KAAK;AACtC,OAAK,OAAO,QAAQ;;;;;;;;;;;;CAatB,6BACE,UAC0B;AAC1B,MAAI,KAAK,wBAAwB,MAC/B,QAAO,SAAS,SAAS,QAAQ;AAiB/B,UAfE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,IAAK,QAAO,EAAE;AACxB,WAAO;KACL,MAAM;KACN,WAAW,KAAK;KACjB;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,KAAK,cAAc,KAAA,EACtB,IAAI,EAAE;IAEX;MAEF,QAAO,SAAS,SAAS,QAAQ;AAqB/B,UAnBE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,SAAU,QAAO,EAAE;AAC7B,WAAO;KACL,MAAM;KACN,WAAW,EACT,KAAK,KAAK,UACX;KACF;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,SAAS,KAAK,aACd,OAAO,KAAK,UAAU,QAAQ,YAC9B,KAAK,UAAU,QAAQ,KAAA,EAC1B,IAAI,EAAE;IAEX;;;CAKN,MAAM,MAAM,OAA0D;EACpE,MAAM,sBAAsB;GAC1B,OAAO,KAAK;GACZ,QAAQ;GACR,GAAG;GACH,MAAM,KAAK;GACX,iBAAiB,KAAK;GACtB,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,MAAM,KAAK;GACZ;AAED,MAAI,KAAK,IAAI,GAAG;GACd,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,UAC7B,KAAK,OAAO,OAAO,SAAS,oBAAoB,CACjD,CACF;AAED,UAAO,KAAK,6BAA6B,QAAQ;;EAGnD,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS,oBAAoB;EAEvE,IAAI,OAAO;AACX,MAAI,KAAK,wBAAwB,MAC/B,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,IAAI,CACxB,QAAQ,QAAuB,QAAQ,YAAY,IAAI,EAAE;MAE9D,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,SAAS,CAC7B,QAAQ,aAAiC,aAAa,YAAY,IACrE,EAAE;AAEN,SAAO"} | ||
| {"version":3,"file":"dalle.cjs","names":["Tool","OpenAIClient"],"sources":["../../src/tools/dalle.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport {\n MessageContentComplex,\n MessageContentImageUrl,\n} from \"@langchain/core/messages\";\n\n/**\n * @see https://platform.openai.com/docs/api-reference/images/create\n */\nexport type OpenAIImageModelId =\n | OpenAIClient.ImageModel\n | (string & NonNullable<unknown>);\n\n/**\n * An interface for the Dall-E API Wrapper.\n */\nexport interface DallEAPIWrapperParams extends ToolParams {\n /**\n * The OpenAI API key\n * Alias for `apiKey`\n */\n openAIApiKey?: string;\n /**\n * The OpenAI API key\n */\n apiKey?: string;\n /**\n * The model to use.\n * Alias for `model`\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n * @deprecated Use `model` instead.\n */\n modelName?: OpenAIImageModelId;\n /**\n * The model to use.\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n */\n model?: OpenAIImageModelId;\n /**\n * The style of the generated images. Must be one of vivid or natural.\n * Vivid causes the model to lean towards generating hyper-real and dramatic images.\n * Natural causes the model to produce more natural, less hyper-real looking images.\n * @default \"vivid\"\n */\n style?: \"natural\" | \"vivid\";\n /**\n * The quality of the image that will be generated. ‘hd’ creates images with finer\n * details and greater consistency across the image.\n * @default \"standard\"\n */\n quality?: \"standard\" | \"hd\";\n /**\n * The number of images to generate.\n * Must be between 1 and 10.\n * For dall-e-3, only `n: 1` is supported.\n * @default 1\n */\n n?: number;\n /**\n * The size of the generated images.\n * Must be one of 256x256, 512x512, or 1024x1024 for DALL·E-2 models.\n * Must be one of 1024x1024, 1792x1024, or 1024x1792 for DALL·E-3 models.\n * @default \"1024x1024\"\n */\n size?: \"256x256\" | \"512x512\" | \"1024x1024\" | \"1792x1024\" | \"1024x1792\";\n /**\n * The format in which the generated images are returned.\n * Must be one of \"url\" or \"b64_json\".\n * @default \"url\"\n */\n dallEResponseFormat?: \"url\" | \"b64_json\";\n /**\n * @deprecated Use dallEResponseFormat instead for the Dall-E response type.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n responseFormat?: any;\n /**\n * A unique identifier representing your end-user, which will help\n * OpenAI to monitor and detect abuse.\n */\n user?: string;\n /**\n * The organization to use\n */\n organization?: string;\n /**\n * The base URL of the OpenAI API.\n */\n baseUrl?: string;\n}\n\n/**\n * A tool for generating images with Open AIs Dall-E 2 or 3 API.\n */\nexport class DallEAPIWrapper extends Tool {\n static lc_name() {\n return \"DallEAPIWrapper\";\n }\n\n name = \"dalle_api_wrapper\";\n\n description =\n \"A wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.\";\n\n protected client: OpenAIClient;\n\n static readonly toolName = \"dalle_api_wrapper\";\n\n private model = \"dall-e-3\";\n\n private style: \"natural\" | \"vivid\" = \"vivid\";\n\n private quality: \"standard\" | \"hd\" = \"standard\";\n\n private n = 1;\n\n private size:\n | \"256x256\"\n | \"512x512\"\n | \"1024x1024\"\n | \"1792x1024\"\n | \"1024x1792\" = \"1024x1024\";\n\n private dallEResponseFormat: \"url\" | \"b64_json\" = \"url\";\n\n private user?: string;\n\n constructor(fields?: DallEAPIWrapperParams) {\n // Shim for new base tool param name\n if (\n fields?.responseFormat !== undefined &&\n [\"url\", \"b64_json\"].includes(fields.responseFormat)\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields.dallEResponseFormat = fields.responseFormat as any;\n fields.responseFormat = \"content\";\n }\n super(fields);\n const openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n const organization =\n fields?.organization ?? getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n const clientConfig = {\n apiKey: openAIApiKey,\n organization,\n dangerouslyAllowBrowser: true,\n baseURL: fields?.baseUrl,\n };\n this.client = new OpenAIClient(clientConfig);\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.style = fields?.style ?? this.style;\n this.quality = fields?.quality ?? this.quality;\n this.n = fields?.n ?? this.n;\n this.size = fields?.size ?? this.size;\n this.dallEResponseFormat =\n fields?.dallEResponseFormat ?? this.dallEResponseFormat;\n this.user = fields?.user;\n }\n\n /**\n * Processes the API response if multiple images are generated.\n * Returns a list of MessageContentImageUrl objects. If the response\n * format is `url`, then the `image_url` field will contain the URL.\n * If it is `b64_json`, then the `image_url` field will contain an object\n * with a `url` field with the base64 encoded image.\n *\n * @param {OpenAIClient.Images.ImagesResponse[]} response The API response\n * @returns {MessageContentImageUrl[]}\n */\n private processMultipleGeneratedUrls(\n response: OpenAIClient.Images.ImagesResponse[]\n ): MessageContentImageUrl[] {\n if (this.dallEResponseFormat === \"url\") {\n return response.flatMap((res) => {\n const imageUrlContent =\n res.data\n ?.flatMap((item) => {\n if (!item.url) return [];\n return {\n type: \"image_url\" as const,\n image_url: item.url,\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"string\" &&\n item.image_url !== undefined\n ) ?? [];\n return imageUrlContent;\n });\n } else {\n return response.flatMap((res) => {\n const b64Content =\n res.data\n ?.flatMap((item) => {\n if (!item.b64_json) return [];\n return {\n type: \"image_url\" as const,\n image_url: {\n url: item.b64_json,\n },\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"object\" &&\n \"url\" in item.image_url &&\n typeof item.image_url.url === \"string\" &&\n item.image_url.url !== undefined\n ) ?? [];\n return b64Content;\n });\n }\n }\n\n /** @ignore */\n async _call(input: string): Promise<string | MessageContentComplex[]> {\n const generateImageFields = {\n model: this.model,\n prompt: input,\n n: 1,\n size: this.size,\n response_format: this.dallEResponseFormat,\n style: this.style,\n quality: this.quality,\n user: this.user,\n };\n\n if (this.n > 1) {\n const results = await Promise.all(\n Array.from({ length: this.n }).map(() =>\n this.client.images.generate(generateImageFields)\n )\n );\n\n return this.processMultipleGeneratedUrls(results);\n }\n\n const response = await this.client.images.generate(generateImageFields);\n\n let data = \"\";\n if (this.dallEResponseFormat === \"url\") {\n [data] =\n response.data\n ?.map((item) => item.url)\n .filter((url): url is string => url !== \"undefined\") ?? [];\n } else {\n [data] =\n response.data\n ?.map((item) => item.b64_json)\n .filter((b64_json): b64_json is string => b64_json !== \"undefined\") ??\n [];\n }\n return data;\n }\n}\n"],"mappings":";;;;;;;AAkGA,IAAa,kBAAb,cAAqCA,sBAAAA,KAAK;CACxC,OAAO,UAAU;AACf,SAAO;;CAGT,OAAO;CAEP,cACE;CAEF;CAEA,OAAgB,WAAW;CAE3B,QAAgB;CAEhB,QAAqC;CAErC,UAAqC;CAErC,IAAY;CAEZ,OAKkB;CAElB,sBAAkD;CAElD;CAEA,YAAY,QAAgC;AAE1C,MACE,QAAQ,mBAAmB,KAAA,KAC3B,CAAC,OAAO,WAAW,CAAC,SAAS,OAAO,eAAe,EACnD;AAEA,UAAO,sBAAsB,OAAO;AACpC,UAAO,iBAAiB;;AAE1B,QAAM,OAAO;AAeb,OAAK,SAAS,IAAIC,OAAAA,OANG;GACnB,QARA,QAAQ,UACR,QAAQ,iBAAA,GAAA,0BAAA,wBACe,iBAAiB;GAOxC,cAJA,QAAQ,iBAAA,GAAA,0BAAA,wBAAuC,sBAAsB;GAKrE,yBAAyB;GACzB,SAAS,QAAQ;GAClB,CAC2C;AAC5C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,UAAU,QAAQ,WAAW,KAAK;AACvC,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,sBACH,QAAQ,uBAAuB,KAAK;AACtC,OAAK,OAAO,QAAQ;;;;;;;;;;;;CAatB,6BACE,UAC0B;AAC1B,MAAI,KAAK,wBAAwB,MAC/B,QAAO,SAAS,SAAS,QAAQ;AAiB/B,UAfE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,IAAK,QAAO,EAAE;AACxB,WAAO;KACL,MAAM;KACN,WAAW,KAAK;KACjB;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,KAAK,cAAc,KAAA,EACtB,IAAI,EAAE;IAEX;MAEF,QAAO,SAAS,SAAS,QAAQ;AAqB/B,UAnBE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,SAAU,QAAO,EAAE;AAC7B,WAAO;KACL,MAAM;KACN,WAAW,EACT,KAAK,KAAK,UACX;KACF;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,SAAS,KAAK,aACd,OAAO,KAAK,UAAU,QAAQ,YAC9B,KAAK,UAAU,QAAQ,KAAA,EAC1B,IAAI,EAAE;IAEX;;;CAKN,MAAM,MAAM,OAA0D;EACpE,MAAM,sBAAsB;GAC1B,OAAO,KAAK;GACZ,QAAQ;GACR,GAAG;GACH,MAAM,KAAK;GACX,iBAAiB,KAAK;GACtB,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,MAAM,KAAK;GACZ;AAED,MAAI,KAAK,IAAI,GAAG;GACd,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,UAC7B,KAAK,OAAO,OAAO,SAAS,oBAAoB,CACjD,CACF;AAED,UAAO,KAAK,6BAA6B,QAAQ;;EAGnD,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS,oBAAoB;EAEvE,IAAI,OAAO;AACX,MAAI,KAAK,wBAAwB,MAC/B,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,IAAI,CACxB,QAAQ,QAAuB,QAAQ,YAAY,IAAI,EAAE;MAE9D,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,SAAS,CAC7B,QAAQ,aAAiC,aAAa,YAAY,IACrE,EAAE;AAEN,SAAO"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"dalle.js","names":["OpenAIClient"],"sources":["../../src/tools/dalle.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport {\n MessageContentComplex,\n MessageContentImageUrl,\n} from \"@langchain/core/messages\";\n\n/**\n * @see https://platform.openai.com/docs/api-reference/images/create\n */\nexport type OpenAIImageModelId =\n | OpenAIClient.ImageModel\n | (string & NonNullable<unknown>);\n\n/**\n * An interface for the Dall-E API Wrapper.\n */\nexport interface DallEAPIWrapperParams extends ToolParams {\n /**\n * The OpenAI API key\n * Alias for `apiKey`\n */\n openAIApiKey?: string;\n /**\n * The OpenAI API key\n */\n apiKey?: string;\n /**\n * The model to use.\n * Alias for `model`\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n * @deprecated Use `model` instead.\n */\n modelName?: OpenAIImageModelId;\n /**\n * The model to use.\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n */\n model?: OpenAIImageModelId;\n /**\n * The style of the generated images. Must be one of vivid or natural.\n * Vivid causes the model to lean towards generating hyper-real and dramatic images.\n * Natural causes the model to produce more natural, less hyper-real looking images.\n * @default \"vivid\"\n */\n style?: \"natural\" | \"vivid\";\n /**\n * The quality of the image that will be generated. ‘hd’ creates images with finer\n * details and greater consistency across the image.\n * @default \"standard\"\n */\n quality?: \"standard\" | \"hd\";\n /**\n * The number of images to generate.\n * Must be between 1 and 10.\n * For dall-e-3, only `n: 1` is supported.\n * @default 1\n */\n n?: number;\n /**\n * The size of the generated images.\n * Must be one of 256x256, 512x512, or 1024x1024 for DALL·E-2 models.\n * Must be one of 1024x1024, 1792x1024, or 1024x1792 for DALL·E-3 models.\n * @default \"1024x1024\"\n */\n size?: \"256x256\" | \"512x512\" | \"1024x1024\" | \"1792x1024\" | \"1024x1792\";\n /**\n * The format in which the generated images are returned.\n * Must be one of \"url\" or \"b64_json\".\n * @default \"url\"\n */\n dallEResponseFormat?: \"url\" | \"b64_json\";\n /**\n * @deprecated Use dallEResponseFormat instead for the Dall-E response type.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n responseFormat?: any;\n /**\n * A unique identifier representing your end-user, which will help\n * OpenAI to monitor and detect abuse.\n */\n user?: string;\n /**\n * The organization to use\n */\n organization?: string;\n /**\n * The base URL of the OpenAI API.\n */\n baseUrl?: string;\n}\n\n/**\n * A tool for generating images with Open AIs Dall-E 2 or 3 API.\n */\nexport class DallEAPIWrapper extends Tool {\n static lc_name() {\n return \"DallEAPIWrapper\";\n }\n\n name = \"dalle_api_wrapper\";\n\n description =\n \"A wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.\";\n\n protected client: OpenAIClient;\n\n static readonly toolName = \"dalle_api_wrapper\";\n\n private model = \"dall-e-3\";\n\n private style: \"natural\" | \"vivid\" = \"vivid\";\n\n private quality: \"standard\" | \"hd\" = \"standard\";\n\n private n = 1;\n\n private size:\n | \"256x256\"\n | \"512x512\"\n | \"1024x1024\"\n | \"1792x1024\"\n | \"1024x1792\" = \"1024x1024\";\n\n private dallEResponseFormat: \"url\" | \"b64_json\" = \"url\";\n\n private user?: string;\n\n constructor(fields?: DallEAPIWrapperParams) {\n // Shim for new base tool param name\n if (\n fields?.responseFormat !== undefined &&\n [\"url\", \"b64_json\"].includes(fields.responseFormat)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields.dallEResponseFormat = fields.responseFormat as any;\n fields.responseFormat = \"content\";\n }\n super(fields);\n const openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n const organization =\n fields?.organization ?? getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n const clientConfig = {\n apiKey: openAIApiKey,\n organization,\n dangerouslyAllowBrowser: true,\n baseURL: fields?.baseUrl,\n };\n this.client = new OpenAIClient(clientConfig);\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.style = fields?.style ?? this.style;\n this.quality = fields?.quality ?? this.quality;\n this.n = fields?.n ?? this.n;\n this.size = fields?.size ?? this.size;\n this.dallEResponseFormat =\n fields?.dallEResponseFormat ?? this.dallEResponseFormat;\n this.user = fields?.user;\n }\n\n /**\n * Processes the API response if multiple images are generated.\n * Returns a list of MessageContentImageUrl objects. If the response\n * format is `url`, then the `image_url` field will contain the URL.\n * If it is `b64_json`, then the `image_url` field will contain an object\n * with a `url` field with the base64 encoded image.\n *\n * @param {OpenAIClient.Images.ImagesResponse[]} response The API response\n * @returns {MessageContentImageUrl[]}\n */\n private processMultipleGeneratedUrls(\n response: OpenAIClient.Images.ImagesResponse[]\n ): MessageContentImageUrl[] {\n if (this.dallEResponseFormat === \"url\") {\n return response.flatMap((res) => {\n const imageUrlContent =\n res.data\n ?.flatMap((item) => {\n if (!item.url) return [];\n return {\n type: \"image_url\" as const,\n image_url: item.url,\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"string\" &&\n item.image_url !== undefined\n ) ?? [];\n return imageUrlContent;\n });\n } else {\n return response.flatMap((res) => {\n const b64Content =\n res.data\n ?.flatMap((item) => {\n if (!item.b64_json) return [];\n return {\n type: \"image_url\" as const,\n image_url: {\n url: item.b64_json,\n },\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"object\" &&\n \"url\" in item.image_url &&\n typeof item.image_url.url === \"string\" &&\n item.image_url.url !== undefined\n ) ?? [];\n return b64Content;\n });\n }\n }\n\n /** @ignore */\n async _call(input: string): Promise<string | MessageContentComplex[]> {\n const generateImageFields = {\n model: this.model,\n prompt: input,\n n: 1,\n size: this.size,\n response_format: this.dallEResponseFormat,\n style: this.style,\n quality: this.quality,\n user: this.user,\n };\n\n if (this.n > 1) {\n const results = await Promise.all(\n Array.from({ length: this.n }).map(() =>\n this.client.images.generate(generateImageFields)\n )\n );\n\n return this.processMultipleGeneratedUrls(results);\n }\n\n const response = await this.client.images.generate(generateImageFields);\n\n let data = \"\";\n if (this.dallEResponseFormat === \"url\") {\n [data] =\n response.data\n ?.map((item) => item.url)\n .filter((url): url is string => url !== \"undefined\") ?? [];\n } else {\n [data] =\n response.data\n ?.map((item) => item.b64_json)\n .filter((b64_json): b64_json is string => b64_json !== \"undefined\") ??\n [];\n }\n return data;\n }\n}\n"],"mappings":";;;;;;;AAkGA,IAAa,kBAAb,cAAqC,KAAK;CACxC,OAAO,UAAU;AACf,SAAO;;CAGT,OAAO;CAEP,cACE;CAEF;CAEA,OAAgB,WAAW;CAE3B,QAAgB;CAEhB,QAAqC;CAErC,UAAqC;CAErC,IAAY;CAEZ,OAKkB;CAElB,sBAAkD;CAElD;CAEA,YAAY,QAAgC;AAE1C,MACE,QAAQ,mBAAmB,KAAA,KAC3B,CAAC,OAAO,WAAW,CAAC,SAAS,OAAO,eAAe,EACnD;AAEA,UAAO,sBAAsB,OAAO;AACpC,UAAO,iBAAiB;;AAE1B,QAAM,OAAO;AAeb,OAAK,SAAS,IAAIA,OANG;GACnB,QARA,QAAQ,UACR,QAAQ,gBACR,uBAAuB,iBAAiB;GAOxC,cAJA,QAAQ,gBAAgB,uBAAuB,sBAAsB;GAKrE,yBAAyB;GACzB,SAAS,QAAQ;GAClB,CAC2C;AAC5C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,UAAU,QAAQ,WAAW,KAAK;AACvC,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,sBACH,QAAQ,uBAAuB,KAAK;AACtC,OAAK,OAAO,QAAQ;;;;;;;;;;;;CAatB,6BACE,UAC0B;AAC1B,MAAI,KAAK,wBAAwB,MAC/B,QAAO,SAAS,SAAS,QAAQ;AAiB/B,UAfE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,IAAK,QAAO,EAAE;AACxB,WAAO;KACL,MAAM;KACN,WAAW,KAAK;KACjB;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,KAAK,cAAc,KAAA,EACtB,IAAI,EAAE;IAEX;MAEF,QAAO,SAAS,SAAS,QAAQ;AAqB/B,UAnBE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,SAAU,QAAO,EAAE;AAC7B,WAAO;KACL,MAAM;KACN,WAAW,EACT,KAAK,KAAK,UACX;KACF;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,SAAS,KAAK,aACd,OAAO,KAAK,UAAU,QAAQ,YAC9B,KAAK,UAAU,QAAQ,KAAA,EAC1B,IAAI,EAAE;IAEX;;;CAKN,MAAM,MAAM,OAA0D;EACpE,MAAM,sBAAsB;GAC1B,OAAO,KAAK;GACZ,QAAQ;GACR,GAAG;GACH,MAAM,KAAK;GACX,iBAAiB,KAAK;GACtB,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,MAAM,KAAK;GACZ;AAED,MAAI,KAAK,IAAI,GAAG;GACd,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,UAC7B,KAAK,OAAO,OAAO,SAAS,oBAAoB,CACjD,CACF;AAED,UAAO,KAAK,6BAA6B,QAAQ;;EAGnD,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS,oBAAoB;EAEvE,IAAI,OAAO;AACX,MAAI,KAAK,wBAAwB,MAC/B,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,IAAI,CACxB,QAAQ,QAAuB,QAAQ,YAAY,IAAI,EAAE;MAE9D,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,SAAS,CAC7B,QAAQ,aAAiC,aAAa,YAAY,IACrE,EAAE;AAEN,SAAO"} | ||
| {"version":3,"file":"dalle.js","names":["OpenAIClient"],"sources":["../../src/tools/dalle.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport {\n MessageContentComplex,\n MessageContentImageUrl,\n} from \"@langchain/core/messages\";\n\n/**\n * @see https://platform.openai.com/docs/api-reference/images/create\n */\nexport type OpenAIImageModelId =\n | OpenAIClient.ImageModel\n | (string & NonNullable<unknown>);\n\n/**\n * An interface for the Dall-E API Wrapper.\n */\nexport interface DallEAPIWrapperParams extends ToolParams {\n /**\n * The OpenAI API key\n * Alias for `apiKey`\n */\n openAIApiKey?: string;\n /**\n * The OpenAI API key\n */\n apiKey?: string;\n /**\n * The model to use.\n * Alias for `model`\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n * @deprecated Use `model` instead.\n */\n modelName?: OpenAIImageModelId;\n /**\n * The model to use.\n * @params \"dall-e-2\" | \"dall-e-3\"\n * @default \"dall-e-3\"\n */\n model?: OpenAIImageModelId;\n /**\n * The style of the generated images. Must be one of vivid or natural.\n * Vivid causes the model to lean towards generating hyper-real and dramatic images.\n * Natural causes the model to produce more natural, less hyper-real looking images.\n * @default \"vivid\"\n */\n style?: \"natural\" | \"vivid\";\n /**\n * The quality of the image that will be generated. ‘hd’ creates images with finer\n * details and greater consistency across the image.\n * @default \"standard\"\n */\n quality?: \"standard\" | \"hd\";\n /**\n * The number of images to generate.\n * Must be between 1 and 10.\n * For dall-e-3, only `n: 1` is supported.\n * @default 1\n */\n n?: number;\n /**\n * The size of the generated images.\n * Must be one of 256x256, 512x512, or 1024x1024 for DALL·E-2 models.\n * Must be one of 1024x1024, 1792x1024, or 1024x1792 for DALL·E-3 models.\n * @default \"1024x1024\"\n */\n size?: \"256x256\" | \"512x512\" | \"1024x1024\" | \"1792x1024\" | \"1024x1792\";\n /**\n * The format in which the generated images are returned.\n * Must be one of \"url\" or \"b64_json\".\n * @default \"url\"\n */\n dallEResponseFormat?: \"url\" | \"b64_json\";\n /**\n * @deprecated Use dallEResponseFormat instead for the Dall-E response type.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n responseFormat?: any;\n /**\n * A unique identifier representing your end-user, which will help\n * OpenAI to monitor and detect abuse.\n */\n user?: string;\n /**\n * The organization to use\n */\n organization?: string;\n /**\n * The base URL of the OpenAI API.\n */\n baseUrl?: string;\n}\n\n/**\n * A tool for generating images with Open AIs Dall-E 2 or 3 API.\n */\nexport class DallEAPIWrapper extends Tool {\n static lc_name() {\n return \"DallEAPIWrapper\";\n }\n\n name = \"dalle_api_wrapper\";\n\n description =\n \"A wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.\";\n\n protected client: OpenAIClient;\n\n static readonly toolName = \"dalle_api_wrapper\";\n\n private model = \"dall-e-3\";\n\n private style: \"natural\" | \"vivid\" = \"vivid\";\n\n private quality: \"standard\" | \"hd\" = \"standard\";\n\n private n = 1;\n\n private size:\n | \"256x256\"\n | \"512x512\"\n | \"1024x1024\"\n | \"1792x1024\"\n | \"1024x1792\" = \"1024x1024\";\n\n private dallEResponseFormat: \"url\" | \"b64_json\" = \"url\";\n\n private user?: string;\n\n constructor(fields?: DallEAPIWrapperParams) {\n // Shim for new base tool param name\n if (\n fields?.responseFormat !== undefined &&\n [\"url\", \"b64_json\"].includes(fields.responseFormat)\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields.dallEResponseFormat = fields.responseFormat as any;\n fields.responseFormat = \"content\";\n }\n super(fields);\n const openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n const organization =\n fields?.organization ?? getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n const clientConfig = {\n apiKey: openAIApiKey,\n organization,\n dangerouslyAllowBrowser: true,\n baseURL: fields?.baseUrl,\n };\n this.client = new OpenAIClient(clientConfig);\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n this.style = fields?.style ?? this.style;\n this.quality = fields?.quality ?? this.quality;\n this.n = fields?.n ?? this.n;\n this.size = fields?.size ?? this.size;\n this.dallEResponseFormat =\n fields?.dallEResponseFormat ?? this.dallEResponseFormat;\n this.user = fields?.user;\n }\n\n /**\n * Processes the API response if multiple images are generated.\n * Returns a list of MessageContentImageUrl objects. If the response\n * format is `url`, then the `image_url` field will contain the URL.\n * If it is `b64_json`, then the `image_url` field will contain an object\n * with a `url` field with the base64 encoded image.\n *\n * @param {OpenAIClient.Images.ImagesResponse[]} response The API response\n * @returns {MessageContentImageUrl[]}\n */\n private processMultipleGeneratedUrls(\n response: OpenAIClient.Images.ImagesResponse[]\n ): MessageContentImageUrl[] {\n if (this.dallEResponseFormat === \"url\") {\n return response.flatMap((res) => {\n const imageUrlContent =\n res.data\n ?.flatMap((item) => {\n if (!item.url) return [];\n return {\n type: \"image_url\" as const,\n image_url: item.url,\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"string\" &&\n item.image_url !== undefined\n ) ?? [];\n return imageUrlContent;\n });\n } else {\n return response.flatMap((res) => {\n const b64Content =\n res.data\n ?.flatMap((item) => {\n if (!item.b64_json) return [];\n return {\n type: \"image_url\" as const,\n image_url: {\n url: item.b64_json,\n },\n };\n })\n .filter(\n (item) =>\n item !== undefined &&\n item.type === \"image_url\" &&\n typeof item.image_url === \"object\" &&\n \"url\" in item.image_url &&\n typeof item.image_url.url === \"string\" &&\n item.image_url.url !== undefined\n ) ?? [];\n return b64Content;\n });\n }\n }\n\n /** @ignore */\n async _call(input: string): Promise<string | MessageContentComplex[]> {\n const generateImageFields = {\n model: this.model,\n prompt: input,\n n: 1,\n size: this.size,\n response_format: this.dallEResponseFormat,\n style: this.style,\n quality: this.quality,\n user: this.user,\n };\n\n if (this.n > 1) {\n const results = await Promise.all(\n Array.from({ length: this.n }).map(() =>\n this.client.images.generate(generateImageFields)\n )\n );\n\n return this.processMultipleGeneratedUrls(results);\n }\n\n const response = await this.client.images.generate(generateImageFields);\n\n let data = \"\";\n if (this.dallEResponseFormat === \"url\") {\n [data] =\n response.data\n ?.map((item) => item.url)\n .filter((url): url is string => url !== \"undefined\") ?? [];\n } else {\n [data] =\n response.data\n ?.map((item) => item.b64_json)\n .filter((b64_json): b64_json is string => b64_json !== \"undefined\") ??\n [];\n }\n return data;\n }\n}\n"],"mappings":";;;;;;;AAkGA,IAAa,kBAAb,cAAqC,KAAK;CACxC,OAAO,UAAU;AACf,SAAO;;CAGT,OAAO;CAEP,cACE;CAEF;CAEA,OAAgB,WAAW;CAE3B,QAAgB;CAEhB,QAAqC;CAErC,UAAqC;CAErC,IAAY;CAEZ,OAKkB;CAElB,sBAAkD;CAElD;CAEA,YAAY,QAAgC;AAE1C,MACE,QAAQ,mBAAmB,KAAA,KAC3B,CAAC,OAAO,WAAW,CAAC,SAAS,OAAO,eAAe,EACnD;AAEA,UAAO,sBAAsB,OAAO;AACpC,UAAO,iBAAiB;;AAE1B,QAAM,OAAO;AAeb,OAAK,SAAS,IAAIA,OANG;GACnB,QARA,QAAQ,UACR,QAAQ,gBACR,uBAAuB,iBAAiB;GAOxC,cAJA,QAAQ,gBAAgB,uBAAuB,sBAAsB;GAKrE,yBAAyB;GACzB,SAAS,QAAQ;GAClB,CAC2C;AAC5C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,UAAU,QAAQ,WAAW,KAAK;AACvC,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,sBACH,QAAQ,uBAAuB,KAAK;AACtC,OAAK,OAAO,QAAQ;;;;;;;;;;;;CAatB,6BACE,UAC0B;AAC1B,MAAI,KAAK,wBAAwB,MAC/B,QAAO,SAAS,SAAS,QAAQ;AAiB/B,UAfE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,IAAK,QAAO,EAAE;AACxB,WAAO;KACL,MAAM;KACN,WAAW,KAAK;KACjB;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,KAAK,cAAc,KAAA,EACtB,IAAI,EAAE;IAEX;MAEF,QAAO,SAAS,SAAS,QAAQ;AAqB/B,UAnBE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,SAAU,QAAO,EAAE;AAC7B,WAAO;KACL,MAAM;KACN,WAAW,EACT,KAAK,KAAK,UACX;KACF;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,SAAS,KAAK,aACd,OAAO,KAAK,UAAU,QAAQ,YAC9B,KAAK,UAAU,QAAQ,KAAA,EAC1B,IAAI,EAAE;IAEX;;;CAKN,MAAM,MAAM,OAA0D;EACpE,MAAM,sBAAsB;GAC1B,OAAO,KAAK;GACZ,QAAQ;GACR,GAAG;GACH,MAAM,KAAK;GACX,iBAAiB,KAAK;GACtB,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,MAAM,KAAK;GACZ;AAED,MAAI,KAAK,IAAI,GAAG;GACd,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,UAC7B,KAAK,OAAO,OAAO,SAAS,oBAAoB,CACjD,CACF;AAED,UAAO,KAAK,6BAA6B,QAAQ;;EAGnD,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS,oBAAoB;EAEvE,IAAI,OAAO;AACX,MAAI,KAAK,wBAAwB,MAC/B,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,IAAI,CACxB,QAAQ,QAAuB,QAAQ,YAAY,IAAI,EAAE;MAE9D,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,SAAS,CAC7B,QAAQ,aAAiC,aAAa,YAAY,IACrE,EAAE;AAEN,SAAO"} |
@@ -12,2 +12,10 @@ import { OpenAI } from "openai"; | ||
| type LocalShellAction = OpenAI.Responses.ResponseOutputItem.LocalShellCall.Action; | ||
| declare const LocalShellActionSchema: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"exec">; | ||
| command: z.ZodArray<z.ZodString>; | ||
| env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; | ||
| working_directory: z.ZodOptional<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| user: z.ZodOptional<z.ZodString>; | ||
| }, z.core.$strip>]>; | ||
| /** | ||
@@ -157,12 +165,5 @@ * Options for the Local Shell tool. | ||
| */ | ||
| declare function localShell(options: LocalShellOptions): DynamicStructuredTool<z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"exec">; | ||
| command: z.ZodArray<z.ZodString>; | ||
| env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; | ||
| working_directory: z.ZodOptional<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| user: z.ZodOptional<z.ZodString>; | ||
| }, z.core.$strip>]>, OpenAI.Responses.ResponseOutputItem.LocalShellCall.Action, unknown, string, unknown, string>; | ||
| declare function localShell(options: LocalShellOptions): DynamicStructuredTool<typeof LocalShellActionSchema, LocalShellAction, unknown, string>; | ||
| //#endregion | ||
| export { LocalShellAction, LocalShellOptions, LocalShellTool, localShell }; | ||
| //# sourceMappingURL=localShell.d.cts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"localShell.d.cts","names":[],"sources":["../../src/tools/localShell.ts"],"mappings":";;;;;;;AASA;;;KAAY,gBAAA,GACV,MAAA,CAAa,SAAA,CAAU,kBAAA,CAAmB,cAAA,CAAe,MAAA;;AA6C3D;;UA3BiB,iBAAA;EA2BkD;;;;;;;AAsHnE;;;;;;;;;;;;;EA5HE,OAAA,GAAU,MAAA,EAAQ,gBAAA,cAA8B,OAAA;AAAA;;;;KAMtC,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,IAAA,CAAK,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsHzC,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAiB,qBAAA,CAAA,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"localShell.d.cts","names":[],"sources":["../../src/tools/localShell.ts"],"mappings":";;;;;;;AASA;;;KAAY,gBAAA,GACV,MAAA,CAAa,SAAA,CAAU,kBAAA,CAAmB,cAAA,CAAe,MAAA;AAAA,cAa9C,sBAAA,EAAsB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;UAKlB,iBAAA;;;;;;;;;;;;;;;;;;;;;EAqBf,OAAA,GAAU,MAAA,EAAQ,gBAAA,cAA8B,OAAA;AAAA;;;;KAMtC,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,IAAA,CAAK,UAAA;;;;;;;;;;;;;;;;;;;;;;;;AA3BzD;;;;;;;;;;AA2BA;;;;;;;;;;AAsHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAed,qBAAA,QACX,sBAAA,EACP,gBAAA"} |
@@ -12,2 +12,10 @@ import { OpenAI } from "openai"; | ||
| type LocalShellAction = OpenAI.Responses.ResponseOutputItem.LocalShellCall.Action; | ||
| declare const LocalShellActionSchema: z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"exec">; | ||
| command: z.ZodArray<z.ZodString>; | ||
| env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; | ||
| working_directory: z.ZodOptional<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| user: z.ZodOptional<z.ZodString>; | ||
| }, z.core.$strip>]>; | ||
| /** | ||
@@ -157,12 +165,5 @@ * Options for the Local Shell tool. | ||
| */ | ||
| declare function localShell(options: LocalShellOptions): DynamicStructuredTool<z.ZodUnion<readonly [z.ZodObject<{ | ||
| type: z.ZodLiteral<"exec">; | ||
| command: z.ZodArray<z.ZodString>; | ||
| env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; | ||
| working_directory: z.ZodOptional<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| user: z.ZodOptional<z.ZodString>; | ||
| }, z.core.$strip>]>, OpenAI.Responses.ResponseOutputItem.LocalShellCall.Action, unknown, string, unknown, string>; | ||
| declare function localShell(options: LocalShellOptions): DynamicStructuredTool<typeof LocalShellActionSchema, LocalShellAction, unknown, string>; | ||
| //#endregion | ||
| export { LocalShellAction, LocalShellOptions, LocalShellTool, localShell }; | ||
| //# sourceMappingURL=localShell.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"localShell.d.ts","names":[],"sources":["../../src/tools/localShell.ts"],"mappings":";;;;;;;AASA;;;KAAY,gBAAA,GACV,MAAA,CAAa,SAAA,CAAU,kBAAA,CAAmB,cAAA,CAAe,MAAA;;AA6C3D;;UA3BiB,iBAAA;EA2BkD;;;;;;;AAsHnE;;;;;;;;;;;;;EA5HE,OAAA,GAAU,MAAA,EAAQ,gBAAA,cAA8B,OAAA;AAAA;;;;KAMtC,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,IAAA,CAAK,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsHzC,UAAA,CAAW,OAAA,EAAS,iBAAA,GAAiB,qBAAA,CAAA,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"localShell.d.ts","names":[],"sources":["../../src/tools/localShell.ts"],"mappings":";;;;;;;AASA;;;KAAY,gBAAA,GACV,MAAA,CAAa,SAAA,CAAU,kBAAA,CAAmB,cAAA,CAAe,MAAA;AAAA,cAa9C,sBAAA,EAAsB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;UAKlB,iBAAA;;;;;;;;;;;;;;;;;;;;;EAqBf,OAAA,GAAU,MAAA,EAAQ,gBAAA,cAA8B,OAAA;AAAA;;;;KAMtC,cAAA,GAAiB,MAAA,CAAa,SAAA,CAAU,IAAA,CAAK,UAAA;;;;;;;;;;;;;;;;;;;;;;;;AA3BzD;;;;;;;;;;AA2BA;;;;;;;;;;AAsHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,UAAA,CAAW,OAAA,EAAS,iBAAA,GAed,qBAAA,QACX,sBAAA,EACP,gBAAA"} |
@@ -11,2 +11,7 @@ import { OpenAI } from "openai"; | ||
| type ShellAction = OpenAI.Responses.ResponseFunctionShellToolCall.Action; | ||
| declare const ShellActionSchema: z.ZodObject<{ | ||
| commands: z.ZodArray<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| max_output_length: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>; | ||
| /** | ||
@@ -214,9 +219,5 @@ * Result of a single shell command execution. | ||
| */ | ||
| declare function shell(options: ShellOptions): DynamicStructuredTool<z.ZodObject<{ | ||
| commands: z.ZodArray<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| max_output_length: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>, OpenAI.Responses.ResponseFunctionShellToolCall.Action, unknown, string, unknown, string>; | ||
| declare function shell(options: ShellOptions): DynamicStructuredTool<typeof ShellActionSchema, ShellAction, unknown, string>; | ||
| //#endregion | ||
| export { ShellAction, ShellCallOutcome, ShellCommandOutput, ShellOptions, ShellResult, ShellTool, shell }; | ||
| //# sourceMappingURL=shell.d.cts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"shell.d.cts","names":[],"sources":["../../src/tools/shell.ts"],"mappings":";;;;;;;AAQA;;KAAY,WAAA,GACV,MAAA,CAAa,SAAA,CAAU,6BAAA,CAA8B,MAAA;;;AAqBvD;;KAAY,kBAAA,GACV,MAAA,CAAa,SAAA,CAAU,sCAAA;;;;KAKb,gBAAA,GAAmB,kBAAA;;;AAA/B;;UAMiB,WAAA;EANc;;AAM/B;;EAKE,MAAA,EAAQ,kBAAA;EAAkB;;;;EAK1B,eAAA;AAAA;AAMF;;;AAAA,UAAiB,YAAA;EAuCmB;;;;;;;;;;;;;AAMpC;;;;;;;;;AAqIA;;;;;;;;;;;;;;;;EA3IE,OAAA,GAAU,MAAA,EAAQ,WAAA,KAAgB,WAAA,GAAc,OAAA,CAAQ,WAAA;AAAA;;;;KAM9C,SAAA,GAAY,MAAA,CAAa,SAAA,CAAU,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqI/B,KAAA,CAAM,OAAA,EAAS,YAAA,GAAY,qBAAA,CAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"shell.d.cts","names":[],"sources":["../../src/tools/shell.ts"],"mappings":";;;;;;;AAQA;;KAAY,WAAA,GACV,MAAA,CAAa,SAAA,CAAU,6BAAA,CAA8B,MAAA;AAAA,cAG1C,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;;AAA9B;;KAkBY,kBAAA,GACV,MAAA,CAAa,SAAA,CAAU,sCAAA;;;;KAKb,gBAAA,GAAmB,kBAAA;;;;;UAMd,WAAA;EA9Ba;;;;EAmC5B,MAAA,EAAQ,kBAAA;;;;;EAKR,eAAA;AAAA;;;;UAMe,YAAA;;;;;;;;;AA5BjB;;;;;;;;;AAMA;;;;;AAMA;;;;;;;;;AAgBA;;;;;;;EAuCE,OAAA,GAAU,MAAA,EAAQ,WAAA,KAAgB,WAAA,GAAc,OAAA,CAAQ,WAAA;AAAA;;;;KAM9C,SAAA,GAAY,MAAA,CAAa,SAAA,CAAU,iBAAA;;;;;AAA/C;;;;;;;;;AAqIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,KAAA,CAAM,OAAA,EAAS,YAAA,GAyBT,qBAAA,QACX,iBAAA,EACP,WAAA"} |
@@ -11,2 +11,7 @@ import { OpenAI } from "openai"; | ||
| type ShellAction = OpenAI.Responses.ResponseFunctionShellToolCall.Action; | ||
| declare const ShellActionSchema: z.ZodObject<{ | ||
| commands: z.ZodArray<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| max_output_length: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>; | ||
| /** | ||
@@ -214,9 +219,5 @@ * Result of a single shell command execution. | ||
| */ | ||
| declare function shell(options: ShellOptions): DynamicStructuredTool<z.ZodObject<{ | ||
| commands: z.ZodArray<z.ZodString>; | ||
| timeout_ms: z.ZodOptional<z.ZodNumber>; | ||
| max_output_length: z.ZodOptional<z.ZodNumber>; | ||
| }, z.core.$strip>, OpenAI.Responses.ResponseFunctionShellToolCall.Action, unknown, string, unknown, string>; | ||
| declare function shell(options: ShellOptions): DynamicStructuredTool<typeof ShellActionSchema, ShellAction, unknown, string>; | ||
| //#endregion | ||
| export { ShellAction, ShellCallOutcome, ShellCommandOutput, ShellOptions, ShellResult, ShellTool, shell }; | ||
| //# sourceMappingURL=shell.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"shell.d.ts","names":[],"sources":["../../src/tools/shell.ts"],"mappings":";;;;;;;AAQA;;KAAY,WAAA,GACV,MAAA,CAAa,SAAA,CAAU,6BAAA,CAA8B,MAAA;;;AAqBvD;;KAAY,kBAAA,GACV,MAAA,CAAa,SAAA,CAAU,sCAAA;;;;KAKb,gBAAA,GAAmB,kBAAA;;;AAA/B;;UAMiB,WAAA;EANc;;AAM/B;;EAKE,MAAA,EAAQ,kBAAA;EAAkB;;;;EAK1B,eAAA;AAAA;AAMF;;;AAAA,UAAiB,YAAA;EAuCmB;;;;;;;;;;;;;AAMpC;;;;;;;;;AAqIA;;;;;;;;;;;;;;;;EA3IE,OAAA,GAAU,MAAA,EAAQ,WAAA,KAAgB,WAAA,GAAc,OAAA,CAAQ,WAAA;AAAA;;;;KAM9C,SAAA,GAAY,MAAA,CAAa,SAAA,CAAU,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqI/B,KAAA,CAAM,OAAA,EAAS,YAAA,GAAY,qBAAA,CAAA,CAAA,CAAA,SAAA"} | ||
| {"version":3,"file":"shell.d.ts","names":[],"sources":["../../src/tools/shell.ts"],"mappings":";;;;;;;AAQA;;KAAY,WAAA,GACV,MAAA,CAAa,SAAA,CAAU,6BAAA,CAA8B,MAAA;AAAA,cAG1C,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;;AAA9B;;KAkBY,kBAAA,GACV,MAAA,CAAa,SAAA,CAAU,sCAAA;;;;KAKb,gBAAA,GAAmB,kBAAA;;;;;UAMd,WAAA;EA9Ba;;;;EAmC5B,MAAA,EAAQ,kBAAA;;;;;EAKR,eAAA;AAAA;;;;UAMe,YAAA;;;;;;;;;AA5BjB;;;;;;;;;AAMA;;;;;AAMA;;;;;;;;;AAgBA;;;;;;;EAuCE,OAAA,GAAU,MAAA,EAAQ,WAAA,KAAgB,WAAA,GAAc,OAAA,CAAQ,WAAA;AAAA;;;;KAM9C,SAAA,GAAY,MAAA,CAAa,SAAA,CAAU,iBAAA;;;;;AAA/C;;;;;;;;;AAqIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,KAAA,CAAM,OAAA,EAAS,YAAA,GAyBT,qBAAA,QACX,iBAAA,EACP,WAAA"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"errors.cjs","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// Duplicate of core\n// TODO: Remove once we stop supporting 0.2.x core versions\nexport type LangChainErrorCodes =\n | \"CONTEXT_OVERFLOW\"\n | \"INVALID_PROMPT_INPUT\"\n | \"INVALID_TOOL_RESULTS\"\n | \"MESSAGE_COERCION_FAILURE\"\n | \"MODEL_AUTHENTICATION\"\n | \"MODEL_NOT_FOUND\"\n | \"MODEL_RATE_LIMIT\"\n | \"OUTPUT_PARSING_FAILURE\";\n\nexport function addLangChainErrorFields(\n error: any,\n lc_error_code: LangChainErrorCodes\n) {\n (error as any).lc_error_code = lc_error_code;\n error.message = `${error.message}\\n\\nTroubleshooting URL: https://docs.langchain.com/oss/javascript/langchain/errors/${lc_error_code}/\\n`;\n return error;\n}\n"],"mappings":";AAcA,SAAgB,wBACd,OACA,eACA;AACC,OAAc,gBAAgB;AAC/B,OAAM,UAAU,GAAG,MAAM,QAAQ,sFAAsF,cAAc;AACrI,QAAO"} | ||
| {"version":3,"file":"errors.cjs","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\n\n// Duplicate of core\n// TODO: Remove once we stop supporting 0.2.x core versions\nexport type LangChainErrorCodes =\n | \"CONTEXT_OVERFLOW\"\n | \"INVALID_PROMPT_INPUT\"\n | \"INVALID_TOOL_RESULTS\"\n | \"MESSAGE_COERCION_FAILURE\"\n | \"MODEL_AUTHENTICATION\"\n | \"MODEL_NOT_FOUND\"\n | \"MODEL_RATE_LIMIT\"\n | \"OUTPUT_PARSING_FAILURE\";\n\nexport function addLangChainErrorFields(\n error: any,\n lc_error_code: LangChainErrorCodes\n) {\n (error as any).lc_error_code = lc_error_code;\n error.message = `${error.message}\\n\\nTroubleshooting URL: https://docs.langchain.com/oss/javascript/langchain/errors/${lc_error_code}/\\n`;\n return error;\n}\n"],"mappings":";AAcA,SAAgB,wBACd,OACA,eACA;AACC,OAAc,gBAAgB;AAC/B,OAAM,UAAU,GAAG,MAAM,QAAQ,sFAAsF,cAAc;AACrI,QAAO"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"errors.js","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// Duplicate of core\n// TODO: Remove once we stop supporting 0.2.x core versions\nexport type LangChainErrorCodes =\n | \"CONTEXT_OVERFLOW\"\n | \"INVALID_PROMPT_INPUT\"\n | \"INVALID_TOOL_RESULTS\"\n | \"MESSAGE_COERCION_FAILURE\"\n | \"MODEL_AUTHENTICATION\"\n | \"MODEL_NOT_FOUND\"\n | \"MODEL_RATE_LIMIT\"\n | \"OUTPUT_PARSING_FAILURE\";\n\nexport function addLangChainErrorFields(\n error: any,\n lc_error_code: LangChainErrorCodes\n) {\n (error as any).lc_error_code = lc_error_code;\n error.message = `${error.message}\\n\\nTroubleshooting URL: https://docs.langchain.com/oss/javascript/langchain/errors/${lc_error_code}/\\n`;\n return error;\n}\n"],"mappings":";AAcA,SAAgB,wBACd,OACA,eACA;AACC,OAAc,gBAAgB;AAC/B,OAAM,UAAU,GAAG,MAAM,QAAQ,sFAAsF,cAAc;AACrI,QAAO"} | ||
| {"version":3,"file":"errors.js","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\n\n// Duplicate of core\n// TODO: Remove once we stop supporting 0.2.x core versions\nexport type LangChainErrorCodes =\n | \"CONTEXT_OVERFLOW\"\n | \"INVALID_PROMPT_INPUT\"\n | \"INVALID_TOOL_RESULTS\"\n | \"MESSAGE_COERCION_FAILURE\"\n | \"MODEL_AUTHENTICATION\"\n | \"MODEL_NOT_FOUND\"\n | \"MODEL_RATE_LIMIT\"\n | \"OUTPUT_PARSING_FAILURE\";\n\nexport function addLangChainErrorFields(\n error: any,\n lc_error_code: LangChainErrorCodes\n) {\n (error as any).lc_error_code = lc_error_code;\n error.message = `${error.message}\\n\\nTroubleshooting URL: https://docs.langchain.com/oss/javascript/langchain/errors/${lc_error_code}/\\n`;\n return error;\n}\n"],"mappings":";AAcA,SAAgB,wBACd,OACA,eACA;AACC,OAAc,gBAAgB;AAC/B,OAAM,UAAU,GAAG,MAAM,QAAQ,sFAAsF,cAAc;AACrI,QAAO"} |
@@ -17,5 +17,9 @@ let _langchain_core_messages = require("@langchain/core/messages"); | ||
| } | ||
| const LC_AUTOGENERATED_FILENAME = "LC_AUTOGENERATED"; | ||
| function getRequiredFilenameFromMetadata(block) { | ||
| const filename = block.metadata?.filename ?? block.metadata?.name ?? block.metadata?.title; | ||
| if (!filename) throw new Error("a filename or name or title is needed via meta-data for OpenAI when working with multimodal blocks"); | ||
| if (!filename) { | ||
| console.warn("OpenAI may require a filename for file uploads. Specify a filename in the content block metadata, e.g.: { type: 'file', mimeType: '...', data: '...', metadata: { filename: 'my-file.pdf' } }. Using placeholder filename 'LC_AUTOGENERATED'."); | ||
| return LC_AUTOGENERATED_FILENAME; | ||
| } | ||
| return filename; | ||
@@ -22,0 +26,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"misc.cjs","names":["ChatMessage"],"sources":["../../src/utils/misc.ts"],"sourcesContent":["import type { OpenAI as OpenAIClient } from \"openai\";\nimport {\n BaseMessage,\n ChatMessage,\n ContentBlock,\n Data,\n} from \"@langchain/core/messages\";\n\nexport const iife = <T>(fn: () => T) => fn();\n\nexport function isReasoningModel(model?: string) {\n if (!model) return false;\n if (/^o\\d/.test(model ?? \"\")) return true;\n if (model.startsWith(\"gpt-5\") && !model.startsWith(\"gpt-5-chat\")) return true;\n return false;\n}\n\nexport function extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== \"system\" &&\n message.role !== \"developer\" &&\n message.role !== \"assistant\" &&\n message.role !== \"user\" &&\n message.role !== \"function\" &&\n message.role !== \"tool\"\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIClient.ChatCompletionRole;\n}\n\nexport function getFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string | undefined {\n return (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n}\n\nexport function getRequiredFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string {\n const filename = (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n\n if (!filename) {\n throw new Error(\n \"a filename or name or title is needed via meta-data for OpenAI when working with multimodal blocks\"\n );\n }\n\n return filename;\n}\nexport function messageToOpenAIRole(\n message: BaseMessage\n): OpenAIClient.ChatCompletionRole {\n const type = message._getType();\n switch (type) {\n case \"system\":\n return \"system\";\n case \"ai\":\n return \"assistant\";\n case \"human\":\n return \"user\";\n case \"function\":\n return \"function\";\n case \"tool\":\n return \"tool\";\n case \"generic\": {\n if (!ChatMessage.isInstance(message))\n throw new Error(\"Invalid generic chat message\");\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nexport function _modelPrefersResponsesAPI(model: string): boolean {\n if (model.includes(\"gpt-5.2-pro\")) return true;\n if (model.includes(\"gpt-5.4-pro\")) return true;\n // Codex models are Responses API only\n if (model.includes(\"codex\")) return true;\n return false;\n}\n"],"mappings":";;AAQA,MAAa,QAAW,OAAgB,IAAI;AAE5C,SAAgB,iBAAiB,OAAgB;AAC/C,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,OAAO,KAAK,SAAS,GAAG,CAAE,QAAO;AACrC,KAAI,MAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,WAAW,aAAa,CAAE,QAAO;AACzE,QAAO;;AAGT,SAAgB,gCAAgC,SAAsB;AACpE,KACE,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS,cACjB,QAAQ,SAAS,OAEjB,SAAQ,KAAK,yBAAyB,QAAQ,OAAO;AAGvD,QAAO,QAAQ;;AAGjB,SAAgB,wBACd,OAIoB;AACpB,QAAQ,MAAM,UAAU,YACtB,MAAM,UAAU,QAChB,MAAM,UAAU;;AAGpB,SAAgB,gCACd,OAIQ;CACR,MAAM,WAAY,MAAM,UAAU,YAChC,MAAM,UAAU,QAChB,MAAM,UAAU;AAElB,KAAI,CAAC,SACH,OAAM,IAAI,MACR,qGACD;AAGH,QAAO;;AAET,SAAgB,oBACd,SACiC;CACjC,MAAM,OAAO,QAAQ,UAAU;AAC/B,SAAQ,MAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,KACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK;AACH,OAAI,CAACA,yBAAAA,YAAY,WAAW,QAAQ,CAClC,OAAM,IAAI,MAAM,+BAA+B;AACjD,UAAO,gCAAgC,QAAQ;EAEjD,QACE,OAAM,IAAI,MAAM,yBAAyB,OAAO;;;AAItD,SAAgB,0BAA0B,OAAwB;AAChE,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAC1C,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAE1C,KAAI,MAAM,SAAS,QAAQ,CAAE,QAAO;AACpC,QAAO"} | ||
| {"version":3,"file":"misc.cjs","names":["ChatMessage"],"sources":["../../src/utils/misc.ts"],"sourcesContent":["import type { OpenAI as OpenAIClient } from \"openai\";\nimport {\n BaseMessage,\n ChatMessage,\n ContentBlock,\n Data,\n} from \"@langchain/core/messages\";\n\nexport const iife = <T>(fn: () => T) => fn();\n\nexport function isReasoningModel(model?: string) {\n if (!model) return false;\n if (/^o\\d/.test(model ?? \"\")) return true;\n if (model.startsWith(\"gpt-5\") && !model.startsWith(\"gpt-5-chat\")) return true;\n return false;\n}\n\nexport function extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== \"system\" &&\n message.role !== \"developer\" &&\n message.role !== \"assistant\" &&\n message.role !== \"user\" &&\n message.role !== \"function\" &&\n message.role !== \"tool\"\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIClient.ChatCompletionRole;\n}\n\nexport function getFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string | undefined {\n return (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n}\n\nexport const LC_AUTOGENERATED_FILENAME = \"LC_AUTOGENERATED\";\n\nexport function getRequiredFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string {\n const filename = (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n\n if (!filename) {\n console.warn(\n \"OpenAI may require a filename for file uploads. Specify a filename \" +\n \"in the content block metadata, e.g.: { type: 'file', mimeType: \" +\n \"'...', data: '...', metadata: { filename: 'my-file.pdf' } }. \" +\n \"Using placeholder filename 'LC_AUTOGENERATED'.\"\n );\n return LC_AUTOGENERATED_FILENAME;\n }\n\n return filename;\n}\nexport function messageToOpenAIRole(\n message: BaseMessage\n): OpenAIClient.ChatCompletionRole {\n const type = message._getType();\n switch (type) {\n case \"system\":\n return \"system\";\n case \"ai\":\n return \"assistant\";\n case \"human\":\n return \"user\";\n case \"function\":\n return \"function\";\n case \"tool\":\n return \"tool\";\n case \"generic\": {\n if (!ChatMessage.isInstance(message))\n throw new Error(\"Invalid generic chat message\");\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nexport function _modelPrefersResponsesAPI(model: string): boolean {\n if (model.includes(\"gpt-5.2-pro\")) return true;\n if (model.includes(\"gpt-5.4-pro\")) return true;\n // Codex models are Responses API only\n if (model.includes(\"codex\")) return true;\n return false;\n}\n"],"mappings":";;AAQA,MAAa,QAAW,OAAgB,IAAI;AAE5C,SAAgB,iBAAiB,OAAgB;AAC/C,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,OAAO,KAAK,SAAS,GAAG,CAAE,QAAO;AACrC,KAAI,MAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,WAAW,aAAa,CAAE,QAAO;AACzE,QAAO;;AAGT,SAAgB,gCAAgC,SAAsB;AACpE,KACE,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS,cACjB,QAAQ,SAAS,OAEjB,SAAQ,KAAK,yBAAyB,QAAQ,OAAO;AAGvD,QAAO,QAAQ;;AAGjB,SAAgB,wBACd,OAIoB;AACpB,QAAQ,MAAM,UAAU,YACtB,MAAM,UAAU,QAChB,MAAM,UAAU;;AAGpB,MAAa,4BAA4B;AAEzC,SAAgB,gCACd,OAIQ;CACR,MAAM,WAAY,MAAM,UAAU,YAChC,MAAM,UAAU,QAChB,MAAM,UAAU;AAElB,KAAI,CAAC,UAAU;AACb,UAAQ,KACN,gPAID;AACD,SAAO;;AAGT,QAAO;;AAET,SAAgB,oBACd,SACiC;CACjC,MAAM,OAAO,QAAQ,UAAU;AAC/B,SAAQ,MAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,KACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK;AACH,OAAI,CAACA,yBAAAA,YAAY,WAAW,QAAQ,CAClC,OAAM,IAAI,MAAM,+BAA+B;AACjD,UAAO,gCAAgC,QAAQ;EAEjD,QACE,OAAM,IAAI,MAAM,yBAAyB,OAAO;;;AAItD,SAAgB,0BAA0B,OAAwB;AAChE,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAC1C,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAE1C,KAAI,MAAM,SAAS,QAAQ,CAAE,QAAO;AACpC,QAAO"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"misc.d.cts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;iBA6DgB,mBAAA,CACd,OAAA,EAAS,WAAA,GACR,MAAA,CAAa,kBAAA"} | ||
| {"version":3,"file":"misc.d.cts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;iBAmEgB,mBAAA,CACd,OAAA,EAAS,WAAA,GACR,MAAA,CAAa,kBAAA"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"misc.d.ts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;iBA6DgB,mBAAA,CACd,OAAA,EAAS,WAAA,GACR,MAAA,CAAa,kBAAA"} | ||
| {"version":3,"file":"misc.d.ts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;iBAmEgB,mBAAA,CACd,OAAA,EAAS,WAAA,GACR,MAAA,CAAa,kBAAA"} |
@@ -17,5 +17,9 @@ import { ChatMessage } from "@langchain/core/messages"; | ||
| } | ||
| const LC_AUTOGENERATED_FILENAME = "LC_AUTOGENERATED"; | ||
| function getRequiredFilenameFromMetadata(block) { | ||
| const filename = block.metadata?.filename ?? block.metadata?.name ?? block.metadata?.title; | ||
| if (!filename) throw new Error("a filename or name or title is needed via meta-data for OpenAI when working with multimodal blocks"); | ||
| if (!filename) { | ||
| console.warn("OpenAI may require a filename for file uploads. Specify a filename in the content block metadata, e.g.: { type: 'file', mimeType: '...', data: '...', metadata: { filename: 'my-file.pdf' } }. Using placeholder filename 'LC_AUTOGENERATED'."); | ||
| return LC_AUTOGENERATED_FILENAME; | ||
| } | ||
| return filename; | ||
@@ -22,0 +26,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"misc.js","names":["iife"],"sources":["../../src/utils/misc.ts"],"sourcesContent":["import type { OpenAI as OpenAIClient } from \"openai\";\nimport {\n BaseMessage,\n ChatMessage,\n ContentBlock,\n Data,\n} from \"@langchain/core/messages\";\n\nexport const iife = <T>(fn: () => T) => fn();\n\nexport function isReasoningModel(model?: string) {\n if (!model) return false;\n if (/^o\\d/.test(model ?? \"\")) return true;\n if (model.startsWith(\"gpt-5\") && !model.startsWith(\"gpt-5-chat\")) return true;\n return false;\n}\n\nexport function extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== \"system\" &&\n message.role !== \"developer\" &&\n message.role !== \"assistant\" &&\n message.role !== \"user\" &&\n message.role !== \"function\" &&\n message.role !== \"tool\"\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIClient.ChatCompletionRole;\n}\n\nexport function getFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string | undefined {\n return (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n}\n\nexport function getRequiredFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string {\n const filename = (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n\n if (!filename) {\n throw new Error(\n \"a filename or name or title is needed via meta-data for OpenAI when working with multimodal blocks\"\n );\n }\n\n return filename;\n}\nexport function messageToOpenAIRole(\n message: BaseMessage\n): OpenAIClient.ChatCompletionRole {\n const type = message._getType();\n switch (type) {\n case \"system\":\n return \"system\";\n case \"ai\":\n return \"assistant\";\n case \"human\":\n return \"user\";\n case \"function\":\n return \"function\";\n case \"tool\":\n return \"tool\";\n case \"generic\": {\n if (!ChatMessage.isInstance(message))\n throw new Error(\"Invalid generic chat message\");\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nexport function _modelPrefersResponsesAPI(model: string): boolean {\n if (model.includes(\"gpt-5.2-pro\")) return true;\n if (model.includes(\"gpt-5.4-pro\")) return true;\n // Codex models are Responses API only\n if (model.includes(\"codex\")) return true;\n return false;\n}\n"],"mappings":";;AAQA,MAAaA,UAAW,OAAgB,IAAI;AAE5C,SAAgB,iBAAiB,OAAgB;AAC/C,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,OAAO,KAAK,SAAS,GAAG,CAAE,QAAO;AACrC,KAAI,MAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,WAAW,aAAa,CAAE,QAAO;AACzE,QAAO;;AAGT,SAAgB,gCAAgC,SAAsB;AACpE,KACE,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS,cACjB,QAAQ,SAAS,OAEjB,SAAQ,KAAK,yBAAyB,QAAQ,OAAO;AAGvD,QAAO,QAAQ;;AAGjB,SAAgB,wBACd,OAIoB;AACpB,QAAQ,MAAM,UAAU,YACtB,MAAM,UAAU,QAChB,MAAM,UAAU;;AAGpB,SAAgB,gCACd,OAIQ;CACR,MAAM,WAAY,MAAM,UAAU,YAChC,MAAM,UAAU,QAChB,MAAM,UAAU;AAElB,KAAI,CAAC,SACH,OAAM,IAAI,MACR,qGACD;AAGH,QAAO;;AAET,SAAgB,oBACd,SACiC;CACjC,MAAM,OAAO,QAAQ,UAAU;AAC/B,SAAQ,MAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,KACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK;AACH,OAAI,CAAC,YAAY,WAAW,QAAQ,CAClC,OAAM,IAAI,MAAM,+BAA+B;AACjD,UAAO,gCAAgC,QAAQ;EAEjD,QACE,OAAM,IAAI,MAAM,yBAAyB,OAAO;;;AAItD,SAAgB,0BAA0B,OAAwB;AAChE,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAC1C,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAE1C,KAAI,MAAM,SAAS,QAAQ,CAAE,QAAO;AACpC,QAAO"} | ||
| {"version":3,"file":"misc.js","names":["iife"],"sources":["../../src/utils/misc.ts"],"sourcesContent":["import type { OpenAI as OpenAIClient } from \"openai\";\nimport {\n BaseMessage,\n ChatMessage,\n ContentBlock,\n Data,\n} from \"@langchain/core/messages\";\n\nexport const iife = <T>(fn: () => T) => fn();\n\nexport function isReasoningModel(model?: string) {\n if (!model) return false;\n if (/^o\\d/.test(model ?? \"\")) return true;\n if (model.startsWith(\"gpt-5\") && !model.startsWith(\"gpt-5-chat\")) return true;\n return false;\n}\n\nexport function extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== \"system\" &&\n message.role !== \"developer\" &&\n message.role !== \"assistant\" &&\n message.role !== \"user\" &&\n message.role !== \"function\" &&\n message.role !== \"tool\"\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIClient.ChatCompletionRole;\n}\n\nexport function getFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string | undefined {\n return (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n}\n\nexport const LC_AUTOGENERATED_FILENAME = \"LC_AUTOGENERATED\";\n\nexport function getRequiredFilenameFromMetadata(\n block:\n | ContentBlock.Multimodal.File\n | ContentBlock.Multimodal.Video\n | Data.StandardFileBlock\n): string {\n const filename = (block.metadata?.filename ??\n block.metadata?.name ??\n block.metadata?.title) as string;\n\n if (!filename) {\n console.warn(\n \"OpenAI may require a filename for file uploads. Specify a filename \" +\n \"in the content block metadata, e.g.: { type: 'file', mimeType: \" +\n \"'...', data: '...', metadata: { filename: 'my-file.pdf' } }. \" +\n \"Using placeholder filename 'LC_AUTOGENERATED'.\"\n );\n return LC_AUTOGENERATED_FILENAME;\n }\n\n return filename;\n}\nexport function messageToOpenAIRole(\n message: BaseMessage\n): OpenAIClient.ChatCompletionRole {\n const type = message._getType();\n switch (type) {\n case \"system\":\n return \"system\";\n case \"ai\":\n return \"assistant\";\n case \"human\":\n return \"user\";\n case \"function\":\n return \"function\";\n case \"tool\":\n return \"tool\";\n case \"generic\": {\n if (!ChatMessage.isInstance(message))\n throw new Error(\"Invalid generic chat message\");\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nexport function _modelPrefersResponsesAPI(model: string): boolean {\n if (model.includes(\"gpt-5.2-pro\")) return true;\n if (model.includes(\"gpt-5.4-pro\")) return true;\n // Codex models are Responses API only\n if (model.includes(\"codex\")) return true;\n return false;\n}\n"],"mappings":";;AAQA,MAAaA,UAAW,OAAgB,IAAI;AAE5C,SAAgB,iBAAiB,OAAgB;AAC/C,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,OAAO,KAAK,SAAS,GAAG,CAAE,QAAO;AACrC,KAAI,MAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,WAAW,aAAa,CAAE,QAAO;AACzE,QAAO;;AAGT,SAAgB,gCAAgC,SAAsB;AACpE,KACE,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS,cACjB,QAAQ,SAAS,OAEjB,SAAQ,KAAK,yBAAyB,QAAQ,OAAO;AAGvD,QAAO,QAAQ;;AAGjB,SAAgB,wBACd,OAIoB;AACpB,QAAQ,MAAM,UAAU,YACtB,MAAM,UAAU,QAChB,MAAM,UAAU;;AAGpB,MAAa,4BAA4B;AAEzC,SAAgB,gCACd,OAIQ;CACR,MAAM,WAAY,MAAM,UAAU,YAChC,MAAM,UAAU,QAChB,MAAM,UAAU;AAElB,KAAI,CAAC,UAAU;AACb,UAAQ,KACN,gPAID;AACD,SAAO;;AAGT,QAAO;;AAET,SAAgB,oBACd,SACiC;CACjC,MAAM,OAAO,QAAQ,UAAU;AAC/B,SAAQ,MAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,KACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK;AACH,OAAI,CAAC,YAAY,WAAW,QAAQ,CAClC,OAAM,IAAI,MAAM,+BAA+B;AACjD,UAAO,gCAAgC,QAAQ;EAEjD,QACE,OAAM,IAAI,MAAM,yBAAyB,OAAO;;;AAItD,SAAgB,0BAA0B,OAAwB;AAChE,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAC1C,KAAI,MAAM,SAAS,cAAc,CAAE,QAAO;AAE1C,KAAI,MAAM,SAAS,QAAQ,CAAE,QAAO;AACpC,QAAO"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tools.cjs","names":[],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.Chat.Completions.ChatCompletionFunctionTool {\n let toolDef: OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(\n tool\n ) as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n } else {\n toolDef = tool as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"tools.cjs","names":[],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.Chat.Completions.ChatCompletionFunctionTool {\n let toolDef: OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(\n tool\n ) as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n } else {\n toolDef = tool as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"} |
| import { OpenAI } from "openai"; | ||
| import { BindToolsInput } from "@langchain/core/language_models/chat_models"; | ||
| import { DynamicTool } from "@langchain/core/tools"; | ||
| //#region src/utils/tools.d.ts | ||
@@ -6,0 +5,0 @@ type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tools.d.cts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;KAiMY,gBAAA,GACR,MAAA,CAAa,8BAAA;AAAA,KAIL,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,oBAAA;AAAA,KAGb,kBAAA,GACR,cAAA,GACA,MAAA,CAAa,IAAA,CAAK,kBAAA,GAClB,aAAA;AAAA,KAEQ,aAAA,GAAgB,WAAA,CAC1B,MAAA,CAAa,SAAA,CAAU,oBAAA"} | ||
| {"version":3,"file":"tools.d.cts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;KAiMY,gBAAA,GACR,MAAA,CAAa,8BAAA;AAAA,KAIL,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,oBAAA;AAAA,KAGb,kBAAA,GACR,cAAA,GACA,MAAA,CAAa,IAAA,CAAK,kBAAA,GAClB,aAAA;AAAA,KAEQ,aAAA,GAAgB,WAAA,CAC1B,MAAA,CAAa,SAAA,CAAU,oBAAA"} |
| import { OpenAI } from "openai"; | ||
| import { BindToolsInput } from "@langchain/core/language_models/chat_models"; | ||
| import { DynamicTool } from "@langchain/core/tools"; | ||
| //#region src/utils/tools.d.ts | ||
@@ -6,0 +5,0 @@ type OpenAIToolChoice = OpenAI.ChatCompletionToolChoiceOption | "any" | string; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tools.d.ts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;KAiMY,gBAAA,GACR,MAAA,CAAa,8BAAA;AAAA,KAIL,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,oBAAA;AAAA,KAGb,kBAAA,GACR,cAAA,GACA,MAAA,CAAa,IAAA,CAAK,kBAAA,GAClB,aAAA;AAAA,KAEQ,aAAA,GAAgB,WAAA,CAC1B,MAAA,CAAa,SAAA,CAAU,oBAAA"} | ||
| {"version":3,"file":"tools.d.ts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;KAiMY,gBAAA,GACR,MAAA,CAAa,8BAAA;AAAA,KAIL,mBAAA,GAAsB,WAAA,CAChC,MAAA,CAAa,SAAA,CAAU,oBAAA;AAAA,KAGb,kBAAA,GACR,cAAA,GACA,MAAA,CAAa,IAAA,CAAK,kBAAA,GAClB,aAAA;AAAA,KAEQ,aAAA,GAAgB,WAAA,CAC1B,MAAA,CAAa,SAAA,CAAU,oBAAA"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tools.js","names":["formatToOpenAITool"],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.Chat.Completions.ChatCompletionFunctionTool {\n let toolDef: OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(\n tool\n ) as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n } else {\n toolDef = tool as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"tools.js","names":["formatToOpenAITool"],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.Chat.Completions.ChatCompletionFunctionTool {\n let toolDef: OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(\n tool\n ) as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n } else {\n toolDef = tool as OpenAIClient.Chat.Completions.ChatCompletionFunctionTool;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"} |
+7
-16
| { | ||
| "name": "@langchain/openai", | ||
| "version": "1.4.1", | ||
| "version": "1.4.2", | ||
| "description": "OpenAI integrations for LangChain.js", | ||
@@ -22,3 +22,3 @@ "author": "LangChain", | ||
| "peerDependencies": { | ||
| "@langchain/core": "^1.1.38" | ||
| "@langchain/core": "^1.1.39" | ||
| }, | ||
@@ -29,15 +29,12 @@ "devDependencies": { | ||
| "@tsconfig/recommended": "^1.0.10", | ||
| "@types/node": "^25.2.3", | ||
| "@types/node": "^25.5.0", | ||
| "@vitest/coverage-v8": "^3.2.4", | ||
| "dotenv": "^17.2.1", | ||
| "dotenv": "^17.4.0", | ||
| "dpdm": "^3.14.0", | ||
| "eslint": "^9.34.0", | ||
| "prettier": "^3.5.0", | ||
| "rimraf": "^6.1.3", | ||
| "typescript": "~5.8.3", | ||
| "uuid": "^11.1.0", | ||
| "vitest": "^3.2.4", | ||
| "zod-to-json-schema": "^3.24.6", | ||
| "@langchain/core": "^1.1.38", | ||
| "@langchain/eslint": "0.1.1", | ||
| "vitest": "^4.1.2", | ||
| "zod-to-json-schema": "^3.25.2", | ||
| "@langchain/core": "^1.1.39", | ||
| "@langchain/standard-tests": "0.0.23", | ||
@@ -89,6 +86,2 @@ "@langchain/tsconfig": "0.0.1" | ||
| "build:compile": "tsdown", | ||
| "lint:eslint": "eslint --cache src/", | ||
| "lint:dpdm": "dpdm --skip-dynamic-imports circular --exit-code circular:1 --no-warning --no-tree src/*.ts src/**/*.ts", | ||
| "lint": "pnpm lint:eslint && pnpm lint:dpdm", | ||
| "lint:fix": "pnpm lint:eslint --fix && pnpm lint:dpdm", | ||
| "clean": "rm -rf .turbo dist/", | ||
@@ -101,4 +94,2 @@ "test": "vitest run", | ||
| "test:standard": "pnpm test:standard:unit && pnpm test:standard:int", | ||
| "format": "prettier --write \"src\"", | ||
| "format:check": "prettier --check \"src\"", | ||
| "typegen": "pnpm run typegen:profiles", | ||
@@ -105,0 +96,0 @@ "typegen:profiles": "pnpm --filter @langchain/model-profiles make --config profiles.toml" |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 5 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 5 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
1908642
0.03%15
-16.67%284
0.35%19493
0.06%2
100%