
    i
                        S r SSKJr  SSKJr  SSKJrJrJrJ	r	  SSK
Jr  \(       a  SSKJrJr  SSKJr   " S S	\5      rg
)z%Model fallback middleware for agents.    )annotations)TYPE_CHECKING)AgentMiddlewareModelCallResultModelRequestModelResponse)init_chat_model)	AwaitableCallable)BaseChatModelc                  h   ^  \ rS rSrSr      SU 4S jjr      SS jr      S	S jrSrU =r	$ )
ModelFallbackMiddleware   a
  Automatic fallback to alternative models on errors.

Retries failed model calls with alternative models in sequence until
success or all models exhausted. Primary model specified in create_agent().

Example:
    ```python
    from langchain.agents.middleware.model_fallback import ModelFallbackMiddleware
    from langchain.agents import create_agent

    fallback = ModelFallbackMiddleware(
        "openai:gpt-4o-mini",  # Try first on error
        "anthropic:claude-sonnet-4-5-20250929",  # Then this
    )

    agent = create_agent(
        model="openai:gpt-4o",  # Primary model
        middleware=[fallback],
    )

    # If primary fails: tries gpt-4o-mini, then claude-sonnet-4-5-20250929
    result = await agent.invoke({"messages": [HumanMessage("Hello")]})
    ```
c                   > [         TU ]  5         U/UQ7n/ U l        U HY  n[        U[        5      (       a&  U R                  R                  [        U5      5        M>  U R                  R                  U5        M[     g)zInitialize model fallback middleware.

Args:
    first_model: First fallback model (string name or instance).
    *additional_models: Additional fallbacks in order.
N)super__init__models
isinstancestrappendr	   )selffirst_modeladditional_models
all_modelsmodel	__class__s        d/home/james-whalen/.local/lib/python3.13/site-packages/langchain/agents/middleware/model_fallback.pyr    ModelFallbackMiddleware.__init__/   sg     	 "6$56
+-E%%%""?5#9:""5)	      c                     U" U5      $ ! [          a  nUn SnAOSnAff = fU R                   H,  nXQl         U" U5      s  $ ! [          a  nUn SnAM&  SnAff = f   Ue)zTry fallback models in sequence on errors.

Args:
    request: Initial model request.
    handler: Callback to execute the model.

Returns:
    AIMessage from successful model call.

Raises:
    Exception: If all models fail, re-raises last exception.
N	Exceptionr   r   r   requesthandlerelast_exceptionfallback_models         r   wrap_model_call'ModelFallbackMiddleware.wrap_model_callE   sl    &	7## 	N	 #kkN*Mw'' !"	 * s'   
 
  A
AAAc                   #     U" U5      I Sh  vN $  N! [          a  nUn SnAOSnAff = fU R                   H5  nXQl         U" U5      I Sh  vN  s  $ ! [          a  nUn SnAM/  SnAff = f   Ue7f)a  Try fallback models in sequence on errors (async version).

Args:
    request: Initial model request.
    handler: Async callback to execute the model.

Returns:
    AIMessage from successful model call.

Raises:
    Exception: If all models fail, re-raises last exception.
Nr!   r#   s         r   awrap_model_call(ModelFallbackMiddleware.awrap_model_callh   s{     &	 )))) 	N	 #kkN*M$W---- !"	 * sf   A6  A6 
,'A6,A6AAAA6
A/"A*$A6*A//A6)r   )r   str | BaseChatModelr   r.   returnNone)r$   r   r%   z'Callable[[ModelRequest], ModelResponse]r/   r   )r$   r   r%   z2Callable[[ModelRequest], Awaitable[ModelResponse]]r/   r   )
__name__
__module____qualname____firstlineno____doc__r   r)   r,   __static_attributes____classcell__)r   s   @r   r   r      sr    2*(* 0* 
	*,!! 9! 
	!F!! D! 
	! !r   r   N)r5   
__future__r   typingr   !langchain.agents.middleware.typesr   r   r   r   langchain.chat_modelsr	   collections.abcr
   r   *langchain_core.language_models.chat_modelsr   r    r   r   <module>r?      s4    + "    23Hto tr   