§
    œŠtjT0  ã                  ó~  — U d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddl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 ddlmZmZmZmZmZmZ eez  Zde d<   	  G d„ de¦  «        Z!dddœddidœZ"de d<    G d„ deee         eef         ¦  «        Z#d6d„Z$d7d$„Z%d8d%„Z&d9d+„Z'd:d.„Z(d;d1„Z)d<d3„Z*d=d5„Z+dS )>z%Provider-side tool search middleware.é    )ÚannotationsN)ÚMapping)ÚTYPE_CHECKINGÚAnyÚ	TypeAlias)ÚBaseTool)ÚNotRequiredÚ	TypedDict)Ú_attempt_infer_model_provider)Ú	AwaitableÚCallable)ÚBaseChatModel)Ú	AIMessage)ÚAgentMiddlewareÚ
AgentStateÚContextTÚModelRequestÚModelResponseÚ	ResponseTr   ÚToolIdentifierc                  ó(   — e Zd ZU dZded<   ded<   dS )Ú_ServerToolSearchSpeczHProvider-native tool search tool descriptor sent to the model as a tool.ÚstrÚtypezNotRequired[str]ÚnameN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    ún/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain/agents/middleware/provider_tool_search.pyr   r   !   s-   € € € € € € ØRÐRà€I€I�IØÐÐÑÐÐr"   r   Útool_search_tool_bm25_20251119Útool_search_tool_bm25)r   r   r   Útool_search)Ú	anthropicÚopenaiz dict[str, _ServerToolSearchSpec]Ú_SERVER_TOOL_SEARCH_TOOLSc                  óB   ‡ — e Zd ZdZddœdˆ fd„Zdd„Zdd„Zdd„Zˆ xZS )ÚProviderToolSearchMiddlewareaî  Defer selected tools behind provider-native tool search.

    Instead of sending every tool schema on every turn, this middleware marks
    selected tools as deferred (via `extras["defer_loading"]`) and injects the
    provider's server-side tool search tool. The provider then retrieves the
    full schema of a deferred tool only when the model needs it, which keeps the
    request payload small when many tools are bound.

    A tool is deferred when its name (or instance) is passed in `searchable_tools`,
    or when it already carries `extras["defer_loading"] is True`.

    Only providers with server-side tool search are supported (currently
    Anthropic and OpenAI). The provider is inferred from the bound model.

    !!! warning

        This relies on provider-native tool search and only takes effect for
        supported providers. If a tool is deferred but the model's provider
        cannot be identified or does not support tool search, the model call
        raises `ValueError`. When no tool is deferred, the middleware passes the
        request through unchanged regardless of provider.

    Example:
        ```python
        from langchain.agents import create_agent
        from langchain.agents.middleware import ProviderToolSearchMiddleware

        agent = create_agent(
            "anthropic:claude-opus-4-8",
            tools=[get_weather, send_email, lookup_order],
            middleware=[ProviderToolSearchMiddleware(searchable_tools=["lookup_order"])],
        )
        ```
    N)Úsearchable_toolsr,   úlist[ToolIdentifier] | NoneÚreturnÚNonec               óp   •— t          ¦   «                              ¦   «          t          |¦  «        | _        dS )z¬Initialize provider-side tool search.

        Args:
            searchable_tools: Tools or tool names to defer behind provider-native
                tool search.
        N)ÚsuperÚ__init__Ú_to_tool_namesÚsearchable_tool_names)Úselfr,   Ú	__class__s     €r#   r2   z%ProviderToolSearchMiddleware.__init__]   s2   ø€ õ 	‰Œ×ÒÑÔÐÝ%3Ð4DÑ%EÔ%EˆÔ"Ð"Ð"r"   ÚrequestúModelRequest[ContextT]c                óÊ  ‡ — |j         }‰ j        rLd„ |D ¦   «         }t          ‰ j        |z
  ¦  «        }|r'dd                     |¦  «        › �}t	          |¦  «        ‚t          ˆ fd„|D ¦   «         ¦  «        s|S t          |j        |j        ¦  «        }|€Kd|j        j	        j
        ›dd                     t          t          ¦  «        ¦  «        › �}t	          |¦  «        ‚|t          vr<d|›d	d                     t          t          ¦  «        ¦  «        › �}t	          |¦  «        ‚ˆ fd
„|D ¦   «         }|                     g |¢t          t          |         ¦  «        ‘¬¦  «        S )aO  Prepare a model request with deferred tools and provider search.

        Validates that every name in `searchable_tools` is bound to the model,
        then (only when at least one tool is deferred) resolves the model's
        provider and injects the provider-native tool search tool. Requests with
        no deferred tools pass through unchanged.

        Args:
            request: Model request to prepare.

        Returns:
            The original request when nothing is deferred, otherwise a new
            request with deferred tools and the provider search tool appended.

        Raises:
            ValueError: If `searchable_tools` references a tool not bound to the
                model, or if a tool is deferred but the model's provider cannot
                be identified or does not support server-side tool search.
        c                óF   — h | ]}t          |t          ¦  «        ¯|j        ’ŒS r!   )Ú
