From 757bae0263543e674ee4c924debcbe55a6c237ea Mon Sep 17 00:00:00 2001 From: ccurme Date: Tue, 5 Aug 2025 14:50:19 -0300 Subject: [PATCH] feat(langchain): support v1 chat models in init_chat_model (#32410) --- libs/langchain/langchain/chat_models/base.py | 47 ++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/chat_models/base.py b/libs/langchain/langchain/chat_models/base.py index 2f8b46bcb59..c9b6352b044 100644 --- a/libs/langchain/langchain/chat_models/base.py +++ b/libs/langchain/langchain/chat_models/base.py @@ -19,6 +19,7 @@ from langchain_core.runnables import Runnable, RunnableConfig, ensure_config from langchain_core.runnables.schema import StreamEvent from langchain_core.tools import BaseTool from langchain_core.tracers import RunLog, RunLogPatch +from langchain_core.v1.chat_models import BaseChatModel as BaseChatModelV1 from pydantic import BaseModel from typing_extensions import TypeAlias, override @@ -39,10 +40,23 @@ def init_chat_model( model_provider: Optional[str] = None, configurable_fields: Literal[None] = None, config_prefix: Optional[str] = None, + output_version: Literal["v0"] = "v0", **kwargs: Any, ) -> BaseChatModel: ... +@overload +def init_chat_model( + model: str, + *, + model_provider: Optional[str] = None, + configurable_fields: Literal[None] = None, + config_prefix: Optional[str] = None, + output_version: Literal["v1"] = "v1", + **kwargs: Any, +) -> BaseChatModelV1: ... + + @overload def init_chat_model( model: Literal[None] = None, @@ -50,6 +64,7 @@ def init_chat_model( model_provider: Optional[str] = None, configurable_fields: Literal[None] = None, config_prefix: Optional[str] = None, + output_version: Literal["v0", "v1"] = "v0", **kwargs: Any, ) -> _ConfigurableModel: ... @@ -61,6 +76,7 @@ def init_chat_model( model_provider: Optional[str] = None, configurable_fields: Union[Literal["any"], list[str], tuple[str, ...]] = ..., config_prefix: Optional[str] = None, + output_version: Literal["v0", "v1"] = "v0", **kwargs: Any, ) -> _ConfigurableModel: ... @@ -76,8 +92,9 @@ def init_chat_model( Union[Literal["any"], list[str], tuple[str, ...]] ] = None, config_prefix: Optional[str] = None, + output_version: Literal["v0", "v1"] = "v0", **kwargs: Any, -) -> Union[BaseChatModel, _ConfigurableModel]: +) -> Union[BaseChatModel, BaseChatModelV1, _ConfigurableModel]: """Initialize a ChatModel in a single line using the model's name and provider. .. note:: @@ -128,6 +145,20 @@ def init_chat_model( - ``deepseek...`` -> ``deepseek`` - ``grok...`` -> ``xai`` - ``sonar...`` -> ``perplexity`` + + output_version: The version of the BaseChatModel to return. Either ``"v0"`` for + a v0 :class:`~langchain_core.language_models.chat_models.BaseChatModel` or + ``"v1"`` for a v1 :class:`~langchain_core.v1.chat_models.BaseChatModel`. The + output version determines what type of message objects the model will + generate. + + .. note:: + Currently supported for these providers: + + - ``openai`` + + .. versionadded:: 0.4.0 + configurable_fields: Which model parameters are configurable: - None: No configurable fields. @@ -316,6 +347,7 @@ def init_chat_model( return _init_chat_model_helper( cast("str", model), model_provider=model_provider, + output_version=output_version, **kwargs, ) if model: @@ -333,14 +365,21 @@ def _init_chat_model_helper( model: str, *, model_provider: Optional[str] = None, + output_version: Literal["v0", "v1"] = "v0", **kwargs: Any, -) -> BaseChatModel: +) -> Union[BaseChatModel, BaseChatModelV1]: model, model_provider = _parse_model(model, model_provider) if model_provider == "openai": _check_pkg("langchain_openai") - from langchain_openai import ChatOpenAI + if output_version == "v0": + from langchain_openai import ChatOpenAI + + return ChatOpenAI(model=model, **kwargs) + # v1 + from langchain_openai.v1 import ChatOpenAI as ChatOpenAIV1 + + return ChatOpenAIV1(model=model, **kwargs) - return ChatOpenAI(model=model, **kwargs) if model_provider == "anthropic": _check_pkg("langchain_anthropic") from langchain_anthropic import ChatAnthropic