Automated OpenWiki documentation update. OpenWiki result: success When the result is `failure`, this PR intentionally preserves only the pages completed before the failure. Merge it to make that progress the baseline for the next scheduled run. Co-authored-by: npentrel <5212232+npentrel@users.noreply.github.com>
24 KiB
type, title, description, tags, verified, sources, generated
| type | title | description | tags | verified | sources | generated | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Factory | Chat Model Initialization with init_chat_model | Factory function for instantiating chat models from provider strings with unified configuration and runtime model switching. |
|
|
|
|
Overview
init_chat_model is a factory function that creates chat model instances from a unified interface. It centralizes model instantiation across all supported provider integrations (OpenAI, Anthropic, Bedrock, Google Vertex AI, etc.), handles parameter routing to provider-specific constructors, and supports runtime model configuration via LangChain's Runnable configuration system.
The factory accepts a model name with optional provider prefix (e.g., "openai:gpt-4", "anthropic:claude-opus-4-7"), infers the provider when unspecified, retrieves the provider's integration package, and instantiates the corresponding chat model class with translated kwargs.
Core responsibilities:
- Accept and parse model identifiers with or without provider prefixes
- Infer providers from model name prefixes using heuristics
- Dynamically import provider integration packages and classes
- Route provider-specific kwargs to provider constructors
- Support both fixed (non-configurable) and runtime-configurable (switch model/provider at invoke time) initialization modes
- Route requests through LangSmith gateway when provider is
langsmith
Location
File: repo://libs/langchain_v1/langchain/chat_models/base.py
Public export: repo://libs/langchain_v1/langchain/chat_models/__init__.py#L5
Function Signature
def init_chat_model(
model: str | None = None,
*,
model_provider: str | None = None,
configurable_fields: Literal["any"] | list[str] | tuple[str, ...] | None = None,
config_prefix: str | None = None,
**kwargs: Any,
) -> BaseChatModel | _ConfigurableModel
Parameters:
-
model(str | None): Model identifier, optionally with provider prefix ("provider:model-name"). IfNone, returns a configurable model that requires model name at runtime. Examples:"openai:gpt-5.5"(explicit prefix)"gpt-5.5"(inferred as OpenAI)None(configurable at runtime)
-
model_provider(str | None): Provider name as an alternative to prefix format. Used when provider is dynamic or needs to be independently configurable. Normalized to lowercase with underscores (e.g.,"azure-openai"→"azure_openai"). -
configurable_fields(Literal["any"] | list[str] | tuple[str, ...] | None):None: No fields are configurable (fixed model, default ifmodelis specified)"any": All parameters become configurable at runtime (⚠️ security: includes api_key, base_url)list[str] | tuple[str, ...]: Specified parameter names (e.g.,("temperature", "max_tokens")) are configurable- Defaults to
("model", "model_provider")ifmodelisNone
-
config_prefix(str | None): Optional namespace prefix for runtime config keys. Used when multiple configurable models exist in the same application. Config is accessed viaconfig["configurable"]["{config_prefix}_{param}"]. -
**kwargs: Provider-specific parameters passed to the underlying chat model's constructor. Common parameters:temperature(float): Randomness control (0–1 or provider-specific range)max_tokens(int): Maximum output tokenstimeout(float): Request timeout in secondsmax_retries(int): Retry attempt limitbase_url(str): Custom API endpoint (OpenAI-compatible)rate_limiter(BaseRateLimiter): Rate limiting instance- Provider-specific:
openai_api_key,anthropic_api_url,bedrock_region, etc.
Returns:
BaseChatModel: A fixed (non-configurable) chat model whenconfigurable_fieldsisNone(the default ifmodelis specified)_ConfigurableModel: A wrapper runnable that defers model instantiation untilinvoke/streamis called with configuration, enabling runtime model selection
Raises:
TypeError: Ifmodelis not a string (e.g., a model object is passed)ValueError: If provider cannot be inferred or is not supportedImportError: If the provider's integration package is not installed
Model Name Parsing and Provider Inference
Explicit Provider Prefix
If a colon (:) divides the model string and the prefix is a registered provider, it is extracted:
init_chat_model("openai:gpt-5.5") # provider='openai', model='gpt-5.5'
init_chat_model("anthropic:claude-opus-4-7") # provider='anthropic', model='claude-opus-4-7'
Bare Model Name with Inference
Without an explicit prefix, _attempt_infer_model_provider uses case-insensitive prefix matching:
| Model Prefix | Inferred Provider |
|---|---|
gpt-, o1, o3, chatgpt, text-davinci |
openai |
claude |
anthropic |
command |
cohere |
accounts/fireworks |
fireworks |
gemini |
google_vertexai (⚠️ deprecated default; changing to google_genai in next major release) |
amazon., anthropic., meta. |
bedrock |
mistral, mixtral |
mistralai |
deepseek |
deepseek |
grok |
xai |
sonar |
perplexity |
solar |
upstage |
Example:
init_chat_model("gpt-4") # inferred as openai:gpt-4
init_chat_model("claude-sonnet-4-5-20250929") # inferred as anthropic
If inference fails and model_provider is not provided, a ValueError lists supported providers and suggests the documentation.
Built-in Provider Registry
The _BUILTIN_PROVIDERS dictionary maps provider names to module paths, class names, and instantiation functions. Each entry is a tuple: (module_path, class_name, creator_func).
All 32 Built-in Providers (repo://libs/langchain_v1/langchain/chat_models/base.py#L56-L97):
| Provider | Package | Class | Module | Notes |
|---|---|---|---|---|
openai |
langchain-openai |
ChatOpenAI |
langchain_openai |
|
anthropic |
langchain-anthropic |
ChatAnthropic |
langchain_anthropic |
|
azure_openai |
langchain-openai |
AzureChatOpenAI |
langchain_openai |
|
azure_ai |
langchain-azure-ai |
AzureAIOpenAIApiChatModel |
langchain_azure_ai.chat_models |
Submodule import |
google_vertexai |
langchain-google-vertexai |
ChatVertexAI |
langchain_google_vertexai |
|
google_genai |
langchain-google-genai |
ChatGoogleGenerativeAI |
langchain_google_genai |
|
google_anthropic_vertex |
langchain-google-vertexai |
ChatAnthropicVertex |
langchain_google_vertexai.model_garden |
Anthropic via Google Vertex |
anthropic_bedrock |
langchain-aws |
ChatAnthropicBedrock |
langchain_aws |
Bedrock-hosted Anthropic |
bedrock |
langchain-aws |
ChatBedrock |
langchain_aws |
Generic Bedrock models |
bedrock_converse |
langchain-aws |
ChatBedrockConverse |
langchain_aws |
Bedrock Converse API |
cohere |
langchain-cohere |
ChatCohere |
langchain_cohere |
|
deepseek |
langchain-deepseek |
ChatDeepSeek |
langchain_deepseek |
|
fireworks |
langchain-fireworks |
ChatFireworks |
langchain_fireworks |
|
groq |
langchain-groq |
ChatGroq |
langchain_groq |
|
huggingface |
langchain-huggingface |
ChatHuggingFace |
langchain_huggingface |
Uses from_model_id() |
ibm |
langchain-ibm |
ChatWatsonx |
langchain_ibm |
Uses model_id= param |
litellm |
langchain-litellm |
ChatLiteLLM |
langchain_litellm |
|
meta |
langchain-meta |
ChatMetaModel |
langchain_meta |
|
mistralai |
langchain-mistralai |
ChatMistralAI |
langchain_mistralai |
|
nvidia |
langchain-nvidia-ai-endpoints |
ChatNVIDIA |
langchain_nvidia_ai_endpoints |
|
ollama |
langchain-ollama |
ChatOllama |
langchain_ollama |
Fallback to langchain_community |
openrouter |
langchain-openrouter |
ChatOpenRouter |
langchain_openrouter |
|
perplexity |
langchain-perplexity |
ChatPerplexity |
langchain_perplexity |
|
together |
langchain-together |
ChatTogether |
langchain_together |
|
upstage |
langchain-upstage |
ChatUpstage |
langchain_upstage |
|
xai |
langchain-xai |
ChatXAI |
langchain_xai |
|
baseten |
langchain-baseten |
ChatBaseten |
langchain_baseten |
|
langsmith |
langchain-openai |
ChatOpenAI |
langchain_openai |
Routes via LangSmith gateway |
Design notes:
- The registry is not exhaustive. Unlisted providers can still be used if their integration package is installed, but model name inference will not work;
model_providermust be specified. - Most entries use the standard
_callcreator function, which directly instantiates the class. - Special creators:
huggingfaceusesfrom_model_id(model_id=...),ibmusesmodel_id=...,langsmithwraps instantiation with gateway configuration.
Parameter Mapping and Creator Functions
The _get_chat_model_creator function retrieves the provider's creator function and returns a partially-applied callable:
@functools.lru_cache(maxsize=len(_BUILTIN_PROVIDERS))
def _get_chat_model_creator(provider: str) -> Callable[..., BaseChatModel]:
# Look up provider in registry
pkg, class_name, creator_func = _BUILTIN_PROVIDERS[provider]
# Import module and get class
module = _import_module(pkg, class_name)
cls = getattr(module, class_name)
# Return partial with class bound
return functools.partial(creator_func, cls=cls)
Standard Creator (_call):
def _call(cls: type[BaseChatModel], **kwargs: Any) -> BaseChatModel:
return cls(**kwargs)
Forwards all kwargs directly to the provider's __init__.
Special Creators:
-
HuggingFace:
lambda cls, model, **kwargs: cls.from_model_id(model_id=model, **kwargs)- Uses the class method
from_model_idinstead of direct instantiation modelparameter becomesmodel_id=
- Uses the class method
-
IBM:
lambda cls, model, **kwargs: cls(model_id=model, **kwargs)- Maps
modeltomodel_id=parameter in constructor
- Maps
-
LangSmith Gateway (
_init_langsmith):- Calls
_apply_gateway_configto inject gateway credentials and base URL from environment (orLANGSMITH_GATEWAYURL) - Sets
use_responses_api=Trueto enable compatibility with gateway - Falls back to
LANGSMITH_API_KEYifLANGSMITH_GATEWAY_API_KEYnot set
- Calls
def _init_langsmith(cls: type[BaseChatModel], **kwargs: Any) -> BaseChatModel:
_apply_gateway_config(
kwargs,
cls,
base_url_field="openai_api_base",
api_key_field="openai_api_key",
provider_path="v1",
api_key_env=("LANGSMITH_GATEWAY_API_KEY", "LANGSMITH_API_KEY"),
default_base_url="https://gateway.smith.langchain.com/v1",
)
kwargs["use_responses_api"] = True
return cls(**kwargs)
Parameter Routing:
All **kwargs passed to init_chat_model are forwarded to the provider's constructor. The provider's parameter validation enforces which kwargs are accepted. Common cross-provider kwargs (temperature, max_tokens, timeout, max_retries) work on most providers; provider-specific kwargs (e.g., openai_api_key, anthropic_api_url) are only valid for their target provider.
Fixed Model Initialization
When model is specified and configurable_fields is None (default), init_chat_model immediately instantiates and returns a BaseChatModel:
init_chat_model("gpt-4", temperature=0.7, max_tokens=500)
# Returns ChatOpenAI instance, ready to invoke
Control flow (repo://libs/langchain_v1/langchain/chat_models/base.py#L515-L520):
if not configurable_fields:
return _init_chat_model_helper(
cast("str", model),
model_provider=model_provider,
**kwargs,
)
The _init_chat_model_helper function parses the model, retrieves the creator, and instantiates:
def _init_chat_model_helper(
model: str,
*,
model_provider: str | None = None,
**kwargs: Any,
) -> BaseChatModel:
model, model_provider = _parse_model(model, model_provider)
creator_func = _get_chat_model_creator(model_provider)
return creator_func(model=model, **kwargs)
Error handling:
- If the package is missing:
ImportErrorwith suggestion topip install <package> - If the provider is unknown:
ValueErrorlisting all supported providers - If model_provider inference fails:
ValueErrorwith docs link
Runtime-Configurable Model Initialization
When configurable_fields is not None or model is None, init_chat_model returns a _ConfigurableModel, a Runnable wrapper that defers instantiation until config is provided at invoke time.
Use cases:
-
No default model – select model at runtime:
model = init_chat_model() # No model specified model.invoke("hello", config={"configurable": {"model": "gpt-4"}}) model.invoke("hello", config={"configurable": {"model": "claude-opus-4-7"}}) -
Default model, switchable parameters – override specific fields at runtime:
model = init_chat_model( "gpt-4", configurable_fields=("temperature", "max_tokens"), temperature=0.5, max_tokens=100 ) model.invoke( "hello", config={"configurable": {"temperature": 0.9, "max_tokens": 500}} ) -
Default model, fully configurable – switch model or any parameter at runtime:
model = init_chat_model( "gpt-4", configurable_fields="any", # All fields configurable config_prefix="my_model" ) model.invoke("hello") # Uses gpt-4, temperature=None model.invoke( "hello", config={ "configurable": { "my_model_model": "claude-opus-4-7", "my_model_temperature": 0.8 } } )
_ConfigurableModel
Location: repo://libs/langchain_v1/langchain/chat_models/base.py#L657-L1050
_ConfigurableModel is a Runnable[LanguageModelInput, Any] that queues model initialization and operations until a config is provided:
State:
_default_config: Dictionary of default parameter values (e.g.,{"model": "gpt-4", "temperature": 0.5})_configurable_fields: Which fields can be overridden at runtime ("any", a list of field names)_config_prefix: Namespace for config keys (e.g.,"my_model_")_queued_declarative_operations: List of method calls (e.g.,bind_tools,with_structured_output) to apply after model instantiation
Lifecycle:
- Instantiation:
init_chat_model(...)creates_ConfigurableModelwith default config and queued operations - Declarative operations (e.g.,
.bind_tools(...)): Operations are queued; a new_ConfigurableModelis returned without mutation - Invocation (e.g.,
.invoke(..., config=...)):_model(config)is called to:- Merge default and runtime config
- Call
_init_chat_model_helperto instantiate the actual model - Apply all queued operations in order
- Return the configured model instance
- Streaming/batch operations delegate to the instantiated model
Config merging (repo://libs/langchain_v1/langchain/chat_models/base.py#L711-L727):
def _model(self, config: RunnableConfig | None = None) -> Runnable[Any, Any]:
params = {**self._default_config, **self._model_params(config)}
model = _init_chat_model_helper(**params)
for name, args, kwargs in self._queued_declarative_operations:
model = getattr(model, name)(*args, **kwargs)
return model
def _model_params(self, config: RunnableConfig | None) -> dict[str, Any]:
config = ensure_config(config)
# Extract configurable params and remove prefix
model_params = {
_remove_prefix(k, self._config_prefix): v
for k, v in config.get("configurable", {}).items()
if k.startswith(self._config_prefix)
}
# Filter to only allowed fields if not "any"
if self._configurable_fields != "any":
model_params = {k: v for k, v in model_params.items() if k in self._configurable_fields}
return model_params
Declarative operations (repo://libs/langchain_v1/langchain/chat_models/base.py#L681-L702):
Methods like bind_tools and with_structured_output are intercepted and queued instead of applied immediately:
def __getattr__(self, name: str) -> Any:
if name in _DECLARATIVE_METHODS:
def queue(*args: Any, **kwargs: Any) -> _ConfigurableModel:
queued_declarative_operations = list(self._queued_declarative_operations)
queued_declarative_operations.append((name, args, kwargs))
return _ConfigurableModel(
default_config=dict(self._default_config),
configurable_fields=self._configurable_fields,
config_prefix=self._config_prefix,
queued_declarative_operations=queued_declarative_operations,
)
return queue
# ... delegate to default model if one exists
Caching: Creator functions are cached with @functools.lru_cache to avoid redundant module imports.
Common Parameter Mapping Examples
Temperature and max_tokens
These are nearly universal but have different default values and ranges per provider:
# OpenAI: temperature 0–2 (default 1)
init_chat_model("gpt-4", temperature=0.7, max_tokens=500)
# Anthropic: temperature 0–1 (default 1)
init_chat_model("claude-opus-4-7", temperature=0.7, max_tokens=500)
# Google Vertex AI: temperature 0–2
init_chat_model("google_vertexai:gemini-1.5-pro", temperature=0.7)
Check the provider's integration documentation for exact ranges and defaults.
API Keys and Base URLs
Providers vary in parameter names:
# OpenAI: openai_api_key, openai_api_base
init_chat_model("gpt-4", openai_api_key="...", openai_api_base="https://custom.com/v1")
# Anthropic: anthropic_api_key, anthropic_api_url
init_chat_model("claude-opus-4-7", anthropic_api_key="...", anthropic_api_url="https://custom.com")
# Vertex AI: uses GCP credentials from environment, or project_id, location
init_chat_model("google_vertexai:gemini-1.5-pro", project_id="my-project")
Environment variable fallbacks are provider-specific; check the integration package docs.
Retry and Timeout
Common cross-provider params:
init_chat_model(
"gpt-4",
max_retries=3,
timeout=30.0,
)
Bedrock Region and Model IDs
AWS Bedrock requires region and uses full model IDs:
init_chat_model(
"bedrock:amazon.titan-text-express-v1",
region_name="us-east-1",
)
Testing and Example Patterns
Fixed Model Initialization
from langchain.chat_models import init_chat_model
# Explicit provider prefix
llm = init_chat_model("openai:gpt-4", temperature=0)
response = llm.invoke("What is 2+2?")
# Inferred provider
llm = init_chat_model("gpt-4", temperature=0)
response = llm.invoke("What is 2+2?")
# Separate model_provider parameter
llm = init_chat_model("gpt-4", model_provider="openai", temperature=0)
Configurable Model with Partial Override
from langchain.chat_models import init_chat_model
model = init_chat_model(
"gpt-4",
configurable_fields=("temperature", "max_tokens"),
temperature=0.5,
max_tokens=100,
)
# Use defaults
result = model.invoke("hello")
# Override at runtime
result = model.invoke(
"hello",
config={
"configurable": {
"temperature": 0.9,
"max_tokens": 500,
}
}
)
Configurable Model with No Default
from langchain.chat_models import init_chat_model
model = init_chat_model(temperature=0.5) # No model specified
# Select model at runtime
result = model.invoke(
"hello",
config={"configurable": {"model": "gpt-4"}}
)
result = model.invoke(
"hello",
config={"configurable": {"model": "claude-opus-4-7"}}
)
Chaining with Prompts
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
model = init_chat_model("gpt-4", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
("user", "{input}"),
])
chain = prompt | model
response = chain.invoke({"input": "What is 2+2?"})
Binding Tools
from langchain.chat_models import init_chat_model
from pydantic import BaseModel, Field
class Calculator(BaseModel):
"""Perform arithmetic."""
a: int = Field(..., description="First number")
b: int = Field(..., description="Second number")
model = init_chat_model("gpt-4")
model_with_tools = model.bind_tools([Calculator])
result = model_with_tools.invoke("What is 2+2?")
Configurable Model with Tools
from langchain.chat_models import init_chat_model
from pydantic import BaseModel, Field
class Calculator(BaseModel):
"""Perform arithmetic."""
a: int = Field(..., description="First number")
b: int = Field(..., description="Second number")
model = init_chat_model(
"gpt-4",
configurable_fields=("model", "model_provider"),
)
model_with_tools = model.bind_tools([Calculator])
# Use with default gpt-4
result = model_with_tools.invoke("What is 2+2?")
# Switch to Claude at runtime
result = model_with_tools.invoke(
"What is 2+2?",
config={"configurable": {"model": "claude-opus-4-7"}}
)
LangSmith Gateway Integration
The langsmith provider bridges to LangSmith's unified LLM gateway, allowing multiple non-OpenAI models to be served through a common OpenAI-compatible API:
init_chat_model("langsmith:moonshotai/kimi-k3")
Configuration flow:
_init_langsmithis invoked instead of standard_call_apply_gateway_configreads:LANGSMITH_GATEWAYor defaults tohttps://gateway.smith.langchain.comLANGSMITH_GATEWAY_API_KEY(preferred) orLANGSMITH_API_KEY- Injects these as
openai_api_baseandopenai_api_key
- Sets
use_responses_api=Truefor compatibility - Returns a
ChatOpenAIinstance pointing to the gateway
Example:
import os
os.environ["LANGSMITH_GATEWAY_API_KEY"] = "..."
model = init_chat_model("langsmith:moonshotai/kimi-k3")
# Routes to https://gateway.smith.langchain.com/v1/chat/completions
Extension and Adding New Providers
To add support for a new provider integration, update _BUILTIN_PROVIDERS in repo://libs/langchain_v1/langchain/chat_models/base.py:
- Add an entry:
"provider_name": (module_path, ClassName, creator_func) - If using standard instantiation, use
_call - If the constructor uses a non-standard parameter for model name, create a custom creator
- Ensure the provider module exports the class at the specified module path
- The integration package must be pip-installable and named
langchain-<provider-name>(with underscores converted to hyphens)
Example for a hypothetical "myai" provider:
_BUILTIN_PROVIDERS = {
...
"myai": ("langchain_myai", "ChatMyAI", _call),
}
Then install with pip install langchain-myai and use:
init_chat_model("myai:my-model-v1")
# or
init_chat_model("my-model-v1", model_provider="myai")
Update model name prefix inference in _attempt_infer_model_provider if a stable, unambiguous prefix exists (e.g., all MyAI models start with myai-).
Security Considerations
API Key Exposure: When configurable_fields="any", all parameters including api_key, openai_api_key, anthropic_api_key, and base_url become runtime-configurable. In production, restrict configurable fields to safe parameters:
# ❌ Unsafe: accepts any field, including secrets
model = init_chat_model("gpt-4", configurable_fields="any")
# ✅ Safe: whitelist only model switching and temperature
model = init_chat_model(
"gpt-4",
configurable_fields=("temperature", "max_tokens"),
)
Runtime Configuration Source: Validate that config dicts come from trusted sources. If config is derived from user input, filter keys to prevent unexpected parameter injection.