@langchain/openai 1.5.13 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/dist/chat_models/base.cjs +7 -1
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.d.cts +10 -2
- package/dist/chat_models/base.d.cts.map +1 -1
- package/dist/chat_models/base.d.ts +9 -1
- package/dist/chat_models/base.d.ts.map +1 -1
- package/dist/chat_models/base.js +7 -1
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/completions.cjs +14 -3
- package/dist/chat_models/completions.cjs.map +1 -1
- package/dist/chat_models/completions.d.cts +2 -0
- package/dist/chat_models/completions.d.cts.map +1 -1
- package/dist/chat_models/completions.d.ts +2 -0
- package/dist/chat_models/completions.d.ts.map +1 -1
- package/dist/chat_models/completions.js +15 -4
- package/dist/chat_models/completions.js.map +1 -1
- package/dist/chat_models/index.cjs +68 -0
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +66 -0
- package/dist/chat_models/index.d.cts.map +1 -1
- package/dist/chat_models/index.d.ts +66 -0
- package/dist/chat_models/index.d.ts.map +1 -1
- package/dist/chat_models/index.js +68 -0
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/profiles.cjs +224 -48
- package/dist/chat_models/profiles.cjs.map +1 -1
- package/dist/chat_models/profiles.js +224 -48
- package/dist/chat_models/profiles.js.map +1 -1
- package/dist/chat_models/responses.cjs +9 -3
- package/dist/chat_models/responses.cjs.map +1 -1
- package/dist/chat_models/responses.d.cts +2 -0
- package/dist/chat_models/responses.d.cts.map +1 -1
- package/dist/chat_models/responses.d.ts +2 -0
- package/dist/chat_models/responses.d.ts.map +1 -1
- package/dist/chat_models/responses.js +9 -3
- package/dist/chat_models/responses.js.map +1 -1
- package/dist/converters/completions.cjs +9 -8
- package/dist/converters/completions.cjs.map +1 -1
- package/dist/converters/completions.d.cts.map +1 -1
- package/dist/converters/completions.d.ts.map +1 -1
- package/dist/converters/completions.js +10 -9
- package/dist/converters/completions.js.map +1 -1
- package/dist/converters/responses.cjs +79 -50
- package/dist/converters/responses.cjs.map +1 -1
- package/dist/converters/responses.d.cts.map +1 -1
- package/dist/converters/responses.d.ts.map +1 -1
- package/dist/converters/responses.js +80 -51
- package/dist/converters/responses.js.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/llms.cjs +1 -1
- package/dist/llms.cjs.map +1 -1
- package/dist/llms.js +1 -1
- package/dist/llms.js.map +1 -1
- package/dist/types.d.cts +7 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +7 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file_mime_types.cjs +15 -0
- package/dist/utils/file_mime_types.cjs.map +1 -0
- package/dist/utils/file_mime_types.js +15 -0
- package/dist/utils/file_mime_types.js.map +1 -0
- package/dist/utils/misc.cjs +30 -1
- package/dist/utils/misc.cjs.map +1 -1
- package/dist/utils/misc.d.cts +1 -0
- package/dist/utils/misc.d.cts.map +1 -1
- package/dist/utils/misc.d.ts +1 -0
- package/dist/utils/misc.d.ts.map +1 -1
- package/dist/utils/misc.js +27 -2
- package/dist/utils/misc.js.map +1 -1
- package/package.json +3 -3
package/dist/llms.js
CHANGED
|
@@ -82,7 +82,7 @@ var OpenAI$2 = class extends BaseLLM {
|
|
|
82
82
|
clientConfig;
|
|
83
83
|
constructor(fields) {
|
|
84
84
|
super(fields ?? {});
|
|
85
|
-
this._addVersion("@langchain/openai", "1.
|
|
85
|
+
this._addVersion("@langchain/openai", "1.6.1");
|
|
86
86
|
this.openAIApiKey = fields?.apiKey ?? fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY");
|
|
87
87
|
this.apiKey = this.openAIApiKey;
|
|
88
88
|
this.organization = fields?.configuration?.organization ?? getEnvironmentVariable("OPENAI_ORGANIZATION");
|
package/dist/llms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 // 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 maxRetries: options.maxRetries,\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 // The SDK has its own `maxRetries`; take it for our caller instead so\n // the two retry loops don't multiply.\n const { maxRetries, ...sdkOptions } = options ?? {};\n const requestOptions = this._getClientOptions(sdkOptions);\n return this.caller.callWithOptions({ maxRetries }, 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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"}
|
|
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 // 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 maxRetries: options.maxRetries,\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 // The SDK has its own `maxRetries`; take it for our caller instead so\n // the two retry loops don't multiply.\n const { maxRetries, ...sdkOptions } = options ?? {};\n const requestOptions = this._getClientOptions(sdkOptions);\n return this.caller.callWithOptions({ maxRetries }, 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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"}
|
package/dist/types.d.cts
CHANGED
|
@@ -9,7 +9,8 @@ import { TiktokenModel } from "js-tiktoken/lite";
|
|
|
9
9
|
*/
|
|
10
10
|
type OpenAIChatModelId = OpenAI.ChatModel | (string & NonNullable<unknown>);
|
|
11
11
|
type OpenAIVerbosityParam = "low" | "medium" | "high" | null;
|
|
12
|
-
type OpenAICacheRetentionParam = "in-memory" | "24h" | null;
|
|
12
|
+
type OpenAICacheRetentionParam = "in_memory" | "in-memory" | "24h" | null;
|
|
13
|
+
type OpenAIPromptCacheOptions = OpenAI.Responses.ResponseCreateParams["prompt_cache_options"];
|
|
13
14
|
type OpenAIApiKey = ClientOptions["apiKey"];
|
|
14
15
|
declare interface OpenAIBaseInput {
|
|
15
16
|
/** Sampling temperature to use */
|
|
@@ -171,6 +172,10 @@ interface OpenAIChatInput extends OpenAIBaseInput {
|
|
|
171
172
|
* Used by OpenAI to set cache retention time
|
|
172
173
|
*/
|
|
173
174
|
promptCacheRetention?: OpenAICacheRetentionParam;
|
|
175
|
+
/**
|
|
176
|
+
* Options controlling OpenAI prompt cache behavior.
|
|
177
|
+
*/
|
|
178
|
+
promptCacheOptions?: OpenAIPromptCacheOptions;
|
|
174
179
|
}
|
|
175
180
|
interface AzureOpenAIInput {
|
|
176
181
|
/**
|
|
@@ -260,5 +265,5 @@ type ChatOpenAIReasoningSummary = Omit<OpenAI.Responses.ResponseReasoningItem, "
|
|
|
260
265
|
type ChatOpenAIResponseFormat = ResponseFormatText | ResponseFormatJSONObject | ResponseFormatTextGrammar | ResponseFormatTextPython | ChatOpenAIResponseFormatJSONSchema;
|
|
261
266
|
type ResponseFormatConfiguration = ResponseFormatText | ResponseFormatJSONObject | ResponseFormatJSONSchema;
|
|
262
267
|
//#endregion
|
|
263
|
-
export { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICacheRetentionParam, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, type TiktokenModel };
|
|
268
|
+
export { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICacheRetentionParam, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIPromptCacheOptions, OpenAIVerbosityParam, ResponseFormatConfiguration, type TiktokenModel };
|
|
264
269
|
//# sourceMappingURL=types.d.cts.map
|
package/dist/types.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;KAoBY,oBACR,OAAa,sBACH;KAEF;
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;KAoBY,oBACR,OAAa,sBACH;KAEF;KAEA;KAKA,2BACV,OAAa,UAAU;KAEb,eAAe;kBAEF;;EAEvB;;;;;EAMA;;;;;;EAOA;;EAGA;;EAGA;;EAGA;;EAGA;;EAGA,YAAY;;EAGZ;;EAGA;;;;;EAMA;;;;;;EAOA;;EAGA,OAAO;;;;;EAOP,cAAc;;;;;EAMd;;EAEA;;;;EAKA;;;;;;EAOA,eAAe;;;;;EAKf,SAAS;;;;EAKT,YAAY;;KAGF,2BAA2B,OAAa;UAEnC,0BAA0B;;;;EAIzC,UAAU;;;;;kBAMa,oBAAoB;;EAE3C;;EAGA;;UAGe,wBAAwB;;;;;EAKvC;;;;;EAMA;;EAGA,iBAAiB,OAAa,KAAK;;;;;EAMnC;;;;;EAMA;;;;;;;;;;;;;EAcA,aAAa,MAAM,OAAa,KAAK;;;;;;EAOrC,QAAQ,OAAa,KAAK;;;;;;;EAQ1B,YAAY,OAAa;;;;;;;EAQzB;;;;;EAMA,eAAe,OAAa,UAAU;;;;;;EAOtC;;;;EAKA,uBAAuB;;;;EAKvB,qBAAqB;;UAGN;;;;EAIf;;;;EAKA;;;;;;;EAQA;;;;;;;EAQA;;;;;;;;EASA;;;;;;;;;EAUA;;;;;;EAOA;;;;;;EAOA;;;;;EAMA,6BAA6B;;UAGd,6BACP,iBAAiB;EACzB;EACA;EACA;;KAGG,qCAAqC,KACxC;EAGA,aAAa,KAAK;;;;;IAMhB,QAAQ,sBAAsB;;;;;;KAOtB,6BAA6B,KACvC,OAAa,UAAU;;;;;;EAQvB,SAAS,MACP,OAAa,UAAU,sBAAsB;IAAY;;;KAIjD,2BACR,qBACA,2BACA,4BACA,2BACA;KAEQ,8BACR,qBACA,2BACA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -9,7 +9,8 @@ import { TiktokenModel } from "js-tiktoken/lite";
|
|
|
9
9
|
*/
|
|
10
10
|
type OpenAIChatModelId = OpenAI.ChatModel | (string & NonNullable<unknown>);
|
|
11
11
|
type OpenAIVerbosityParam = "low" | "medium" | "high" | null;
|
|
12
|
-
type OpenAICacheRetentionParam = "in-memory" | "24h" | null;
|
|
12
|
+
type OpenAICacheRetentionParam = "in_memory" | "in-memory" | "24h" | null;
|
|
13
|
+
type OpenAIPromptCacheOptions = OpenAI.Responses.ResponseCreateParams["prompt_cache_options"];
|
|
13
14
|
type OpenAIApiKey = ClientOptions["apiKey"];
|
|
14
15
|
declare interface OpenAIBaseInput {
|
|
15
16
|
/** Sampling temperature to use */
|
|
@@ -171,6 +172,10 @@ interface OpenAIChatInput extends OpenAIBaseInput {
|
|
|
171
172
|
* Used by OpenAI to set cache retention time
|
|
172
173
|
*/
|
|
173
174
|
promptCacheRetention?: OpenAICacheRetentionParam;
|
|
175
|
+
/**
|
|
176
|
+
* Options controlling OpenAI prompt cache behavior.
|
|
177
|
+
*/
|
|
178
|
+
promptCacheOptions?: OpenAIPromptCacheOptions;
|
|
174
179
|
}
|
|
175
180
|
interface AzureOpenAIInput {
|
|
176
181
|
/**
|
|
@@ -260,5 +265,5 @@ type ChatOpenAIReasoningSummary = Omit<OpenAI.Responses.ResponseReasoningItem, "
|
|
|
260
265
|
type ChatOpenAIResponseFormat = ResponseFormatText | ResponseFormatJSONObject | ResponseFormatTextGrammar | ResponseFormatTextPython | ChatOpenAIResponseFormatJSONSchema;
|
|
261
266
|
type ResponseFormatConfiguration = ResponseFormatText | ResponseFormatJSONObject | ResponseFormatJSONSchema;
|
|
262
267
|
//#endregion
|
|
263
|
-
export { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICacheRetentionParam, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, type TiktokenModel };
|
|
268
|
+
export { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICacheRetentionParam, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIPromptCacheOptions, OpenAIVerbosityParam, ResponseFormatConfiguration, type TiktokenModel };
|
|
264
269
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;KAoBY,oBACR,OAAa,sBACH;KAEF;
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;KAoBY,oBACR,OAAa,sBACH;KAEF;KAEA;KAKA,2BACV,OAAa,UAAU;KAEb,eAAe;kBAEF;;EAEvB;;;;;EAMA;;;;;;EAOA;;EAGA;;EAGA;;EAGA;;EAGA;;EAGA,YAAY;;EAGZ;;EAGA;;;;;EAMA;;;;;;EAOA;;EAGA,OAAO;;;;;EAOP,cAAc;;;;;EAMd;;EAEA;;;;EAKA;;;;;;EAOA,eAAe;;;;;EAKf,SAAS;;;;EAKT,YAAY;;KAGF,2BAA2B,OAAa;UAEnC,0BAA0B;;;;EAIzC,UAAU;;;;;kBAMa,oBAAoB;;EAE3C;;EAGA;;UAGe,wBAAwB;;;;;EAKvC;;;;;EAMA;;EAGA,iBAAiB,OAAa,KAAK;;;;;EAMnC;;;;;EAMA;;;;;;;;;;;;;EAcA,aAAa,MAAM,OAAa,KAAK;;;;;;EAOrC,QAAQ,OAAa,KAAK;;;;;;;EAQ1B,YAAY,OAAa;;;;;;;EAQzB;;;;;EAMA,eAAe,OAAa,UAAU;;;;;;EAOtC;;;;EAKA,uBAAuB;;;;EAKvB,qBAAqB;;UAGN;;;;EAIf;;;;EAKA;;;;;;;EAQA;;;;;;;EAQA;;;;;;;;EASA;;;;;;;;;EAUA;;;;;;EAOA;;;;;;EAOA;;;;;EAMA,6BAA6B;;UAGd,6BACP,iBAAiB;EACzB;EACA;EACA;;KAGG,qCAAqC,KACxC;EAGA,aAAa,KAAK;;;;;IAMhB,QAAQ,sBAAsB;;;;;;KAOtB,6BAA6B,KACvC,OAAa,UAAU;;;;;;EAQvB,SAAS,MACP,OAAa,UAAU,sBAAsB;IAAY;;;KAIjD,2BACR,qBACA,2BACA,4BACA,2BACA;KAEQ,8BACR,qBACA,2BACA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/utils/file_mime_types.ts
|
|
2
|
+
/**
|
|
3
|
+
* The static profile now reports `fileMimeTypes` for every model by default,
|
|
4
|
+
* so this strips it back out when not applicable. `pdfInputs` stands in for
|
|
5
|
+
* `input_file` support, since PDFs go through the same input.
|
|
6
|
+
*/
|
|
7
|
+
function withoutFileMimeTypesUnlessSupported(profile, usesResponsesApi) {
|
|
8
|
+
if (usesResponsesApi && profile.pdfInputs) return profile;
|
|
9
|
+
const { fileMimeTypes: _fileMimeTypes, ...rest } = profile;
|
|
10
|
+
return rest;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
exports.withoutFileMimeTypesUnlessSupported = withoutFileMimeTypesUnlessSupported;
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=file_mime_types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file_mime_types.cjs","names":[],"sources":["../../src/utils/file_mime_types.ts"],"sourcesContent":["import type { ModelProfile } from \"@langchain/core/language_models/profile\";\n\n/**\n * The static profile now reports `fileMimeTypes` for every model by default,\n * so this strips it back out when not applicable. `pdfInputs` stands in for\n * `input_file` support, since PDFs go through the same input.\n */\nexport function withoutFileMimeTypesUnlessSupported(\n profile: ModelProfile,\n usesResponsesApi: boolean\n): ModelProfile {\n if (usesResponsesApi && profile.pdfInputs) return profile;\n const { fileMimeTypes: _fileMimeTypes, ...rest } = profile;\n return rest;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,oCACd,SACA,kBACc;CACd,IAAI,oBAAoB,QAAQ,WAAW,OAAO;CAClD,MAAM,EAAE,eAAe,gBAAgB,GAAG,SAAS;CACnD,OAAO;AACT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/utils/file_mime_types.ts
|
|
2
|
+
/**
|
|
3
|
+
* The static profile now reports `fileMimeTypes` for every model by default,
|
|
4
|
+
* so this strips it back out when not applicable. `pdfInputs` stands in for
|
|
5
|
+
* `input_file` support, since PDFs go through the same input.
|
|
6
|
+
*/
|
|
7
|
+
function withoutFileMimeTypesUnlessSupported(profile, usesResponsesApi) {
|
|
8
|
+
if (usesResponsesApi && profile.pdfInputs) return profile;
|
|
9
|
+
const { fileMimeTypes: _fileMimeTypes, ...rest } = profile;
|
|
10
|
+
return rest;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { withoutFileMimeTypesUnlessSupported };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=file_mime_types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file_mime_types.js","names":[],"sources":["../../src/utils/file_mime_types.ts"],"sourcesContent":["import type { ModelProfile } from \"@langchain/core/language_models/profile\";\n\n/**\n * The static profile now reports `fileMimeTypes` for every model by default,\n * so this strips it back out when not applicable. `pdfInputs` stands in for\n * `input_file` support, since PDFs go through the same input.\n */\nexport function withoutFileMimeTypesUnlessSupported(\n profile: ModelProfile,\n usesResponsesApi: boolean\n): ModelProfile {\n if (usesResponsesApi && profile.pdfInputs) return profile;\n const { fileMimeTypes: _fileMimeTypes, ...rest } = profile;\n return rest;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,oCACd,SACA,kBACc;CACd,IAAI,oBAAoB,QAAQ,WAAW,OAAO;CAClD,MAAM,EAAE,eAAe,gBAAgB,GAAG,SAAS;CACnD,OAAO;AACT"}
|
package/dist/utils/misc.cjs
CHANGED
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
let _langchain_core_messages = require("@langchain/core/messages");
|
|
2
2
|
//#region src/utils/misc.ts
|
|
3
3
|
const iife = (fn) => fn();
|
|
4
|
+
function normalizePromptCacheRetention(retention) {
|
|
5
|
+
return retention === "in-memory" ? "in_memory" : retention;
|
|
6
|
+
}
|
|
7
|
+
function applyPromptCacheBreakpoint(source, target) {
|
|
8
|
+
if ("prompt_cache_breakpoint" in source) return {
|
|
9
|
+
...target,
|
|
10
|
+
prompt_cache_breakpoint: source.prompt_cache_breakpoint
|
|
11
|
+
};
|
|
12
|
+
if (hasExtrasPromptCacheBreakpoint(source)) return {
|
|
13
|
+
...target,
|
|
14
|
+
prompt_cache_breakpoint: source.extras.prompt_cache_breakpoint
|
|
15
|
+
};
|
|
16
|
+
return target;
|
|
17
|
+
}
|
|
18
|
+
function hasExtrasPromptCacheBreakpoint(block) {
|
|
19
|
+
const { extras } = block;
|
|
20
|
+
return typeof extras === "object" && extras !== null && "prompt_cache_breakpoint" in extras;
|
|
21
|
+
}
|
|
22
|
+
function liftExtrasPromptCacheBreakpoint(block) {
|
|
23
|
+
const source = block;
|
|
24
|
+
if (!hasExtrasPromptCacheBreakpoint(source)) return block;
|
|
25
|
+
const { extras: _extras, ...rest } = source;
|
|
26
|
+
return applyPromptCacheBreakpoint(source, rest);
|
|
27
|
+
}
|
|
4
28
|
function isReasoningModel(model) {
|
|
5
29
|
if (!model) return false;
|
|
6
30
|
if (/^o\d/.test(model ?? "")) return true;
|
|
7
31
|
if (model.startsWith("gpt-5") && !model.startsWith("gpt-5-chat")) return true;
|
|
32
|
+
if (model.startsWith("gpt-6") && !model.startsWith("gpt-6-chat")) return true;
|
|
8
33
|
return false;
|
|
9
34
|
}
|
|
10
35
|
function extractGenericMessageCustomRole(message) {
|
|
@@ -41,18 +66,22 @@ function _modelPrefersResponsesAPI(model) {
|
|
|
41
66
|
if (model.includes("gpt-5.2-pro")) return true;
|
|
42
67
|
if (model.includes("gpt-5.4-pro")) return true;
|
|
43
68
|
if (model.includes("gpt-5.5-pro")) return true;
|
|
44
|
-
if (model.includes("gpt-5.6
|
|
69
|
+
if (model.includes("gpt-5.6")) return true;
|
|
45
70
|
if (model.includes("codex")) return true;
|
|
46
71
|
return false;
|
|
47
72
|
}
|
|
48
73
|
//#endregion
|
|
49
74
|
exports.LC_AUTOGENERATED_FILENAME = LC_AUTOGENERATED_FILENAME;
|
|
50
75
|
exports._modelPrefersResponsesAPI = _modelPrefersResponsesAPI;
|
|
76
|
+
exports.applyPromptCacheBreakpoint = applyPromptCacheBreakpoint;
|
|
51
77
|
exports.extractGenericMessageCustomRole = extractGenericMessageCustomRole;
|
|
52
78
|
exports.getFilenameFromMetadata = getFilenameFromMetadata;
|
|
53
79
|
exports.getRequiredFilenameFromMetadata = getRequiredFilenameFromMetadata;
|
|
80
|
+
exports.hasExtrasPromptCacheBreakpoint = hasExtrasPromptCacheBreakpoint;
|
|
54
81
|
exports.iife = iife;
|
|
55
82
|
exports.isReasoningModel = isReasoningModel;
|
|
83
|
+
exports.liftExtrasPromptCacheBreakpoint = liftExtrasPromptCacheBreakpoint;
|
|
56
84
|
exports.messageToOpenAIRole = messageToOpenAIRole;
|
|
85
|
+
exports.normalizePromptCacheRetention = normalizePromptCacheRetention;
|
|
57
86
|
|
|
58
87
|
//# sourceMappingURL=misc.cjs.map
|
package/dist/utils/misc.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 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 if (model.includes(\"gpt-5.5-pro\")) return true;\n if (model.includes(\"gpt-5.6
|
|
1
|
+
{"version":3,"file":"misc.cjs","names":["ChatMessage"],"sources":["../../src/utils/misc.ts"],"sourcesContent":["import type { OpenAI as OpenAIClient } from \"openai\";\nimport type { OpenAICacheRetentionParam } from \"../types.js\";\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 normalizePromptCacheRetention(\n retention: OpenAICacheRetentionParam | undefined\n): Exclude<OpenAICacheRetentionParam, \"in-memory\"> | undefined {\n return retention === \"in-memory\" ? \"in_memory\" : retention;\n}\n\nexport function applyPromptCacheBreakpoint<T extends object>(\n source: Record<string, unknown>,\n target: T\n): T {\n if (\"prompt_cache_breakpoint\" in source) {\n return {\n ...target,\n prompt_cache_breakpoint: source.prompt_cache_breakpoint,\n };\n }\n if (hasExtrasPromptCacheBreakpoint(source)) {\n return {\n ...target,\n prompt_cache_breakpoint: source.extras.prompt_cache_breakpoint,\n };\n }\n return target;\n}\n\nexport function hasExtrasPromptCacheBreakpoint(\n block: Record<string, unknown>\n): block is { extras: { prompt_cache_breakpoint: unknown } } {\n const { extras } = block;\n return (\n typeof extras === \"object\" &&\n extras !== null &&\n \"prompt_cache_breakpoint\" in extras\n );\n}\n\nexport function liftExtrasPromptCacheBreakpoint<T extends object>(block: T): T {\n const source = block as Record<string, unknown>;\n if (!hasExtrasPromptCacheBreakpoint(source)) {\n return block;\n }\n const { extras: _extras, ...rest } = source;\n return applyPromptCacheBreakpoint(source, rest) as T;\n}\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 if (model.startsWith(\"gpt-6\") && !model.startsWith(\"gpt-6-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 if (model.includes(\"gpt-5.5-pro\")) return true;\n if (model.includes(\"gpt-5.6\")) return true;\n // Codex models are Responses API only\n if (model.includes(\"codex\")) return true;\n return false;\n}\n"],"mappings":";;AASA,MAAa,QAAW,OAAgB,GAAG;AAE3C,SAAgB,8BACd,WAC6D;CAC7D,OAAO,cAAc,cAAc,cAAc;AACnD;AAEA,SAAgB,2BACd,QACA,QACG;CACH,IAAI,6BAA6B,QAC/B,OAAO;EACL,GAAG;EACH,yBAAyB,OAAO;CAClC;CAEF,IAAI,+BAA+B,MAAM,GACvC,OAAO;EACL,GAAG;EACH,yBAAyB,OAAO,OAAO;CACzC;CAEF,OAAO;AACT;AAEA,SAAgB,+BACd,OAC2D;CAC3D,MAAM,EAAE,WAAW;CACnB,OACE,OAAO,WAAW,YAClB,WAAW,QACX,6BAA6B;AAEjC;AAEA,SAAgB,gCAAkD,OAAa;CAC7E,MAAM,SAAS;CACf,IAAI,CAAC,+BAA+B,MAAM,GACxC,OAAO;CAET,MAAM,EAAE,QAAQ,SAAS,GAAG,SAAS;CACrC,OAAO,2BAA2B,QAAQ,IAAI;AAChD;AAEA,SAAgB,iBAAiB,OAAgB;CAC/C,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,OAAO,KAAK,SAAS,EAAE,GAAG,OAAO;CACrC,IAAI,MAAM,WAAW,OAAO,KAAK,CAAC,MAAM,WAAW,YAAY,GAAG,OAAO;CACzE,IAAI,MAAM,WAAW,OAAO,KAAK,CAAC,MAAM,WAAW,YAAY,GAAG,OAAO;CACzE,OAAO;AACT;AAEA,SAAgB,gCAAgC,SAAsB;CACpE,IACE,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS,cACjB,QAAQ,SAAS,QAEjB,QAAQ,KAAK,yBAAyB,QAAQ,MAAM;CAGtD,OAAO,QAAQ;AACjB;AAEA,SAAgB,wBACd,OAIoB;CACpB,OAAQ,MAAM,UAAU,YACtB,MAAM,UAAU,QAChB,MAAM,UAAU;AACpB;AAEA,MAAa,4BAA4B;AAEzC,SAAgB,gCACd,OAIQ;CACR,MAAM,WAAY,MAAM,UAAU,YAChC,MAAM,UAAU,QAChB,MAAM,UAAU;CAElB,IAAI,CAAC,UAAU;EACb,QAAQ,KACN,+OAIF;EACA,OAAO;CACT;CAEA,OAAO;AACT;AACA,SAAgB,oBACd,SACiC;CACjC,MAAM,OAAO,QAAQ,SAAS;CAC9B,QAAQ,MAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK;GACH,IAAI,CAACA,yBAAAA,YAAY,WAAW,OAAO,GACjC,MAAM,IAAI,MAAM,8BAA8B;GAChD,OAAO,gCAAgC,OAAO;EAEhD,SACE,MAAM,IAAI,MAAM,yBAAyB,MAAM;CACnD;AACF;AAEA,SAAgB,0BAA0B,OAAwB;CAChE,IAAI,MAAM,SAAS,aAAa,GAAG,OAAO;CAC1C,IAAI,MAAM,SAAS,aAAa,GAAG,OAAO;CAC1C,IAAI,MAAM,SAAS,aAAa,GAAG,OAAO;CAC1C,IAAI,MAAM,SAAS,SAAS,GAAG,OAAO;CAEtC,IAAI,MAAM,SAAS,OAAO,GAAG,OAAO;CACpC,OAAO;AACT"}
|
package/dist/utils/misc.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.cts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"misc.d.cts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;iBAkHgB,oBACd,SAAS,cACR,OAAa"}
|
package/dist/utils/misc.d.ts
CHANGED
package/dist/utils/misc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.ts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"misc.d.ts","names":[],"sources":["../../src/utils/misc.ts"],"mappings":";;;;iBAkHgB,oBACd,SAAS,cACR,OAAa"}
|
package/dist/utils/misc.js
CHANGED
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
import { ChatMessage } from "@langchain/core/messages";
|
|
2
2
|
//#region src/utils/misc.ts
|
|
3
3
|
const iife$1 = (fn) => fn();
|
|
4
|
+
function normalizePromptCacheRetention(retention) {
|
|
5
|
+
return retention === "in-memory" ? "in_memory" : retention;
|
|
6
|
+
}
|
|
7
|
+
function applyPromptCacheBreakpoint(source, target) {
|
|
8
|
+
if ("prompt_cache_breakpoint" in source) return {
|
|
9
|
+
...target,
|
|
10
|
+
prompt_cache_breakpoint: source.prompt_cache_breakpoint
|
|
11
|
+
};
|
|
12
|
+
if (hasExtrasPromptCacheBreakpoint(source)) return {
|
|
13
|
+
...target,
|
|
14
|
+
prompt_cache_breakpoint: source.extras.prompt_cache_breakpoint
|
|
15
|
+
};
|
|
16
|
+
return target;
|
|
17
|
+
}
|
|
18
|
+
function hasExtrasPromptCacheBreakpoint(block) {
|
|
19
|
+
const { extras } = block;
|
|
20
|
+
return typeof extras === "object" && extras !== null && "prompt_cache_breakpoint" in extras;
|
|
21
|
+
}
|
|
22
|
+
function liftExtrasPromptCacheBreakpoint(block) {
|
|
23
|
+
const source = block;
|
|
24
|
+
if (!hasExtrasPromptCacheBreakpoint(source)) return block;
|
|
25
|
+
const { extras: _extras, ...rest } = source;
|
|
26
|
+
return applyPromptCacheBreakpoint(source, rest);
|
|
27
|
+
}
|
|
4
28
|
function isReasoningModel(model) {
|
|
5
29
|
if (!model) return false;
|
|
6
30
|
if (/^o\d/.test(model ?? "")) return true;
|
|
7
31
|
if (model.startsWith("gpt-5") && !model.startsWith("gpt-5-chat")) return true;
|
|
32
|
+
if (model.startsWith("gpt-6") && !model.startsWith("gpt-6-chat")) return true;
|
|
8
33
|
return false;
|
|
9
34
|
}
|
|
10
35
|
function extractGenericMessageCustomRole(message) {
|
|
@@ -41,11 +66,11 @@ function _modelPrefersResponsesAPI(model) {
|
|
|
41
66
|
if (model.includes("gpt-5.2-pro")) return true;
|
|
42
67
|
if (model.includes("gpt-5.4-pro")) return true;
|
|
43
68
|
if (model.includes("gpt-5.5-pro")) return true;
|
|
44
|
-
if (model.includes("gpt-5.6
|
|
69
|
+
if (model.includes("gpt-5.6")) return true;
|
|
45
70
|
if (model.includes("codex")) return true;
|
|
46
71
|
return false;
|
|
47
72
|
}
|
|
48
73
|
//#endregion
|
|
49
|
-
export { LC_AUTOGENERATED_FILENAME, _modelPrefersResponsesAPI, extractGenericMessageCustomRole, getFilenameFromMetadata, getRequiredFilenameFromMetadata, iife$1 as iife, isReasoningModel, messageToOpenAIRole };
|
|
74
|
+
export { LC_AUTOGENERATED_FILENAME, _modelPrefersResponsesAPI, applyPromptCacheBreakpoint, extractGenericMessageCustomRole, getFilenameFromMetadata, getRequiredFilenameFromMetadata, hasExtrasPromptCacheBreakpoint, iife$1 as iife, isReasoningModel, liftExtrasPromptCacheBreakpoint, messageToOpenAIRole, normalizePromptCacheRetention };
|
|
50
75
|
|
|
51
76
|
//# sourceMappingURL=misc.js.map
|
package/dist/utils/misc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 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 if (model.includes(\"gpt-5.5-pro\")) return true;\n if (model.includes(\"gpt-5.6
|
|
1
|
+
{"version":3,"file":"misc.js","names":["iife"],"sources":["../../src/utils/misc.ts"],"sourcesContent":["import type { OpenAI as OpenAIClient } from \"openai\";\nimport type { OpenAICacheRetentionParam } from \"../types.js\";\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 normalizePromptCacheRetention(\n retention: OpenAICacheRetentionParam | undefined\n): Exclude<OpenAICacheRetentionParam, \"in-memory\"> | undefined {\n return retention === \"in-memory\" ? \"in_memory\" : retention;\n}\n\nexport function applyPromptCacheBreakpoint<T extends object>(\n source: Record<string, unknown>,\n target: T\n): T {\n if (\"prompt_cache_breakpoint\" in source) {\n return {\n ...target,\n prompt_cache_breakpoint: source.prompt_cache_breakpoint,\n };\n }\n if (hasExtrasPromptCacheBreakpoint(source)) {\n return {\n ...target,\n prompt_cache_breakpoint: source.extras.prompt_cache_breakpoint,\n };\n }\n return target;\n}\n\nexport function hasExtrasPromptCacheBreakpoint(\n block: Record<string, unknown>\n): block is { extras: { prompt_cache_breakpoint: unknown } } {\n const { extras } = block;\n return (\n typeof extras === \"object\" &&\n extras !== null &&\n \"prompt_cache_breakpoint\" in extras\n );\n}\n\nexport function liftExtrasPromptCacheBreakpoint<T extends object>(block: T): T {\n const source = block as Record<string, unknown>;\n if (!hasExtrasPromptCacheBreakpoint(source)) {\n return block;\n }\n const { extras: _extras, ...rest } = source;\n return applyPromptCacheBreakpoint(source, rest) as T;\n}\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 if (model.startsWith(\"gpt-6\") && !model.startsWith(\"gpt-6-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 if (model.includes(\"gpt-5.5-pro\")) return true;\n if (model.includes(\"gpt-5.6\")) return true;\n // Codex models are Responses API only\n if (model.includes(\"codex\")) return true;\n return false;\n}\n"],"mappings":";;AASA,MAAaA,UAAW,OAAgB,GAAG;AAE3C,SAAgB,8BACd,WAC6D;CAC7D,OAAO,cAAc,cAAc,cAAc;AACnD;AAEA,SAAgB,2BACd,QACA,QACG;CACH,IAAI,6BAA6B,QAC/B,OAAO;EACL,GAAG;EACH,yBAAyB,OAAO;CAClC;CAEF,IAAI,+BAA+B,MAAM,GACvC,OAAO;EACL,GAAG;EACH,yBAAyB,OAAO,OAAO;CACzC;CAEF,OAAO;AACT;AAEA,SAAgB,+BACd,OAC2D;CAC3D,MAAM,EAAE,WAAW;CACnB,OACE,OAAO,WAAW,YAClB,WAAW,QACX,6BAA6B;AAEjC;AAEA,SAAgB,gCAAkD,OAAa;CAC7E,MAAM,SAAS;CACf,IAAI,CAAC,+BAA+B,MAAM,GACxC,OAAO;CAET,MAAM,EAAE,QAAQ,SAAS,GAAG,SAAS;CACrC,OAAO,2BAA2B,QAAQ,IAAI;AAChD;AAEA,SAAgB,iBAAiB,OAAgB;CAC/C,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,OAAO,KAAK,SAAS,EAAE,GAAG,OAAO;CACrC,IAAI,MAAM,WAAW,OAAO,KAAK,CAAC,MAAM,WAAW,YAAY,GAAG,OAAO;CACzE,IAAI,MAAM,WAAW,OAAO,KAAK,CAAC,MAAM,WAAW,YAAY,GAAG,OAAO;CACzE,OAAO;AACT;AAEA,SAAgB,gCAAgC,SAAsB;CACpE,IACE,QAAQ,SAAS,YACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,eACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS,cACjB,QAAQ,SAAS,QAEjB,QAAQ,KAAK,yBAAyB,QAAQ,MAAM;CAGtD,OAAO,QAAQ;AACjB;AAEA,SAAgB,wBACd,OAIoB;CACpB,OAAQ,MAAM,UAAU,YACtB,MAAM,UAAU,QAChB,MAAM,UAAU;AACpB;AAEA,MAAa,4BAA4B;AAEzC,SAAgB,gCACd,OAIQ;CACR,MAAM,WAAY,MAAM,UAAU,YAChC,MAAM,UAAU,QAChB,MAAM,UAAU;CAElB,IAAI,CAAC,UAAU;EACb,QAAQ,KACN,+OAIF;EACA,OAAO;CACT;CAEA,OAAO;AACT;AACA,SAAgB,oBACd,SACiC;CACjC,MAAM,OAAO,QAAQ,SAAS;CAC9B,QAAQ,MAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK;GACH,IAAI,CAAC,YAAY,WAAW,OAAO,GACjC,MAAM,IAAI,MAAM,8BAA8B;GAChD,OAAO,gCAAgC,OAAO;EAEhD,SACE,MAAM,IAAI,MAAM,yBAAyB,MAAM;CACnD;AACF;AAEA,SAAgB,0BAA0B,OAAwB;CAChE,IAAI,MAAM,SAAS,aAAa,GAAG,OAAO;CAC1C,IAAI,MAAM,SAAS,aAAa,GAAG,OAAO;CAC1C,IAAI,MAAM,SAAS,aAAa,GAAG,OAAO;CAC1C,IAAI,MAAM,SAAS,SAAS,GAAG,OAAO;CAEtC,IAAI,MAAM,SAAS,OAAO,GAAG,OAAO;CACpC,OAAO;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "OpenAI integrations for LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"zod": "^3.25.76 || ^4"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@langchain/core": "^1.2.
|
|
22
|
+
"@langchain/core": "^1.2.14"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@azure/identity": "^4.13.2",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"typescript": "~7.0.2",
|
|
34
34
|
"vitest": "^4.1.11",
|
|
35
35
|
"zod-to-json-schema": "^3.25.2",
|
|
36
|
-
"@langchain/core": "^1.2.
|
|
36
|
+
"@langchain/core": "^1.2.14",
|
|
37
37
|
"@langchain/standard-tests": "0.0.23",
|
|
38
38
|
"@langchain/tsconfig": "0.0.1"
|
|
39
39
|
},
|