
    
i                        d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ erddlmZmZ ddlmZ ddlmZ  G d	 d
eee         eef                   ZdS )z%Model fallback middleware for agents.    )annotations)TYPE_CHECKING)AgentMiddleware
AgentStateContextTModelRequestModelResponse	ResponseT)init_chat_model)	AwaitableCallable)BaseChatModel)	AIMessagec                  4     e Zd ZdZd fdZddZddZ xZS )ModelFallbackMiddlewareaR  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")]})
        ```
    first_modelstr | BaseChatModeladditional_modelsreturnNonec                   t                                                       |g|R }g | _        |D ]Y}t          |t                    r(| j                            t          |                     ?| j                            |           ZdS )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   )selfr   r   
all_modelsmodel	__class__s        C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain/agents/middleware/model_fallback.pyr   z ModelFallbackMiddleware.__init__2   s     	 "6$566
+- 	* 	*E%%% *""?5#9#9::::""5))))		* 	*    requestModelRequest[ContextT]handler<Callable[[ModelRequest[ContextT]], ModelResponse[ResponseT]]$ModelResponse[ResponseT] | AIMessagec                    	  ||          S # t           $ r}|}Y d}~nd}~ww xY w| j        D ]<}	  ||                    |                    c S # t           $ r}|}Y d}~5d}~ww xY w|)a<  Try 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r    	Exceptionr   overrider   r$   r&   elast_exceptionfallback_models         r"   wrap_model_callz'ModelFallbackMiddleware.wrap_model_callH   s    &	77### 	 	 	NNNNNN	 #k 	 	Nww//n/EEFFFFF   !" s'   
 
##A
A'A""A'GCallable[[ModelRequest[ContextT]], Awaitable[ModelResponse[ResponseT]]]c                   K   	  ||           d{V S # t           $ r}|}Y d}~nd}~ww xY w| j        D ]B}	  ||                    |                     d{V c S # t           $ r}|}Y d}~;d}~ww xY w|)aR  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+   r.   s         r"   awrap_model_callz(ModelFallbackMiddleware.awrap_model_callj   s      &	 ))))))))) 	 	 	NNNNNN	 #k 	 	N$WW%5%5N%5%K%KLLLLLLLLLLL   !" s'    
+&+$A
A5)A00A5)r   r   r   r   r   r   )r$   r%   r&   r'   r   r(   )r$   r%   r&   r3   r   r(   )__name__
__module____qualname____doc__r   r2   r5   __classcell__)r!   s   @r"   r   r      sp         2* * * * * *,       D               r#   r   N)r9   
__future__r   typingr   !langchain.agents.middleware.typesr   r   r   r   r	   r
   langchain.chat_modelsr   collections.abcr   r   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r    r#   r"   <module>rC      s&   + + " " " " " "                            2 1 1 1 1 1 233333333HHHHHH111111r r r r roj.CXy.XY r r r r rr#   