{"version":3,"file":"universal.cjs","names":["BaseChatModel","RunnableBinding","AsyncGeneratorWithSetup","IterableReadableStream"],"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\";\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-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  groq: {\n    package: \"@langchain/groq\",\n    className: \"ChatGroq\",\n  },\n  cerebras: {\n    package: \"@langchain/cerebras\",\n    className: \"ChatCerebras\",\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  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\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  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\n  async _model(\n    config?: RunnableConfig\n  ): Promise<\n    BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n  > {\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\n    const queuedMethodOperationsEntries = Object.entries(\n      this._queuedMethodOperations\n    );\n    if (queuedMethodOperationsEntries.length > 0) {\n      for (const [method, args] of queuedMethodOperationsEntries) {\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\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._model(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._model(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._model(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._model(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._model(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  streamEvents(\n    input: RunInput,\n    options: Partial<CallOptions> & { version: \"v1\" | \"v2\" },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<StreamEvent>;\n\n  streamEvents(\n    input: RunInput,\n    options: Partial<CallOptions> & {\n      version: \"v1\" | \"v2\";\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      version: \"v1\" | \"v2\";\n      encoding?: \"text/event-stream\" | undefined;\n    },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<StreamEvent | Uint8Array> {\n    const outerThis = this;\n    async function* wrappedGenerator() {\n      const model = await outerThis._model(options);\n      const config = ensureConfig(options);\n      const eventStream = model.streamEvents(input, config, streamOptions);\n\n      for await (const chunk of eventStream) {\n        yield chunk;\n      }\n    }\n    return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\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  }\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  }\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 {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 * @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  }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n  // oxlint-disable-next-line prefer-const\n  let { configurableFields, configPrefix, modelProvider, ...params } = {\n    configPrefix: \"\",\n    ...(fields ?? {}),\n  };\n  if (modelProvider === undefined && model?.includes(\":\")) {\n    const modelComponents = model.split(\":\", 2);\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  if (configurableFieldsCopy === undefined) {\n    return new ConfigurableModel<RunInput, CallOptions>({\n      defaultConfig: {\n        ...paramsCopy,\n        model,\n        modelProvider,\n      },\n      configPrefix,\n    });\n  } else {\n    if (model) {\n      paramsCopy.model = model;\n    }\n    if (modelProvider) {\n      paramsCopy.modelProvider = modelProvider;\n    }\n    return new ConfigurableModel<RunInput, CallOptions>({\n      defaultConfig: paramsCopy,\n      configPrefix,\n      configurableFields: configurableFieldsCopy,\n    });\n  }\n}\n"],"mappings":"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"}