UNPKG

langchain

Version:
1 lines • 47.5 kB
{"version":3,"file":"universal.cjs","names":["resolveLangSmithGatewayConfig","getEnvironmentVariable","DEFAULT_LANGSMITH_GATEWAY","BaseChatModel","RunnableBinding","ensureConfig","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: \"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: gatewayConfig.baseURL ?? `${DEFAULT_LANGSMITH_GATEWAY}/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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"}