isinstancer   r   ©Ú.0Útools     r#   ú	<setcomp>z@ProviderToolSearchMiddleware._prepare_request.<locals>.<setcomp>}   s)   € ÐSÐSÐS t½
À4ÍÑ8RÔ8RÐS˜œÐSÐSÐSr"   zZProviderToolSearchMiddleware: searchable_tools references tool(s) not bound to the model: z, c              3  óB   •K  — | ]}t          |‰j        ¦  «        V — Œd S )N)Ú_is_deferred_toolr4   ©r=   r>   r5   s     €r#   ú	<genexpr>z@ProviderToolSearchMiddleware._prepare_request.<locals>.<genexpr>†   s1   øè è € ÐYÐYÈ4Õ$ T¨4Ô+EÑFÔFÐYÐYÐYÐYÐYÐYr"   NzHProviderToolSearchMiddleware could not determine the provider for model z$; server-side tool search supports: zWProviderToolSearchMiddleware requires a provider with server-side tool search, but got z; supported providers: c                ó:   •— g | ]}t          |‰j        ¦  «        ‘ŒS r!   )Ú_defer_tool_if_neededr4   rB   s     €r#   ú
<listcomp>zAProviderToolSearchMiddleware._prepare_request.<locals>.<listcomp>™   s(   ø€ ÐaÐaÐaÐSWÕ,¨T°4Ô3MÑNÔNÐaÐaÐar"   ©Útools)rH   r4   ÚsortedÚjoinÚ
ValueErrorÚanyÚ_get_model_providerÚmodelÚruntimer6   r   r)   ÚoverrideÚdict)r5   r7   rH   Ú	availableÚunknownÚmsgÚproviderÚbound_toolss   `       r#   Ú_prepare_requestz-ProviderToolSearchMiddleware._prepare_requestg   s¶  ø€ ð( ”ˆØÔ%ð 	&ØSÐS¨uÐSÑSÔSˆIÝ˜TÔ7¸)ÑCÑDÔDˆGØð &ðLØ7;·y²yÀÑ7IÔ7IðLð Lð õ ! ‘o”oÐ%åÐYÐYÐYÐYÐSXÐYÑYÔYÑYÔYð 	ØˆNå& w¤}°g´oÑFÔFˆØÐðLØ œÔ0Ô9ðLð Là!ŸYšY¥vÕ.GÑ'HÔ'HÑIÔIðLð Lð õ
 ˜S‘/”/Ð!ØÕ4Ð4Ð4ðBØ(0ðBð Bà—9’9�VÕ$=Ñ>Ô>Ñ?Ô?ðBð Bð õ
 ˜S‘/”/Ð!àaÐaÐaÐaÐ[`ÐaÑaÔaˆØ×ÒÐ&_¨Ð&_µTÕ:SÐT\Ô:]Ñ5^Ô5^Ð&_ÐÑ`Ô`Ð`r"   Úhandlerú<Callable[[ModelRequest[ContextT]], ModelResponse[ResponseT]]ú$ModelResponse[ResponseT] | AIMessagec                ó>   —  ||                       |¦  «        ¦  «        S )aÞ  Defer tools before invoking the model.

        Args:
            request: Model request to execute.
            handler: Callback that executes the model request.

        Returns:
            The model call result.

        Raises:
            ValueError: If `searchable_tools` references a tool not bound to the
                model, or if a tool is deferred but the model's provider cannot
                be identified or does not support server-side tool search.
        ©rW   ©r5   r7   rX   s      r#   Úwrap_model_callz,ProviderToolSearchMiddleware.wrap_model_callœ   s"   € ð& ˆw�t×,Ò,¨WÑ5Ô5Ñ6Ô6Ð6r"   úGCallable[[ModelRequest[ContextT]], Awaitable[ModelResponse[ResponseT]]]c              ƒ  óN   K  —  ||                       |¦  «        ¦  «        ƒ d{V —†S )aí  Defer tools before asynchronously invoking the model.

        Args:
            request: Model request to execute.
            handler: Callback that executes the model request.

        Returns:
            The model call result.

        Raises:
            ValueError: If `searchable_tools` references a tool not bound to the
                model, or if a tool is deferred but the model's provider cannot
                be identified or does not support server-side tool search.
        Nr\   r]   s      r#   Úawrap_model_callz-ProviderToolSearchMiddleware.awrap_model_call±   s8   è è € ð& �W˜T×2Ò2°7Ñ;Ô;Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r"   )r,   r-   r.   r/   )r7   r8   r.   r8   )r7   r8   rX   rY   r.   rZ   )r7   r8   rX   r_   r.   rZ   )	r   r   r   r   r2   rW   r^   ra   Ú__classcell__)r6   s   @r#   r+   r+   9   s¢   ø€ € € € € ð!ð !ðF KOð Fð Fð Fð Fð Fð Fð Fð Fð3að 3að 3að 3aðj7ð 7ð 7ð 7ð*=ð =ð =ð =ð =ð =ð =ð =r"   r+   rH   r-   r.   úset[str]c                ó:   — | €t          ¦   «         S d„ | D ¦   «         S )z"Convert tool identifiers to names.Nc                óJ   — h | ] }t          |t          ¦  «        r|n|j        ’Œ!S r!   )r;   r   r   r<   s     r#   r?   z!_to_tool_names.<locals>.<setcomp>Ë   s-   € ÐKÐKÐK¸T•J˜t¥SÑ)Ô)Ð8ˆDˆD¨t¬yÐKÐKÐKr"   )ÚsetrG   s    r#   r3   r3   Ç   s$   € à€}Ý‰uŒuˆØKÐKÀUÐKÑKÔKÐKr"   r>   úBaseTool | dict[str, Any]Ú
tool_namesÚboolc                ó¶   — t          | t          ¦  «        sdS t          | j        t          ¦  «        r| j        ni }|                     d¦  «        du p| j        |v S )zÇReturn whether a tool should be deferred.

    Only `BaseTool` instances can be deferred; dict-form tools (e.g. provider
    tool specs) have no `extras` or name to match and are never deferred.
    FÚdefer_loadingT)r;   r   ÚextrasrQ   Úgetr   ©r>   rh   rl   s      r#   rA   rA   Î   sZ   € õ �d�HÑ%Ô%ð ØˆuÝ& t¤{µDÑ9Ô9ÐAˆTŒ[ˆ[¸r€FØ�:Š:�oÑ&Ô&¨$Ð.ÐI°$´)¸zÐ2IÐIr"   c                ó¢   — t          | |¦  «        s| S t          | t          ¦  «        s| S i | j        pi ¥ddi¥}|                      d|i¬¦  «        S )zñReturn the tool with `defer_loading` set, or unchanged if not deferred.

    Returns the input unchanged when the tool should not be deferred or is not a
    `BaseTool` (only `BaseTool` instances carry the `extras` that flags deferral).
    rk   Trl   )Úupdate)rA   r;   r   rl   Ú
model_copyrn   s      r#   rE   rE   Ú   sf   € õ ˜T :Ñ.Ô.ð ØˆÝ�d�HÑ%Ô%ð ØˆØ;�”Ð" Ð; _°dÐ;Ð;€FØ�?Š? 8¨VÐ"4ˆ?Ñ5Ô5Ð5r"   rN   r   rO   r   ú
str | Nonec                óÒ  — t          | dd¦  «        }t          | dd¦  «        }t          |¦  «        rzt          |dd¦  «        }|�t          |t          ¦  «        sd} ||¦  «        }t          |t          ¦  «        r0t          |t          ¦  «        ri |¥|¥n|}t          |¦  «        x}r|S t          |t          ¦  «        rt          |¦  «        x}r|S t          | dd¦  «        }t          |¦  «        r\ |¦   «         }	t          |	t          ¦  «        r=t          |	                     d¦  «        t          ¦  «        rt          |	d         ¦  «        S t          | j
        j        ¦  «        S )zÛInfer the normalized provider name for server-side tool search.

    Returns `None` when no provider can be identified, so callers can
    distinguish a detection failure from a provider that is simply unsupported.
    Ú_default_configNÚ_model_paramsÚconfigÚ_get_ls_paramsÚls_provider)ÚgetattrÚcallabler;   r   rQ   Ú_provider_from_paramsrm   r   Ú_normalize_providerÚ_provider_from_class_namer6   r   )
rN   rO   Údefault_configÚmodel_params_fnrv   Úmodel_paramsÚparamsrU   Úget_ls_paramsÚ	ls_paramss
             r#   rM   rM   ê   s  € õ ˜UÐ$5°tÑ<Ô<€NÝ˜e _°dÑ;Ô;€OÝ�Ñ Ô ð  Ý˜ (¨DÑ1Ô1ˆð Ð¥j°½Ñ&AÔ&AÐØˆFØ&� vÑ.Ô.ˆÝ�l¥DÑ)Ô)ð 	 õ ˜n­dÑ3Ô3ð"Ð2�>Ð2 \Ð2Ð2à!ð õ
 1°Ñ8Ô8Ð8ˆxð  Ø�å�.¥$Ñ'Ô'ð Õ9NÈ~Ñ9^Ô9^Ð-^¨Xð Øˆå˜EÐ#3°TÑ:Ô:€MÝ�ÑÔð AØ!�M‘O”Oˆ	Ý�i¥Ñ&Ô&ð 	A­:°i·m²mÀMÑ6RÔ6RÕTWÑ+XÔ+Xð 	AÝ& y°Ô'?Ñ@Ô@Ð@å$ U¤_Ô%=Ñ>Ô>Ð>r"   r�   údict[str, Any]c                óê   — |                       d¦  «        }t          |t          ¦  «        rt          |¦  «        S |                       d¦  «        }t          |t          ¦  «        rt	          |¦  «        S dS )z>Infer the provider from model parameters, or `None` if absent.Úmodel_providerrN   N)rm   r;   r   r|   Ú_provider_from_model_name)r�   rU   Ú
model_names      r#   r{   r{     sj   € à�zŠzÐ*Ñ+Ô+€HÝ�(�CÑ Ô ð -Ý" 8Ñ,Ô,Ð,Ø—’˜GÑ$Ô$€JÝ�*�cÑ"Ô"ð 5Ý(¨Ñ4Ô4Ð4Øˆ4r"   rˆ   r   c                ó$  — |                       d¦  «        \  }}}|rt          |¦  «        S t          j        ¦   «         5  t          j        dt
          ¦  «         t          | ¦  «        }ddd¦  «         n# 1 swxY w Y   |rt          |¦  «        ndS )z@Infer the provider from a model name, or `None` if unrecognized.ú:ÚignoreN)Ú	partitionr|   ÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningr   )rˆ   rU   Ú_ÚrestÚinferreds        r#   r‡   r‡     sÔ   € à"×,Ò,¨SÑ1Ô1Ñ€Hˆa�Øð -Ý" 8Ñ,Ô,Ð,õ 
Ô	 Ñ	"Ô	"ð =ð =ÝÔ˜hÕ(:Ñ;Ô;Ð;Ý0°Ñ<Ô<ˆð=ð =ð =ñ =ô =ð =ð =ð =ð =ð =ð =øøøð =ð =ð =ð =ð -5Ð>Õ˜xÑ(Ô(Ð(¸$Ð>s   ¾*A4Á4A8Á;A8Ú
class_namec                ó   — | dv rdS | dv rdS dS )zFInfer the provider from a model class name, or `None` if unrecognized.>   ÚAnthropicChatÚChatAnthropicr'   >   Ú
ChatOpenAIÚ
OpenAIChatr(   Nr!   )r”   s    r#   r}   r}   (  s)   € àÐ7Ð7Ð7Øˆ{ØÐ1Ð1Ð1ØˆxØˆ4r"   rU   c                óR   — |                       dd¦  «                             ¦   «         S )zFNormalize a provider identifier by lowercasing and mapping `-` to `_`.ú-r‘   )ÚreplaceÚlower)rU   s    r#   r|   r|   1  s$   € à×Ò˜C Ñ%Ô%×+Ò+Ñ-Ô-Ð-r"   )rH   r-   r.   rc   )r>   rg   rh   rc   r.   ri   )r>   rg   rh   rc   r.   rg   )rN   r   rO   r   r.   rr   )r�   r„   r.   rr   )rˆ   r   r.   rr   )r”   r   r.   rr   )rU   r   r.   r   ),r   Ú
__future__r   r�   Úcollections.abcr   Útypingr   r   r   Úlangchain_core.toolsr   Útyping_extensionsr	   r
   Úlangchain.chat_models.baser   r   r   Ú*langchain_core.language_models.chat_modelsr   Úlangchain_core.messagesr   Ú!langchain.agents.middleware.typesr   r   r   r   r   r   r   r   r    r   r)   r+   r3   rA   rE   rM   r{   r‡   r}   r|   r!   r"   r#   ú<module>r§      s¢  ðØ +Ð +Ð +à "Ð "Ð "Ð "Ð "Ð "à €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à )Ð )Ð )Ð )Ð )Ð )Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4à DÐ DÐ DÐ DÐ DÐ Dàð 2Ø3Ð3Ð3Ð3Ð3Ð3Ð3Ð3àHÐHÐHÐHÐHÐHØ1Ð1Ð1Ð1Ð1Ð1ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð   (™N€Ð *Ð *Ð *Ñ *Ø Rðð ð ð ð ˜Iñ ô ð ð" 1Ø'ðð ð �}Ð%ð?ð ?Ð ð ð ð ñ ðK=ð K=ð K=ð K=ð K= ?°:¸iÔ3HÈ(ÐT]Ð3]Ô#^ñ K=ô K=ð K=ð\Lð Lð Lð Lð	Jð 	Jð 	Jð 	Jð6ð 6ð 6ð 6ð "?ð "?ð "?ð "?ðJð ð ð ð?ð ?ð ?ð ?ðð ð ð ð.ð .ð .ð .ð .ð .r"   