
    g3fi                    z    d Z ddlmZ ddlmZ ddl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  G d d	e      Zy
)z%Model fallback middleware for agents.    )annotations)TYPE_CHECKING)AgentMiddlewareModelCallResultModelRequestModelResponse)init_chat_model)	AwaitableCallable)BaseChatModelc                  X     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")]})
        ```
    c                    t         |           |g|}g | _        |D ]R  }t        |t              r%| j                  j                  t        |             8| j                  j                  |       T y)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        h/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain/agents/middleware/model_fallback.pyr   z ModelFallbackMiddleware.__init__/   si     	 "6$56
+- 	*E%%""?5#9:""5)		*    c                    	  ||      S # t         $ r}|}Y d}~nd}~ww xY w| j                  D ]4  }	  ||j                  |            c S # t         $ r}|}Y d}~.d}~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   requesthandlerelast_exceptionfallback_models         r   wrap_model_callz'ModelFallbackMiddleware.wrap_model_callE   sz    &	7## 	N	 #kk 	Nw//n/EFF !"	 s'   
 	A	A!AA!c                   K   	  ||       d{   S 7 # t         $ r}|}Y d}~nd}~ww xY w| j                  D ]=  }	  ||j                  |             d{  7  c S # t         $ r}|}Y d}~7d}~ww xY w |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_callg   s     &	 )))) 	N	 #kk 	N$W%5%5N%5%KLLLL !"	 se   A<  A< 	+&A<+A<A!AA!A<!	A6*A1,A<1A66A<)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____doc__r   r)   r+   __classcell__)r   s   @r   r   r      sm    2*(* 0* 
	*,   9  
	 D   D  
	 r   r   N)r2   
__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ro rr   