langchain 1.5.6 → 1.5.8
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 +12 -0
- package/dist/chat_models/universal.cjs +23 -1
- package/dist/chat_models/universal.cjs.map +1 -1
- package/dist/chat_models/universal.d.cts +4 -0
- package/dist/chat_models/universal.d.cts.map +1 -1
- package/dist/chat_models/universal.d.ts +4 -0
- package/dist/chat_models/universal.d.ts.map +1 -1
- package/dist/chat_models/universal.js +23 -1
- package/dist/chat_models/universal.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# langchain
|
|
2
2
|
|
|
3
|
+
## 1.5.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#11366](https://github.com/langchain-ai/langchainjs/pull/11366) [`c068bbf`](https://github.com/langchain-ai/langchainjs/commit/c068bbf8c113132bf16ac7a8add44e486a147b41) Thanks [@hntrl](https://github.com/hntrl)! - fix(core,langchain): patch and release core, update peer dependencies
|
|
8
|
+
|
|
9
|
+
## 1.5.7
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#11363](https://github.com/langchain-ai/langchainjs/pull/11363) [`2d1f744`](https://github.com/langchain-ai/langchainjs/commit/2d1f7449c95a554d429535abae0115b4f578bbac) Thanks [@hntrl](https://github.com/hntrl)! - feat(langchain): add langsmith gateway to initChatModel- [#11362](https://github.com/langchain-ai/langchainjs/issues/11362)
|
|
14
|
+
|
|
3
15
|
## 1.5.6
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -4,6 +4,8 @@ let _langchain_core_language_models_chat_models = require("@langchain/core/langu
|
|
|
4
4
|
let _langchain_core_runnables = require("@langchain/core/runnables");
|
|
5
5
|
let _langchain_core_utils_stream = require("@langchain/core/utils/stream");
|
|
6
6
|
let _langchain_core_language_models_stream = require("@langchain/core/language_models/stream");
|
|
7
|
+
let _langchain_core_utils_gateway = require("@langchain/core/utils/gateway");
|
|
8
|
+
let _langchain_core_utils_env = require("@langchain/core/utils/env");
|
|
7
9
|
//#region src/chat_models/universal.ts
|
|
8
10
|
var universal_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
9
11
|
ConfigurableModel: () => ConfigurableModel,
|
|
@@ -12,6 +14,20 @@ var universal_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
|
12
14
|
getChatModelByClassName: () => getChatModelByClassName,
|
|
13
15
|
initChatModel: () => initChatModel
|
|
14
16
|
});
|
|
17
|
+
function getLangSmithChatModelParams({ apiKey, configuration = {} }) {
|
|
18
|
+
const gatewayConfig = (0, _langchain_core_utils_gateway.resolveLangSmithGatewayConfig)({
|
|
19
|
+
baseURL: configuration.baseURL,
|
|
20
|
+
providerPath: "openai/v1"
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
apiKey: apiKey ?? configuration.apiKey ?? gatewayConfig.apiKey ?? ((0, _langchain_core_utils_env.getEnvironmentVariable)("LANGSMITH_GATEWAY_API_KEY") || (0, _langchain_core_utils_env.getEnvironmentVariable)("LANGSMITH_API_KEY")),
|
|
24
|
+
configuration: {
|
|
25
|
+
...configuration,
|
|
26
|
+
baseURL: gatewayConfig.baseURL ?? `${_langchain_core_utils_gateway.DEFAULT_LANGSMITH_GATEWAY}/openai/v1`
|
|
27
|
+
},
|
|
28
|
+
useResponsesApi: true
|
|
29
|
+
};
|
|
30
|
+
}
|
|
15
31
|
const MODEL_PROVIDER_CONFIG = {
|
|
16
32
|
openai: {
|
|
17
33
|
package: "@langchain/openai",
|
|
@@ -25,6 +41,10 @@ const MODEL_PROVIDER_CONFIG = {
|
|
|
25
41
|
package: "@langchain/openai",
|
|
26
42
|
className: "AzureChatOpenAI"
|
|
27
43
|
},
|
|
44
|
+
langsmith: {
|
|
45
|
+
package: "@langchain/openai",
|
|
46
|
+
className: "ChatOpenAI"
|
|
47
|
+
},
|
|
28
48
|
cohere: {
|
|
29
49
|
package: "@langchain/cohere",
|
|
30
50
|
className: "ChatCohere"
|
|
@@ -133,7 +153,8 @@ async function _initChatModelHelper(model, modelProvider, params = {}) {
|
|
|
133
153
|
const { modelProvider: _unused, ...passedParams } = params;
|
|
134
154
|
return new (await (getChatModelByClassName(config.className, modelProviderCopy)))({
|
|
135
155
|
model,
|
|
136
|
-
...passedParams
|
|
156
|
+
...passedParams,
|
|
157
|
+
...modelProviderCopy === "langsmith" ? getLangSmithChatModelParams(passedParams) : {}
|
|
137
158
|
});
|
|
138
159
|
}
|
|
139
160
|
/**
|
|
@@ -372,6 +393,7 @@ var ConfigurableModel = class ConfigurableModel extends _langchain_core_language
|
|
|
372
393
|
* @param {Object} [fields] - Additional configuration options.
|
|
373
394
|
* @param {string} [fields.modelProvider] - The model provider. Supported values include:
|
|
374
395
|
* - openai (@langchain/openai)
|
|
396
|
+
* - langsmith (@langchain/openai, via the [LangSmith LLM Gateway](https://docs.langchain.com/langsmith/llm-gateway))
|
|
375
397
|
* - anthropic (@langchain/anthropic)
|
|
376
398
|
* - azure_openai (@langchain/openai)
|
|
377
399
|
* - google-vertexai (@langchain/google-vertexai)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal.cjs","names":["BaseChatModel","RunnableBinding","AsyncGeneratorWithSetup","IterableReadableStream","ChatModelStream"],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { ChatModelStream } from \"@langchain/core/language_models/stream\";\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n google: {\n package: \"@langchain/google\",\n className: \"ChatGoogle\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n mistral: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({ model, ...passedParams });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n /**\n * Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n */\n profile?: ModelProfile;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n /** @internal */\n private _modelInstanceCache = new Map<\n string,\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n >();\n\n /** @internal */\n private _profile?: ModelProfile;\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n\n this._profile = fields.profile ?? undefined;\n\n this.metadata = {\n ...this.metadata,\n ls_integration: \"langchain_init_chat_model\",\n };\n }\n\n async _getModelInstance(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n // Check cache first\n const cacheKey = this._getCacheKey(config);\n const cachedModel = this._modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n return cachedModel;\n }\n\n // Initialize model with merged params\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations in sequence\n for (const [method, args] of Object.entries(this._queuedMethodOperations)) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n\n // Cache and return the initialized model\n this._modelInstanceCache.set(cacheKey, initializedModel);\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._getModelInstance(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._getModelInstance(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions>\n ): ChatModelStream;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions> & {\n version?: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): ChatModelStream | IterableReadableStream<StreamEvent | Uint8Array> {\n if (options?.version === \"v1\" || options?.version === \"v2\") {\n const outerThis = this;\n const tracingCallOptions = options;\n async function* wrappedGenerator() {\n const model = await outerThis._getModelInstance(tracingCallOptions);\n const config = ensureConfig(tracingCallOptions);\n const tracingOptions = {\n ...config,\n version: tracingCallOptions.version,\n ...(tracingCallOptions.encoding !== undefined\n ? { encoding: tracingCallOptions.encoding }\n : {}),\n };\n let eventStream: IterableReadableStream<StreamEvent | Uint8Array>;\n if (\n tracingCallOptions.version === \"v1\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else if (tracingCallOptions.version === \"v1\") {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v1\" },\n streamOptions\n );\n } else if (\n tracingCallOptions.version === \"v2\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v2\" },\n streamOptions\n );\n }\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n\n const outerThis = this;\n async function* deferredEvents() {\n const model = await outerThis._getModelInstance(options);\n const config = ensureConfig(options);\n yield* model.streamEvents(input, config);\n }\n return new ChatModelStream(deferredEvents());\n }\n\n /**\n * Return profiling information for the model.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n if (this._profile) {\n return this._profile;\n }\n const cacheKey = this._getCacheKey({});\n const instance = this._modelInstanceCache.get(cacheKey);\n return instance?.profile ?? {};\n }\n\n /** @internal */\n _getCacheKey(config?: RunnableConfig): string {\n let toStringify = config ?? {};\n if (toStringify.configurable) {\n const { configurable } = toStringify;\n const filtered: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(configurable)) {\n if (!k.startsWith(\"__pregel_\")) {\n filtered[k] = v;\n }\n }\n toStringify = { ...toStringify, configurable: filtered };\n }\n return JSON.stringify(toStringify);\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {ModelProfile} [fields.profile] - Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Initialize a model with a custom profile\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const model = await initChatModel(\"gpt-4o-mini\", {\n * profile: {\n * maxInputTokens: 100000,\n * },\n * });\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, profile, ...params } =\n {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const [provider, ...remainingParts] = model.split(\":\");\n const modelComponents =\n remainingParts.length === 0\n ? [provider]\n : [provider, remainingParts.join(\":\")];\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n let configurableModel: ConfigurableModel<RunInput, CallOptions>;\n\n if (configurableFieldsCopy === undefined) {\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n profile,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n profile,\n });\n }\n\n // Initialize the model instance to make sure a profile is available\n await configurableModel._getModelInstance();\n return configurableModel;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"universal.cjs","names":["DEFAULT_LANGSMITH_GATEWAY","BaseChatModel","RunnableBinding","AsyncGeneratorWithSetup","IterableReadableStream","ChatModelStream"],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { ChatModelStream } from \"@langchain/core/language_models/stream\";\nimport {\n DEFAULT_LANGSMITH_GATEWAY,\n resolveLangSmithGatewayConfig,\n} from \"@langchain/core/utils/gateway\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nfunction getLangSmithChatModelParams({\n apiKey,\n configuration = {},\n}: {\n apiKey?: unknown;\n configuration?: { apiKey?: unknown; baseURL?: string };\n}) {\n const gatewayConfig = resolveLangSmithGatewayConfig({\n baseURL: configuration.baseURL,\n providerPath: \"openai/v1\",\n });\n\n return {\n apiKey:\n apiKey ??\n configuration.apiKey ??\n gatewayConfig.apiKey ??\n (getEnvironmentVariable(\"LANGSMITH_GATEWAY_API_KEY\") ||\n getEnvironmentVariable(\"LANGSMITH_API_KEY\")),\n configuration: {\n ...configuration,\n baseURL:\n gatewayConfig.baseURL ?? `${DEFAULT_LANGSMITH_GATEWAY}/openai/v1`,\n },\n useResponsesApi: true,\n };\n}\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n langsmith: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n google: {\n package: \"@langchain/google\",\n className: \"ChatGoogle\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n mistral: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({\n model,\n ...passedParams,\n ...(modelProviderCopy === \"langsmith\"\n ? getLangSmithChatModelParams(passedParams)\n : {}),\n });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n /**\n * Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n */\n profile?: ModelProfile;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n /** @internal */\n private _modelInstanceCache = new Map<\n string,\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n >();\n\n /** @internal */\n private _profile?: ModelProfile;\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n\n this._profile = fields.profile ?? undefined;\n\n this.metadata = {\n ...this.metadata,\n ls_integration: \"langchain_init_chat_model\",\n };\n }\n\n async _getModelInstance(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n // Check cache first\n const cacheKey = this._getCacheKey(config);\n const cachedModel = this._modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n return cachedModel;\n }\n\n // Initialize model with merged params\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations in sequence\n for (const [method, args] of Object.entries(this._queuedMethodOperations)) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n\n // Cache and return the initialized model\n this._modelInstanceCache.set(cacheKey, initializedModel);\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._getModelInstance(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._getModelInstance(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions>\n ): ChatModelStream;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions> & {\n version?: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): ChatModelStream | IterableReadableStream<StreamEvent | Uint8Array> {\n if (options?.version === \"v1\" || options?.version === \"v2\") {\n const outerThis = this;\n const tracingCallOptions = options;\n async function* wrappedGenerator() {\n const model = await outerThis._getModelInstance(tracingCallOptions);\n const config = ensureConfig(tracingCallOptions);\n const tracingOptions = {\n ...config,\n version: tracingCallOptions.version,\n ...(tracingCallOptions.encoding !== undefined\n ? { encoding: tracingCallOptions.encoding }\n : {}),\n };\n let eventStream: IterableReadableStream<StreamEvent | Uint8Array>;\n if (\n tracingCallOptions.version === \"v1\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else if (tracingCallOptions.version === \"v1\") {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v1\" },\n streamOptions\n );\n } else if (\n tracingCallOptions.version === \"v2\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v2\" },\n streamOptions\n );\n }\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n\n const outerThis = this;\n async function* deferredEvents() {\n const model = await outerThis._getModelInstance(options);\n const config = ensureConfig(options);\n yield* model.streamEvents(input, config);\n }\n return new ChatModelStream(deferredEvents());\n }\n\n /**\n * Return profiling information for the model.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n if (this._profile) {\n return this._profile;\n }\n const cacheKey = this._getCacheKey({});\n const instance = this._modelInstanceCache.get(cacheKey);\n return instance?.profile ?? {};\n }\n\n /** @internal */\n _getCacheKey(config?: RunnableConfig): string {\n let toStringify = config ?? {};\n if (toStringify.configurable) {\n const { configurable } = toStringify;\n const filtered: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(configurable)) {\n if (!k.startsWith(\"__pregel_\")) {\n filtered[k] = v;\n }\n }\n toStringify = { ...toStringify, configurable: filtered };\n }\n return JSON.stringify(toStringify);\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - langsmith (@langchain/openai, via the [LangSmith LLM Gateway](https://docs.langchain.com/langsmith/llm-gateway))\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {ModelProfile} [fields.profile] - Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Initialize a model with a custom profile\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const model = await initChatModel(\"gpt-4o-mini\", {\n * profile: {\n * maxInputTokens: 100000,\n * },\n * });\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, profile, ...params } =\n {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const [provider, ...remainingParts] = model.split(\":\");\n const modelComponents =\n remainingParts.length === 0\n ? [provider]\n : [provider, remainingParts.join(\":\")];\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n let configurableModel: ConfigurableModel<RunInput, CallOptions>;\n\n if (configurableFieldsCopy === undefined) {\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n profile,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n profile,\n });\n }\n\n // Initialize the model instance to make sure a profile is available\n await configurableModel._getModelInstance();\n return configurableModel;\n}\n"],"mappings":"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"}
|
|
@@ -27,6 +27,10 @@ declare const MODEL_PROVIDER_CONFIG: {
|
|
|
27
27
|
readonly package: "@langchain/openai";
|
|
28
28
|
readonly className: "AzureChatOpenAI";
|
|
29
29
|
};
|
|
30
|
+
readonly langsmith: {
|
|
31
|
+
readonly package: "@langchain/openai";
|
|
32
|
+
readonly className: "ChatOpenAI";
|
|
33
|
+
};
|
|
30
34
|
readonly cohere: {
|
|
31
35
|
readonly package: "@langchain/cohere";
|
|
32
36
|
readonly className: "ChatCohere";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal.d.cts","names":[],"sources":["../../src/chat_models/universal.ts"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"universal.d.cts","names":[],"sources":["../../src/chat_models/universal.ts"],"mappings":"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"}
|
|
@@ -27,6 +27,10 @@ declare const MODEL_PROVIDER_CONFIG: {
|
|
|
27
27
|
readonly package: "@langchain/openai";
|
|
28
28
|
readonly className: "AzureChatOpenAI";
|
|
29
29
|
};
|
|
30
|
+
readonly langsmith: {
|
|
31
|
+
readonly package: "@langchain/openai";
|
|
32
|
+
readonly className: "ChatOpenAI";
|
|
33
|
+
};
|
|
30
34
|
readonly cohere: {
|
|
31
35
|
readonly package: "@langchain/cohere";
|
|
32
36
|
readonly className: "ChatCohere";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal.d.ts","names":[],"sources":["../../src/chat_models/universal.ts"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"universal.d.ts","names":[],"sources":["../../src/chat_models/universal.ts"],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ import { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
|
3
3
|
import { RunnableBinding, ensureConfig } from "@langchain/core/runnables";
|
|
4
4
|
import { AsyncGeneratorWithSetup, IterableReadableStream } from "@langchain/core/utils/stream";
|
|
5
5
|
import { ChatModelStream } from "@langchain/core/language_models/stream";
|
|
6
|
+
import { DEFAULT_LANGSMITH_GATEWAY, resolveLangSmithGatewayConfig } from "@langchain/core/utils/gateway";
|
|
7
|
+
import { getEnvironmentVariable } from "@langchain/core/utils/env";
|
|
6
8
|
//#region src/chat_models/universal.ts
|
|
7
9
|
var universal_exports = /* @__PURE__ */ __exportAll({
|
|
8
10
|
ConfigurableModel: () => ConfigurableModel,
|
|
@@ -11,6 +13,20 @@ var universal_exports = /* @__PURE__ */ __exportAll({
|
|
|
11
13
|
getChatModelByClassName: () => getChatModelByClassName,
|
|
12
14
|
initChatModel: () => initChatModel
|
|
13
15
|
});
|
|
16
|
+
function getLangSmithChatModelParams({ apiKey, configuration = {} }) {
|
|
17
|
+
const gatewayConfig = resolveLangSmithGatewayConfig({
|
|
18
|
+
baseURL: configuration.baseURL,
|
|
19
|
+
providerPath: "openai/v1"
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
apiKey: apiKey ?? configuration.apiKey ?? gatewayConfig.apiKey ?? (getEnvironmentVariable("LANGSMITH_GATEWAY_API_KEY") || getEnvironmentVariable("LANGSMITH_API_KEY")),
|
|
23
|
+
configuration: {
|
|
24
|
+
...configuration,
|
|
25
|
+
baseURL: gatewayConfig.baseURL ?? `${DEFAULT_LANGSMITH_GATEWAY}/openai/v1`
|
|
26
|
+
},
|
|
27
|
+
useResponsesApi: true
|
|
28
|
+
};
|
|
29
|
+
}
|
|
14
30
|
const MODEL_PROVIDER_CONFIG = {
|
|
15
31
|
openai: {
|
|
16
32
|
package: "@langchain/openai",
|
|
@@ -24,6 +40,10 @@ const MODEL_PROVIDER_CONFIG = {
|
|
|
24
40
|
package: "@langchain/openai",
|
|
25
41
|
className: "AzureChatOpenAI"
|
|
26
42
|
},
|
|
43
|
+
langsmith: {
|
|
44
|
+
package: "@langchain/openai",
|
|
45
|
+
className: "ChatOpenAI"
|
|
46
|
+
},
|
|
27
47
|
cohere: {
|
|
28
48
|
package: "@langchain/cohere",
|
|
29
49
|
className: "ChatCohere"
|
|
@@ -132,7 +152,8 @@ async function _initChatModelHelper(model, modelProvider, params = {}) {
|
|
|
132
152
|
const { modelProvider: _unused, ...passedParams } = params;
|
|
133
153
|
return new (await (getChatModelByClassName(config.className, modelProviderCopy)))({
|
|
134
154
|
model,
|
|
135
|
-
...passedParams
|
|
155
|
+
...passedParams,
|
|
156
|
+
...modelProviderCopy === "langsmith" ? getLangSmithChatModelParams(passedParams) : {}
|
|
136
157
|
});
|
|
137
158
|
}
|
|
138
159
|
/**
|
|
@@ -371,6 +392,7 @@ var ConfigurableModel = class ConfigurableModel extends BaseChatModel {
|
|
|
371
392
|
* @param {Object} [fields] - Additional configuration options.
|
|
372
393
|
* @param {string} [fields.modelProvider] - The model provider. Supported values include:
|
|
373
394
|
* - openai (@langchain/openai)
|
|
395
|
+
* - langsmith (@langchain/openai, via the [LangSmith LLM Gateway](https://docs.langchain.com/langsmith/llm-gateway))
|
|
374
396
|
* - anthropic (@langchain/anthropic)
|
|
375
397
|
* - azure_openai (@langchain/openai)
|
|
376
398
|
* - google-vertexai (@langchain/google-vertexai)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal.js","names":[],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { ChatModelStream } from \"@langchain/core/language_models/stream\";\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n google: {\n package: \"@langchain/google\",\n className: \"ChatGoogle\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n mistral: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({ model, ...passedParams });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n /**\n * Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n */\n profile?: ModelProfile;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n /** @internal */\n private _modelInstanceCache = new Map<\n string,\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n >();\n\n /** @internal */\n private _profile?: ModelProfile;\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n\n this._profile = fields.profile ?? undefined;\n\n this.metadata = {\n ...this.metadata,\n ls_integration: \"langchain_init_chat_model\",\n };\n }\n\n async _getModelInstance(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n // Check cache first\n const cacheKey = this._getCacheKey(config);\n const cachedModel = this._modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n return cachedModel;\n }\n\n // Initialize model with merged params\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations in sequence\n for (const [method, args] of Object.entries(this._queuedMethodOperations)) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n\n // Cache and return the initialized model\n this._modelInstanceCache.set(cacheKey, initializedModel);\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._getModelInstance(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._getModelInstance(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions>\n ): ChatModelStream;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions> & {\n version?: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): ChatModelStream | IterableReadableStream<StreamEvent | Uint8Array> {\n if (options?.version === \"v1\" || options?.version === \"v2\") {\n const outerThis = this;\n const tracingCallOptions = options;\n async function* wrappedGenerator() {\n const model = await outerThis._getModelInstance(tracingCallOptions);\n const config = ensureConfig(tracingCallOptions);\n const tracingOptions = {\n ...config,\n version: tracingCallOptions.version,\n ...(tracingCallOptions.encoding !== undefined\n ? { encoding: tracingCallOptions.encoding }\n : {}),\n };\n let eventStream: IterableReadableStream<StreamEvent | Uint8Array>;\n if (\n tracingCallOptions.version === \"v1\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else if (tracingCallOptions.version === \"v1\") {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v1\" },\n streamOptions\n );\n } else if (\n tracingCallOptions.version === \"v2\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v2\" },\n streamOptions\n );\n }\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n\n const outerThis = this;\n async function* deferredEvents() {\n const model = await outerThis._getModelInstance(options);\n const config = ensureConfig(options);\n yield* model.streamEvents(input, config);\n }\n return new ChatModelStream(deferredEvents());\n }\n\n /**\n * Return profiling information for the model.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n if (this._profile) {\n return this._profile;\n }\n const cacheKey = this._getCacheKey({});\n const instance = this._modelInstanceCache.get(cacheKey);\n return instance?.profile ?? {};\n }\n\n /** @internal */\n _getCacheKey(config?: RunnableConfig): string {\n let toStringify = config ?? {};\n if (toStringify.configurable) {\n const { configurable } = toStringify;\n const filtered: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(configurable)) {\n if (!k.startsWith(\"__pregel_\")) {\n filtered[k] = v;\n }\n }\n toStringify = { ...toStringify, configurable: filtered };\n }\n return JSON.stringify(toStringify);\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {ModelProfile} [fields.profile] - Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Initialize a model with a custom profile\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const model = await initChatModel(\"gpt-4o-mini\", {\n * profile: {\n * maxInputTokens: 100000,\n * },\n * });\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, profile, ...params } =\n {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const [provider, ...remainingParts] = model.split(\":\");\n const modelComponents =\n remainingParts.length === 0\n ? [provider]\n : [provider, remainingParts.join(\":\")];\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n let configurableModel: ConfigurableModel<RunInput, CallOptions>;\n\n if (configurableFieldsCopy === undefined) {\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n profile,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n profile,\n });\n }\n\n // Initialize the model instance to make sure a profile is available\n await configurableModel._getModelInstance();\n return configurableModel;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"universal.js","names":[],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\nimport { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { ChatModelStream } from \"@langchain/core/language_models/stream\";\nimport {\n DEFAULT_LANGSMITH_GATEWAY,\n resolveLangSmithGatewayConfig,\n} from \"@langchain/core/utils/gateway\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nfunction getLangSmithChatModelParams({\n apiKey,\n configuration = {},\n}: {\n apiKey?: unknown;\n configuration?: { apiKey?: unknown; baseURL?: string };\n}) {\n const gatewayConfig = resolveLangSmithGatewayConfig({\n baseURL: configuration.baseURL,\n providerPath: \"openai/v1\",\n });\n\n return {\n apiKey:\n apiKey ??\n configuration.apiKey ??\n gatewayConfig.apiKey ??\n (getEnvironmentVariable(\"LANGSMITH_GATEWAY_API_KEY\") ||\n getEnvironmentVariable(\"LANGSMITH_API_KEY\")),\n configuration: {\n ...configuration,\n baseURL:\n gatewayConfig.baseURL ?? `${DEFAULT_LANGSMITH_GATEWAY}/openai/v1`,\n },\n useResponsesApi: true,\n };\n}\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n langsmith: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n google: {\n package: \"@langchain/google\",\n className: \"ChatGoogle\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n mistral: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({\n model,\n ...passedParams,\n ...(modelProviderCopy === \"langsmith\"\n ? getLangSmithChatModelParams(passedParams)\n : {}),\n });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n /**\n * Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n */\n profile?: ModelProfile;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n /** @internal */\n private _modelInstanceCache = new Map<\n string,\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n >();\n\n /** @internal */\n private _profile?: ModelProfile;\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n\n this._profile = fields.profile ?? undefined;\n\n this.metadata = {\n ...this.metadata,\n ls_integration: \"langchain_init_chat_model\",\n };\n }\n\n async _getModelInstance(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n // Check cache first\n const cacheKey = this._getCacheKey(config);\n const cachedModel = this._modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n return cachedModel;\n }\n\n // Initialize model with merged params\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations in sequence\n for (const [method, args] of Object.entries(this._queuedMethodOperations)) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n\n // Cache and return the initialized model\n this._modelInstanceCache.set(cacheKey, initializedModel);\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._getModelInstance(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._getModelInstance(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._getModelInstance(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n /**\n * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n * option for content-block streaming instead.\n */\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions>\n ): ChatModelStream;\n\n streamEvents(\n input: RunInput,\n options?: Partial<CallOptions> & {\n version?: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): ChatModelStream | IterableReadableStream<StreamEvent | Uint8Array> {\n if (options?.version === \"v1\" || options?.version === \"v2\") {\n const outerThis = this;\n const tracingCallOptions = options;\n async function* wrappedGenerator() {\n const model = await outerThis._getModelInstance(tracingCallOptions);\n const config = ensureConfig(tracingCallOptions);\n const tracingOptions = {\n ...config,\n version: tracingCallOptions.version,\n ...(tracingCallOptions.encoding !== undefined\n ? { encoding: tracingCallOptions.encoding }\n : {}),\n };\n let eventStream: IterableReadableStream<StreamEvent | Uint8Array>;\n if (\n tracingCallOptions.version === \"v1\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v1\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else if (tracingCallOptions.version === \"v1\") {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v1\" },\n streamOptions\n );\n } else if (\n tracingCallOptions.version === \"v2\" &&\n tracingCallOptions.encoding === \"text/event-stream\"\n ) {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & {\n version: \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions\n );\n } else {\n eventStream = model.streamEvents(\n input,\n tracingOptions as Partial<CallOptions> & { version: \"v2\" },\n streamOptions\n );\n }\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n\n const outerThis = this;\n async function* deferredEvents() {\n const model = await outerThis._getModelInstance(options);\n const config = ensureConfig(options);\n yield* model.streamEvents(input, config);\n }\n return new ChatModelStream(deferredEvents());\n }\n\n /**\n * Return profiling information for the model.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n if (this._profile) {\n return this._profile;\n }\n const cacheKey = this._getCacheKey({});\n const instance = this._modelInstanceCache.get(cacheKey);\n return instance?.profile ?? {};\n }\n\n /** @internal */\n _getCacheKey(config?: RunnableConfig): string {\n let toStringify = config ?? {};\n if (toStringify.configurable) {\n const { configurable } = toStringify;\n const filtered: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(configurable)) {\n if (!k.startsWith(\"__pregel_\")) {\n filtered[k] = v;\n }\n }\n toStringify = { ...toStringify, configurable: filtered };\n }\n return JSON.stringify(toStringify);\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - langsmith (@langchain/openai, via the [LangSmith LLM Gateway](https://docs.langchain.com/langsmith/llm-gateway))\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {ModelProfile} [fields.profile] - Overrides the profiling information for the model. If not provided,\n * the profile will be inferred from the inner model instance.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Initialize a model with a custom profile\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const model = await initChatModel(\"gpt-4o-mini\", {\n * profile: {\n * maxInputTokens: 100000,\n * },\n * });\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n profile?: ModelProfile;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, profile, ...params } =\n {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const [provider, ...remainingParts] = model.split(\":\");\n const modelComponents =\n remainingParts.length === 0\n ? [provider]\n : [provider, remainingParts.join(\":\")];\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n let configurableModel: ConfigurableModel<RunInput, CallOptions>;\n\n if (configurableFieldsCopy === undefined) {\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n profile,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n configurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n profile,\n });\n }\n\n // Initialize the model instance to make sure a profile is available\n await configurableModel._getModelInstance();\n return configurableModel;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "langchain",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.8",
|
|
4
4
|
"description": "Typescript bindings for langchain",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -53,15 +53,15 @@
|
|
|
53
53
|
"typescript": "~7.0.2",
|
|
54
54
|
"vitest": "^4.1.8",
|
|
55
55
|
"yaml": "^2.9.0",
|
|
56
|
-
"@langchain/
|
|
57
|
-
"@langchain/
|
|
58
|
-
"@langchain/core": "^1.2.6",
|
|
59
|
-
"@langchain/fireworks": "0.2.7",
|
|
56
|
+
"@langchain/core": "^1.2.7",
|
|
57
|
+
"@langchain/anthropic": "1.5.5",
|
|
60
58
|
"@langchain/openai": "1.5.7",
|
|
59
|
+
"@langchain/fireworks": "0.2.7",
|
|
60
|
+
"@langchain/aws": "1.4.3",
|
|
61
61
|
"@langchain/tsconfig": "0.0.1"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
|
-
"@langchain/core": "^1.2.
|
|
64
|
+
"@langchain/core": "^1.2.7"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"@langchain/langgraph": "^1.4.8",
|