Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions libs/core/langchain_core/language_models/chat_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
from langchain_core.rate_limiters import BaseRateLimiter
from langchain_core.runnables import RunnableMap, RunnablePassthrough
from langchain_core.runnables.config import ensure_config, run_in_executor
from langchain_core.runnables.fallbacks import RunnableWithFallbacks
from langchain_core.tracers._streaming import _StreamingCallbackHandler
from langchain_core.utils.function_calling import (
convert_to_json_schema,
Expand Down Expand Up @@ -318,6 +319,9 @@
rate_limiter: BaseRateLimiter | None = Field(default=None, exclude=True)
"An optional rate limiter to use for limiting the number of requests."

fallback: Optional[RunnableWithFallbacks] = Field(default=None, exclude=True)

Check failure on line 322 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.13) / Python 3.13

Ruff (F821)

langchain_core/language_models/chat_models.py:322:15: F821 Undefined name `Optional`

Check failure on line 322 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.11) / Python 3.11

Ruff (F821)

langchain_core/language_models/chat_models.py:322:15: F821 Undefined name `Optional`

Check failure on line 322 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.12) / Python 3.12

Ruff (F821)

langchain_core/language_models/chat_models.py:322:15: F821 Undefined name `Optional`

Check failure on line 322 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.10) / Python 3.10

Ruff (F821)

langchain_core/language_models/chat_models.py:322:15: F821 Undefined name `Optional`
"""A fallback type to use if provided."""

disable_streaming: bool | Literal["tool_calling"] = False
"""Whether to disable streaming for this model.

Expand Down Expand Up @@ -397,6 +401,10 @@
stop: list[str] | None = None,
**kwargs: Any,
) -> AIMessage:
fallback_object = self.get_fallback()
if fallback_object:
self._reset_fallback()
return fallback_object.invoke(input, config, stop=stop, **kwargs)
config = ensure_config(config)
return cast(
"AIMessage",
Expand Down Expand Up @@ -424,6 +432,10 @@
stop: list[str] | None = None,
**kwargs: Any,
) -> AIMessage:
fallback_object = self.get_fallback()
if fallback_object:
self._reset_fallback()
return await fallback_object.ainvoke(input, config, stop=stop, **kwargs)
config = ensure_config(config)
llm_result = await self.agenerate_prompt(
[self._convert_input(input)],
Expand Down Expand Up @@ -483,6 +495,12 @@
stop: list[str] | None = None,
**kwargs: Any,
) -> Iterator[AIMessageChunk]:
fallback_object = self.get_fallback()
if fallback_object:
self._reset_fallback()
for chunk in fallback_object.stream(input, config, stop=stop, **kwargs):
yield chunk
return
if not self._should_stream(async_api=False, **{**kwargs, "stream": True}):
# Model doesn't implement streaming, so use default implementation
yield cast(
Expand Down Expand Up @@ -599,6 +617,14 @@
stop: list[str] | None = None,
**kwargs: Any,
) -> AsyncIterator[AIMessageChunk]:
fallback_object = self.get_fallback()
if fallback_object:
self._reset_fallback()
async for chunk in fallback_object.astream(
input, config, stop=stop, **kwargs
):
yield chunk
return
if not self._should_stream(async_api=True, **{**kwargs, "stream": True}):
# No async or sync stream is implemented, so fall back to ainvoke
yield cast(
Expand Down Expand Up @@ -710,6 +736,22 @@
LLMResult(generations=[[generation]]),
)

def _reset_fallback(self) -> BaseChatModel:
"""Reset the fallback."""
self.fallback = None
return self

def set_fallback(
self, fallback: Optional[RunnableWithFallbacks] = None

Check failure on line 745 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.13) / Python 3.13

Ruff (F821)

langchain_core/language_models/chat_models.py:745:25: F821 Undefined name `Optional`

Check failure on line 745 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.11) / Python 3.11

Ruff (F821)

langchain_core/language_models/chat_models.py:745:25: F821 Undefined name `Optional`

Check failure on line 745 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.12) / Python 3.12

Ruff (F821)

langchain_core/language_models/chat_models.py:745:25: F821 Undefined name `Optional`

Check failure on line 745 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.10) / Python 3.10

Ruff (F821)

langchain_core/language_models/chat_models.py:745:25: F821 Undefined name `Optional`
) -> BaseChatModel:
"""Add fallbacks to the model."""
self.fallback = fallback
return self

def get_fallback(self) -> Optional[RunnableWithFallbacks]:

Check failure on line 751 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.13) / Python 3.13

Ruff (F821)

langchain_core/language_models/chat_models.py:751:31: F821 Undefined name `Optional`

Check failure on line 751 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.11) / Python 3.11

Ruff (F821)

langchain_core/language_models/chat_models.py:751:31: F821 Undefined name `Optional`

Check failure on line 751 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.12) / Python 3.12

Ruff (F821)

langchain_core/language_models/chat_models.py:751:31: F821 Undefined name `Optional`

Check failure on line 751 in libs/core/langchain_core/language_models/chat_models.py

View workflow job for this annotation

GitHub Actions / lint (libs/core, 3.10) / Python 3.10

Ruff (F821)

langchain_core/language_models/chat_models.py:751:31: F821 Undefined name `Optional`
"""Get the fallback."""
return self.fallback

# --- Custom methods ---

def _combine_llm_outputs(self, llm_outputs: list[dict | None]) -> dict: # noqa: ARG002
Expand Down
Loading
Loading