Ë
    uPêj à  ã                   ó$  — U d Z ddlZddlZddlmZmZmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZ ddlZddlmZmZmZmZ ddlZddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z* dZ+ee,d<    e
dddddddddœ«      Z-ee,d<    ej\                  d«      Z/ee,d<    ej\                  d«      Z0ee,d<    ej\                  d «      Z1ee,d!<    ej\                  d"«      Z2ee,d#<   d$e3d%e3fd&„Z4d'e3dz  d%e5fd(„Z6d)e3dz  d*e3d%e3fd+„Z7d,e8d-e3dz  d%e9e8e3dz  f   fd.„Z: G d/„ d0e «      Z; G d1„ d2e«      Z<dad3e=e   d4e5d%e=e   fd5„Z>d6e3d%e5fd7„Z?d3e=e   d%e=e   fd8„Z@d9e8e3ef   d%dfd:„ZAd3e=e   d%e=e   fd;„ZBd<ed%e5fd=„ZCd<eDd%e5fd>„ZEd<eDd%e5fd?„ZFd@e3d%e3fdA„ZGd<ed%efdB„ZHd3e=e   d%e=e   fdC„ZI G dD„ dEe«      ZJ G dF„ dGe«      ZK G dH„ dIe«      ZL G dJ„ dKe«      ZM G dL„ dMe«      ZN eeL«      ZOee,dN<    eeM«      ZPee,dO<   d<eDd%eLdz  fdP„ZQd<eDd%eMdz  fdQ„ZRdRe3dSe9eKdTf   d%e3fdU„ZSd<eDdVee3eLf   dWee3e3f   d%eDdz  fdX„ZTdYeDd%eDfdZ„ZUd3e=e   d%e=e   fd[„ZVd,ej®                  e8z  d%e8fd\„ZXd$e*d]e3d%ee3eDf   fd^„ZYd_ee*   d%ee3eDf   fd`„ZZy)bz6
This file contains common utils for anthropic calls.
é    N)ÚMappingÚMutableMappingÚSequence)ÚdatetimeÚtimezone)ÚMappingProxyType)ÚAnyÚFinalÚLiteral)Ú	BaseModelÚ
ConfigDictÚTypeAdapterÚValidationError)ÚDEFAULT_MODEL_CREATED_AT_TIME)Úget_file_ids_from_messages)ÚTHOUGHT_SIGNATURE_SEPARATOR)ÚBaseLLMModelInfoÚBaseTokenCounter)ÚBaseLLMException)ÚANTHROPIC_HOSTED_TOOLSÚANTHROPIC_OAUTH_BETA_HEADERÚANTHROPIC_OAUTH_TOKEN_PREFIXÚAllAnthropicToolsValuesÚAnthropicMcpServerTool)ÚAllMessageValues)ÚModelInfoResponsea  Dropping `thinking={'type': 'disabled'}` for model=%s: thinking is always on for this model and cannot be disabled (the alternative is a provider 400). The model will still think adaptively, its response can contain thinking blocks, and those thinking tokens are billed as output tokens.ÚDROP_DISABLED_THINKING_WARNINGé�  i‘  i“  i”  i­  iô  i÷  iø  )Úinvalid_request_errorÚauthentication_errorÚpermission_errorÚnot_found_errorÚrate_limit_errorÚ	api_errorÚoverloaded_errorÚtimeout_errorÚANTHROPIC_ERROR_STATUS_CODE_MAPz-v\d+(?::\d+)?$Ú_BEDROCK_VERSION_SUFFIX_REz:\d+$Ú_INFERENCE_PROFILE_MINOR_REz-\d{8}$Ú_DATED_RELEASE_SUFFIX_REz
(\d)\.(\d)Ú_DOTTED_VERSION_REÚmodelÚreturnc           
      ó~   — t         j                  dt        j                  dt        j                  d| «      «      «      S )aH  Reduce a full Bedrock model id to its base cost-map key by rewriting a
    dotted family version then peeling a trailing ``-vN:rev`` and ``-YYYYMMDD``
    in that order, so the real ``-<date>-v1:0`` shape (e.g.
    ``us.anthropic.claude-sonnet-4-6-20251101-v1:0``) resolves rather than only
    the date or version in isolation.Ú ú\1-\2)r*   Úsubr(   r+   ©r,   s    úh/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/common_utils.pyÚ_strip_bedrock_id_suffixesr4   >   s8   € ô $×'Ñ'Ø
Ü"×&Ñ& rÔ+=×+AÑ+AÀ(ÈEÓ+RÓSóð ó    Úvaluec                 óT   — | €y| j                  d«      } | j                  t        «      S )zACheck if a value contains an Anthropic OAuth token (sk-ant-oat*).FúBearer )ÚremoveprefixÚ
startswithr   )r6   s    r3   Úis_anthropic_oauth_keyr;   J   s,   € à€}Øà×Ñ˜yÓ)€EØ×ÑÔ8Ó9Ð9r5   ÚexistingÚnew_betac                 óä   — | s|S | j                  d«      D �ch c]#  }|j                  «       sŒ|j                  «       ’Œ% }}|j                  |«       dj                  t	        |«      «      S c c}w )zNMerge a new beta value into an existing comma-separated anthropic-beta header.ú,)ÚsplitÚstripÚaddÚjoinÚsorted)r<   r=   ÚbÚbetass       r3   Ú_merge_beta_headersrG   S   sY   € áØˆØ'/§~¡~°cÓ':ÖH !¸a¿g¹g½i�A—G‘G•IÐH€EÐHØ	‡I�IˆhÔØ�8‰8”F˜5“MÓ"Ð"ùò Is
   ˜A-®A-ÚheadersÚapi_keyc                 ó*  — t        d„ | j                  «       D «       d«      }|j                  dt        › �«      ri|j	                  d«      }t        d„ | D «       «      D ]  }| j                  |«       Œ || d<   t        | j                  d«      t        «      | d<   d| d<   | |fS |rl|j                  t        «      rWt        d	„ | D «       «      D ]  }| j                  |«       Œ d|› �| d<   t        | j                  d«      t        «      | d<   d| d<   | |fS )
a^  
    Handle Anthropic OAuth token detection and header setup.

    If an OAuth token is detected in the Authorization header (any casing),
    extracts it and sets the required OAuth headers.

    Args:
        headers: Request headers dict
        api_key: Current API key (may be None)

    Returns:
        Tuple of (updated headers, api_key)
    c              3   óN   K  — | ]  \  }}|j                  «       d k(  sŒ|–— Œ y­w)ÚauthorizationN©Úlower)Ú.0Únamer6   s      r3   ú	<genexpr>z4optionally_handle_anthropic_oauth.<locals>.<genexpr>k   s"   è ø€ Òk©¨¨uÈ4Ï:É:Ë<Ð[jÓKjœuÑkùs   ‚%ž%r/   r8   c              3   óF   K  — | ]  }|j                  «       d v sŒ|–— Œ y­w))ú	x-api-keyrL   NrM   ©rO   Úheader_names     r3   rQ   z4optionally_handle_anthropic_oauth.<locals>.<genexpr>n   s&   è ø€ ò 
Ø'°k×6GÑ6GÓ6IÐMkÒ6kŒKñ
ùs   ‚!š!rL   úanthropic-betaÚtrueú)anthropic-dangerous-direct-browser-accessc              3   óH   K  — | ]  }|j                  «       d k(  sŒ|–— Œ y­w)rS   NrM   rT   s     r3   rQ   z4optionally_handle_anthropic_oauth.<locals>.<genexpr>x   s!   è ø€ Òg¨+ÀK×DUÑDUÓDWÐ[fÓDfœ+Ñgùs   ‚"›")
ÚnextÚitemsr:   r   r9   ÚtupleÚpoprG   Úgetr   )rH   rI   Úauth_headerrP   s       r3   Ú!optionally_handle_anthropic_oauthr`   \   s-  € ô Ñk¸¿¹»ÔkÐmoÓp€KØ×Ñ Ô(DÐ'EÐFÔGØ×*Ñ*¨9Ó5ˆÜñ 
Ø+2ô
ó 
ò 	ˆDð �K‰K˜Õð	ð $/ˆ�Ñ Ü$7¸¿¹ÐDTÓ8UÔWrÓ$sˆÐ Ñ!Ø?EˆÐ;Ñ<Ø˜ÐÐá�7×%Ñ%Ô&BÔCÜÑg¸ÔgÓgò 	ˆDØ�K‰K˜Õð	à%,¨W¨IÐ#6ˆ�Ñ Ü$7¸¿¹ÐDTÓ8UÔWrÓ$sˆÐ Ñ!Ø?EˆÐ;Ñ<Ø�GÐÐr5   c                   óF   ‡ — e Zd Z	 ddedej
                  dz  fˆ fd„Zˆ xZS )ÚAnthropicErrorNÚstatus_coderH   c                 ó*   •— t         ‰| �  |||¬«       y )N)rc   ÚmessagerH   )ÚsuperÚ__init__)Úselfrc   re   rH   Ú	__class__s       €r3   rg   zAnthropicError.__init__�   s   ø€ ô 	‰Ñ [¸'È7ÐÕSr5   ©N)Ú__name__Ú
__module__Ú__qualname__ÚintÚhttpxÚHeadersrg   Ú__classcell__)ri   s   @r3   rb   rb   €   s1   ø„ ð
 )-ñ	TàðTð —‘ Ñ%÷	Tñ Tr5   rb   c            )       óz  — e Zd Zdee   defd„Zdee   defd„Zdee   dz  defd„Z	dee
   dz  dedz  fd	„Zdee
   dz  defd
„Zdee   defd„Zdedz  defd„Zdedz  defd„Zdedz  defd„Zededefd„«       Zedededededededdfd„«       Zededefd„«       Zededee   fd„«       Zededededz  fd„«       Zededededz  fd„«       Zedededededz  fd„«       Zededededefd„«       Zedededefd„«       Zedededefd „«       Zedededefd!„«       Zedede ee!f   deddfd"„«       Z"	 dJdedz  dedz  dedefd#„Z#dedz  defd$„Z$dedz  defd%„Z%d&edz  dee   dz  fd'„Z&d(edefd)„Z'	 	 	 	 	 dKdededz  d*edz  d+ed,ed-ededee   fd.„Z(edLd/ed0edz  d1edefd2„«       Z)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dMd/edz  d3edz  d4edz  d*edz  d+ed5ed,ed-ed6ed7ed8ed9ed:ed;ed<ee   dz  d=ed>ed0edz  d1edef(d?„Z*	 	 dNd@ededee   dedAed/edz  d0edz  defdB„Z+edJd0edz  dedz  fdC„«       Z,edJd/edz  dedz  fdD„«       Z-edJd3edz  dedz  fdE„«       Z.e	 	 	 dOd/edz  d0edz  d1ededz  fdF„«       Z/edJdedz  dedz  fdG„«       Z0dNd/edz  d0edz  dee   fdH„Z1de2dz  fdI„Z3y)PÚAnthropicModelInfoÚmessagesr-   c                 ó    — |D ]I  }|j                  dd«      � y|j                  d«      }|€Œ+t        |t        «      sŒ<|D ]	  }d|v sŒ  y ŒK y)z•
        Return if {"cache_control": ..} in message content block

        Used to check if anthropic prompt caching headers need to be set.
        Úcache_controlNTÚcontentF)r^   Ú
isinstanceÚlist)rh   rt   re   Ú_message_contentrw   s        r3   Úis_cache_control_setz'AnthropicModelInfo.is_cache_control_set‹   se   € ð  ò 	$ˆGØ�{‰{˜?¨DÓ1Ð=ÙØ&Ÿ{™{¨9Ó5ÐØÑ+´
Ð;KÌTÕ0RØ/ò $�GØ&¨'Ò1Ú#ñ$ð	$ð r5   c                 ó4   — t        |«      }t        |«      dkD  S )z`
        Return if {"source": {"type": "file", "file_id": ..}} in message content block
        r   )r   Úlen)rh   rt   Úfile_idss      r3   Úis_file_id_usedz"AnthropicModelInfo.is_file_id_usedœ   s   € ô 5°XÓ>ˆÜ�8‹}˜qÑ Ð r5   Úmcp_serversNc                 ó   — |€y|ryy)NFT© )rh   r€   s     r3   Úis_mcp_server_usedz%AnthropicModelInfo.is_mcp_server_used£   s   € ØÐØÙØØr5   Útoolsc                 óX   — |€y|D ]"  }d|v sŒ|d   j                  d«      sŒ|d   c S  y)zKReturns the computer tool version if used, e.g. 'computer_20250124' or NoneNÚtypeÚ	computer_©r:   ©rh   r„   Útools      r3   Úis_computer_tool_usedz(AnthropicModelInfo.is_computer_tool_usedª   s@   € àˆ=ØØò 	$ˆDØ˜Š~ $ v¡,×"9Ñ"9¸+Õ"FØ˜F‘|Ò#ð	$ð r5   c                 ó~   — |€y|D ]5  }d|v sŒ|d   j                  t        j                  j                  «      sŒ5 y y)z'Returns True if web_search tool is usedFr†   T)r:   r   Ú
WEB_SEARCHr6   r‰   s      r3   Úis_web_search_tool_usedz*AnthropicModelInfo.is_web_search_tool_used³   sF   € àˆ=ØØò 	ˆDØ˜Š~ $ v¡,×"9Ñ"9Ô:P×:[Ñ:[×:aÑ:aÕ"bÙð	ð r5   c                 ó„   — |D ];  }d|v sŒ|d   €Œt        |d   t        «      sŒ"|d   D ]  }d|v sŒ|d   dk7  sŒ  y Œ= y)z=
        Set to true if media passed into messages.

        rw   r†   ÚtextTF)rx   ry   )rh   rt   re   rw   s       r3   Úis_pdf_usedzAnthropicModelInfo.is_pdf_used¼   se   € ð
  ò 	$ˆGØ˜GÒ#¨°	Ñ(:Ñ(FÌ:ÐV]Ð^gÑVhÔjnÕKoØ& yÑ1ò $�GØ Ò(¨W°V©_ÀÓ-FÚ#ñ$ð	$ð
 r5   c                 óH   — |sy|D ]  }|j                  dd«      }|dv sŒ y y)zK
        Check if tool search tools are present in the tools list.
        Fr†   r/   )Útool_search_tool_regex_20251119Útool_search_tool_bm25_20251119T©r^   ©rh   r„   rŠ   Ú	tool_types       r3   Úis_tool_search_usedz&AnthropicModelInfo.is_tool_search_usedÈ   s@   € ñ Øàò 	ˆDØŸ™ ¨Ó,ˆIØð ò ñ ð	ð r5   c                 ó
  — |sy|D ]{  }|j                  dd«      }|rt        |t        «      rd|v r y|j                  di «      }t        |t        «      sŒP|j                  dd«      }|sŒet        |t        «      sŒvd|v sŒ{ y y)zÂ
        Check if programmatic tool calling is being used (tools with allowed_callers field).

        Returns True if any tool has allowed_callers containing 'code_execution_20250825'.
        FÚallowed_callersNÚcode_execution_20250825TÚfunction)r^   rx   ry   Údict)rh   r„   rŠ   rš   rœ   Úfunction_allowed_callerss         r3   Ú!is_programmatic_tool_calling_usedz4AnthropicModelInfo.is_programmatic_tool_calling_usedØ   sŽ   € ñ Øàò 	$ˆDà"Ÿh™hÐ'8¸$Ó?ˆOÙ¤:¨o¼tÔ#DØ,°Ñ?Ùð —x‘x 
¨BÓ/ˆHÜ˜(¤DÕ)Ø+3¯<©<Ð8IÈ4Ó+PÐ(Ú+´
Ð;SÔUYÕ0ZØ0Ð4LÒLÙ#ð	$ð r5   c                 ó2  — |sy|D ]�  }|j                  dd«      }|r t        |t        «      rt        |«      dkD  r y|j                  di «      }t        |t        «      sŒZ|j                  dd«      }|sŒot        |t        «      sŒ€t        |«      dkD  sŒ� y y)z�
        Check if input_examples is being used in any tools.

        Returns True if any tool has input_examples field.
        FÚinput_examplesNr   Trœ   )r^   rx   ry   r}   r�   )rh   r„   rŠ   r¡   rœ   Úfunction_input_exampless         r3   Úis_input_examples_usedz)AnthropicModelInfo.is_input_examples_usedò   s˜   € ñ Øàò 	 ˆDà!ŸX™XÐ&6¸Ó=ˆNÙ¤*¨^¼TÔ"BÄsÈ>ÓGZÐ]^ÒG^Ùð —x‘x 
¨BÓ/ˆHÜ˜(¤DÕ)Ø*2¯,©,Ð7GÈÓ*NÐ'â+Ü"Ð#:¼DÕAÜÐ3Ó4°qÓ8áð	 ð" r5   r,   c                 ó‚   ‡— t         j                  | d«      }|�|S | j                  «       Št        ˆfd„dD «       «       S )a“  Claude 4.7+ (Opus 4.7/4.8, Fable 5) removed sampling params: the API
        rejects ``top_p``, ``top_k``, and any ``temperature`` other than 1 with
        a 400 ("`temperature` is deprecated for this model").

        Driven by the ``supports_sampling_params`` flag in the model map; the
        name check remains only as a fallback for provider-routed ids whose
        map entries predate the flag.Úsupports_sampling_paramsc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrj   r‚   )rO   ÚvÚmodel_lowers     €r3   rQ   z?AnthropicModelInfo._supports_sampling_params.<locals>.<genexpr>  s   øè ø€ ò 
àð �Ôñ
ùs   ƒ)	Úfablezopus-4-7Úopus_4_7zopus-4.7zopus_4.7zopus-4-8Úopus_4_8zopus-4.8zopus_4.8)rs   Ú_get_model_capabilityrN   Úany)r,   Úflagr¨   s     @r3   Ú_supports_sampling_paramsz,AnthropicModelInfo._supports_sampling_params  sO   ø€ ô )×>Ñ>¸uÐF`ÓaˆØÐØˆKØ"Ÿ[™[›]ˆÜó 
ð
ô
ó 
ð 
ð 	
r5   Úoptional_paramsÚparamr6   Údrop_paramsÚ
output_keyc           
      óà   — t         j                  |«      s
|dk(  r|dk(  r|| |<   yt        j                  s9|s6|dk(  rdnd}t        j                  j                  |› d|› d|› d|› d�d	¬
«      ‚yy)zâForward ``temperature``/``top_p``/``top_k`` to
        ``optional_params[output_key]`` unless the model removed sampling
        params, in which case drop the param (with drop_params) or raise a
        clean client-side 400.Útemperatureé   z!Only temperature=1 is supported. r/   z does not support ú=z. z=To drop unsupported params, set `litellm.drop_params = True`.r   )re   rc   N)rs   r¯   Úlitellmr²   ÚutilsÚUnsupportedParamsError)r°   r,   r±   r6   r²   r³   Úsupported_hints          r3   Ú_apply_sampling_paramz(AnthropicModelInfo._apply_sampling_param*  s“   € ô ×7Ñ7¸Ô>À5ÈMÒCYÐ^cÐghÒ^hØ*/ˆO˜JÒ'Ü×%Ò%©ØKPÐTaÒKaÑ$GÐgiˆNÜ—-‘-×6Ñ6à�gÐ/°¨w°a¸°w¸bÀÐ@PØSðTð  ð 7ó ð ð *5Ð%r5   c                 ó<   — | j                  d«      }|dkD  r| d | S | S )Nú@r   )Úrfind)r,   Úats     r3   Ú_strip_version_suffixz(AnthropicModelInfo._strip_version_suffixC  s(   € à—K‘K Ó$ˆØ�Š6Ø˜˜"�:ÐØˆr5   c                 ó  ‡ — d}t        ˆ fd„|D «       «      }	 ddlm} |j                  ‰ «      }|r|d|› �fnd}‰ g|¢|¢­}t        d„ |D «       «      }t        t        j                  g |¢|¢­«      «      S # t        $ r d}Y ŒUw xY w)	a®  Model-map keys to try for ``model``: the id itself, the same id with a
        bedrock/vertex routing prefix removed, the Bedrock base model, and each of
        those normalized by stripping a Bedrock version suffix (``-v1:0`` fully or
        just the ``:0`` inference-profile minor), stripping a dated-release suffix
        (``-20260205``), or rewriting a dotted family version to hyphens
        (``4.6`` -> ``4-6``). Lets any reasonable alias (e.g.
        ``bedrock/invoke/global.anthropic.claude-opus-4-7-v1:0``,
        ``claude-sonnet-4-6-20260219`` or ``claude-sonnet-4.6``) resolve to its base
        cost-map entry so the capability flag on that entry stays authoritative.)zbedrock/converse/zbedrock/invoke/úbedrock/z
vertex_ai/c              3   ó^   •K  — | ]$  }‰j                  |«      sŒ‰t        |«      d  –— Œ& y ­wrj   )r:   r}   )rO   Úpr,   s     €r3   rQ   zBAnthropicModelInfo._model_map_lookup_candidates.<locals>.<genexpr>[  s)   øè ø€ Ò![°aÀu×GWÑGWÐXYÕGZ %¬¨A«¨¤/Ñ![ùs   ƒ-š-r   )ÚBedrockModelInfoNrÃ   r‚   c           	   3   ó  K  — | ]  }t         j                  d |«      t        j                  d |«      t        j                  d |«      t        j                  d|«      t        |«      t        j                  |«      fD ]  }|–— Œ Œ� y­w)r/   r0   N)r(   r1   r)   r*   r+   r4   rs   rÁ   )rO   ÚcandÚstrippeds      r3   rQ   zBAnthropicModelInfo._model_map_lookup_candidates.<locals>.<genexpr>d  s…   è ø€ ò "
àä*×.Ñ.¨r°4Ó8Ü+×/Ñ/°°DÓ9Ü(×,Ñ,¨R°Ó6Ü"×&Ñ& x°Ó6Ü*¨4Ó0Ü"×8Ñ8¸Ó>ðò"
ð ô ð"
Øñ"
ùs   ‚BB)r\   Ú!litellm.llms.bedrock.common_utilsrÆ   Úget_base_modelÚ	Exceptionry   r�   Úfromkeys)r,   ÚprefixesÚ
deprefixedrÆ   ÚbaseÚbedrock_baseÚprimaryÚ
normalizeds   `       r3   Ú_model_map_lookup_candidatesz/AnthropicModelInfo._model_map_lookup_candidatesJ  s¬   ø€ ð
ˆô "Ó![¸8Ô![Ó[ˆ
ð	ÝJà#×2Ñ2°5Ó9ˆDñ <@˜t x°¨vÐ%6Ñ7ÀRˆØÐ< *Ð<¨|Ñ<ˆÜ!ñ "
àô"
ó 
ˆ
ô ”D—M‘MÐ"9 GÐ"9¨jÑ"9Ó:Ó;Ð;øô! ò 	ØŠDð	ús   ™A8 Á8BÂBÚkeyc                 ó  — ddl m} 	 t        j                  | «      }t        j
                   |«       fD ]@  }|D ]9  }|j                  |i «      j                  |«      }t        |t        «      sŒ5|c c S  ŒB 	 y# t        $ r Y yw xY w)z^Read boolean capability ``key`` from the model map, or None when
        no entry declares it.r   )Ú_get_bundled_model_cost_mapN)
Úlitellm.utilsr×   rs   rÔ   r¸   Ú
model_costr^   rx   ÚboolrÌ   )r,   rÕ   r×   Ú
candidatesrÙ   rÈ   r6   s          r3   r¬   z(AnthropicModelInfo._get_model_capabilityr  s�   € õ 	>ð	Ü 2× OÑ OÐPUÓ VˆJÜ&×1Ñ1Ñ3NÓ3PÐQò %�
Ø&ò %�DØ&ŸN™N¨4°Ó4×8Ñ8¸Ó=�EÜ! %¬Õ.Ø$œñ%ñ%ð øô ò 	ØØð	ús   ˆA%A9 Á.A9 Á4A9 Á9	BÂBc                 óˆ   — t         j                  j                  | i «      j                  |«      }t        |t        «      r|S dS )z÷Read boolean capability ``key`` from the exact model-map entry only.

        Unlike ``_get_model_capability``, does not walk stripped provider aliases.
        Use when a feature is tied to a specific host (e.g. Anthropic API fast mode).
        N)r¸   rÙ   r^   rx   rÚ   )r,   rÕ   r6   s      r3   Ú_get_exact_model_capabilityz.AnthropicModelInfo._get_exact_model_capabilityƒ  s;   € ô ×)Ñ)×-Ñ-¨e°RÓ8×<Ñ<¸SÓAˆÜ" 5¬$Ô/ˆuÐ9°TÐ9r5   Úcustom_llm_providerc                 óÀ   — ddl m} 	 t        j                  | |¬«      \  }}}} |||¬«      j	                  |«      }t        |t        «      r|S dS # t
        $ r Y yw xY w)ad  Resolve boolean capability ``key`` for ``model`` under the caller's provider.

        Returns the flag when the provider-aware lookup resolves ``model`` to an
        entry (or fallback rule) that sets it explicitly, and ``None`` when the
        model does not resolve under that provider or the resolved entry has no
        opinion on ``key``.
        r   )Ú_get_model_info_helper©r,   rÞ   N)rØ   rà   r¸   Úget_llm_providerr^   rÌ   rx   rÚ   )r,   rÕ   rÞ   rà   Úresolved_modelÚresolved_providerÚ_r6   s           r3   Ú!_get_provider_resolved_capabilityz4AnthropicModelInfo._get_provider_resolved_capability�  sq   € õ 	9ð	Ü6=×6NÑ6NØÐ1Dô7Ñ3ˆNÐ-¨q°!ñ 2¸Ð\mÔn×rÑrÐsvÓwˆEô # 5¬$Ô/ˆuÐ9°TÐ9øô ò 	Ùð	ús   ˆ5A Á	AÁAc                 ó®   — ddl m} t        j                  | ||«      }|�|S 	  || ||¬«      ry	 t        j                  | |«      du S # t        $ r Y Œ#w xY w)a¢  Check a boolean capability ``key`` in the model map under the caller's provider.

        The provider-aware lookup is authoritative when it resolves an explicit flag,
        so ``key: false`` on the provider-namespaced entry wins over every fallback.
        Otherwise ``_supports_factory``'s provider-level fallbacks and the raw
        model-map walk remain as backstops for alias forms the lookup misses.
        r   )Ú_supports_factory)r,   rÞ   rÕ   T)rØ   rè   rs   ræ   rÌ   r¬   )r,   rÕ   rÞ   rè   Úresolveds        r3   Ú_supports_model_capabilityz-AnthropicModelInfo._supports_model_capability¡  sv   € õ 	4ä,×NÑNÈuÐVYÐ[nÓoˆØÐØˆOð	Ù ØØ$7Øõð
 ðô "×7Ñ7¸¸sÓCÀtÐKÐKøô ò 	Ùð	ús   £A Á	AÁAc                 ó0   — t         j                  | d|«      S )aÎ  Whether ``model`` uses adaptive thinking (``output_config.effort``).

        The model cost map is authoritative: an explicit ``supports_adaptive_thinking``
        entry resolved under ``custom_llm_provider``, or a ``fallback_generalizations``
        rule for unknown Claude models. The version gate (>= 4.6, including
        provider-prefixed Bedrock/Vertex ids that map to no exact entry) lives entirely
        in that declarative rule, not here.
        Úsupports_adaptive_thinking©rs   rê   rá   s     r3   Ú_is_adaptive_thinking_modelz.AnthropicModelInfo._is_adaptive_thinking_modelº  s   € ô "×<Ñ<¸UÐD`ÐbuÓvÐvr5   c                 ó0   — t         j                  | d|«      S )aI  Whether ``model`` always thinks and rejects ``thinking.type=disabled``
        (Fable 5 / Mythos 5 generation). The model cost map is authoritative: an
        explicit ``thinking_always_on`` entry resolved under ``custom_llm_provider``,
        or a ``fallback_generalizations`` rule for unmapped ids of those families.
        Úthinking_always_onrí   rá   s     r3   Ú_is_always_on_thinking_modelz/AnthropicModelInfo._is_always_on_thinking_modelÆ  s   € ô "×<Ñ<¸UÐDXÐZmÓnÐnr5   c                 ó0   — t         j                  | d|«      S )a«  Whether ``model`` is an adaptive-thinking model that still accepts legacy
        ``thinking.type=enabled`` with ``budget_tokens`` (the Claude 4.6 family).
        The model cost map is authoritative: an explicit ``supports_legacy_thinking``
        entry resolved under ``custom_llm_provider``, or a ``fallback_generalizations``
        rule for unmapped 4.6 ids. Absent flag means the model rejects the legacy shape.
        Úsupports_legacy_thinkingrí   rá   s     r3   Ú_supports_legacy_thinkingz,AnthropicModelInfo._supports_legacy_thinkingÏ  s   € ô "×<Ñ<¸UÐD^Ð`sÓtÐtr5   c                 ó
  — |j                  d«      }t        |t        «      r|j                  d«      dk7  ryt        j	                  | |«      syt
        j                  j                  t        | «       |j                  dd«       y)zÓOmit ``thinking={'type': 'disabled'}`` for always-on-thinking models
        (Fable 5 / Mythos 5), which 400 on it; omission is the API-documented
        remedy and yields the model's default adaptive thinking.Úthinkingr†   ÚdisabledN)
r^   rx   r�   rs   rñ   r¸   Úverbose_loggerÚwarningr   r]   )r,   r°   rÞ   rö   s       r3   Úmaybe_drop_disabled_thinkingz/AnthropicModelInfo.maybe_drop_disabled_thinkingÙ  sq   € ð *×-Ñ-¨jÓ9ˆÜ˜(¤DÔ)¨X¯\©\¸&Ó-AÀZÒ-OØÜ!×>Ñ>¸uÐFYÔZØÜ×Ñ×&Ñ&Ü*Øô	
ð 	×Ñ˜J¨Õ-r5   c                óV  — |sy|r| j                  ||«      ry|rHd|j                  «       v sd|j                  «       v r$|j                  d«      }|rt        |t        «      ry|j                  d«      }|r4t        |t
        «      r$|j                  d«      }|rt        |t        «      ryy)u+  
        Check if effort parameter is being used and requires a beta header.

        Returns True if effort-related parameters are present and
        the model requires the effort beta header. Claude 4.6+ models
        use output_config as a stable API feature â€” no beta header needed.
        Fzopus-4-5Úopus_4_5Úreasoning_effortTÚoutput_configÚeffort)rî   rN   r^   rx   Ústrr�   )rh   r°   r,   rÞ   rý   rþ   rÿ   s          r3   Úis_effort_usedz!AnthropicModelInfo.is_effort_usedí  s£   € ñ Øñ �T×5Ñ5°eÐ=PÔQØñ �j E§K¡K£MÑ1°ZÀ5Ç;Á;Ã=Ñ5PØ&5×&9Ñ&9Ð:LÓ&MÐÙ¤JÐ/?ÄÔ$EØð  /×2Ñ2°?ÓCˆÙœZ¨´tÔ<Ø)×-Ñ-¨hÓ7ˆFÙœ* V¬SÔ1Øàr5   c                 óJ   — |sy|D ]  }|j                  dd«      }|dk(  sŒ y y)zƒ
        Check if code execution tool is being used.

        Returns True if any tool has type "code_execution_20250825".
        Fr†   r/   r›   Tr•   r–   s       r3   Úis_code_execution_tool_usedz.AnthropicModelInfo.is_code_execution_tool_used  s:   € ñ Øàò 	ˆDØŸ™ ¨Ó,ˆIØÐ5Ó5Ùð	ð r5   c                 ó´   — |sy|j                  d«      }|rBt        |t        «      r2|j                  d«      }|rt        |t        «      rt	        |«      dkD  ryy)zˆ
        Check if container with skills is being used.

        Returns True if optional_params contains container with skills.
        FÚ	containerÚskillsr   T)r^   rx   r�   ry   r}   )rh   r°   r  r  s       r3   Úis_container_with_skills_usedz0AnthropicModelInfo.is_container_with_skills_used   sP   € ñ Øà*×.Ñ.¨{Ó;ˆ	Ùœ I¬tÔ4Ø%ŸM™M¨(Ó3ˆFÙœ* V¬TÔ2´s¸6³{ÀQ²ØØr5   Úanthropic_beta_headerc                 ó*   — |€y |j                  d«      S )Nr?   )r@   )rh   r  s     r3   Ú _get_user_anthropic_beta_headersz3AnthropicModelInfo._get_user_anthropic_beta_headers0  s   € Ø Ð(ØØ$×*Ñ*¨3Ó/Ð/r5   Úcomputer_tool_versionc                 ó0   — dddœ}|j                  |d«      S )a  
        Get the appropriate beta header for a given computer tool version.

        Args:
            computer_tool_version: The computer tool version (e.g., 'computer_20250124', 'computer_20241022')

        Returns:
            The corresponding beta header string
        zcomputer-use-2025-01-24zcomputer-use-2024-10-22)Úcomputer_20250124Úcomputer_20241022r•   )rh   r  Úcomputer_tool_beta_mappings      r3   Úget_computer_tool_beta_headerz0AnthropicModelInfo.get_computer_tool_beta_header5  s-   € ð ";Ø!:ñ-
Ð"ð *×-Ñ-Ø!Ø%ó
ð 	
r5   Úcomputer_tool_usedÚprompt_caching_setÚfile_id_usedÚmcp_server_usedc                ó>  — ddl m} g }	| j                  |||¬«      }
|
r|	j                  |«       |r"| j	                  |«      }|	j                  |«       |r"|	j                  d«       |	j                  d«       |r|	j                  d«       t        t        |	«      «      S )z’
        Get list of common beta headers based on the features that are active.

        Returns:
            List of beta header strings
        r   ©ÚANTHROPIC_EFFORT_BETA_HEADER)rÞ   úfiles-api-2025-04-14úcode-execution-2025-05-22úmcp-client-2025-04-04)Úlitellm.types.llms.anthropicr  r  Úappendr  ry   Úset)rh   r,   r°   r  r  r  r  rÞ   r  rF   Úeffort_usedÚbeta_headers               r3   Úget_anthropic_beta_listz*AnthropicModelInfo.get_anthropic_beta_listH  s•   € õ" 	Nàˆð "×0Ñ0°À%Ð]pÐ0ÓqˆáØ�L‰LÐ5Ô6áØ!%×!CÑ!CÐDVÓ!WˆKØ�L‰L˜Ô%ñ Ø�L‰LÐ/Ô0Ø�L‰LÐ4Ô5áØ�L‰LÐ0Ô1ä”C˜“JÓÐr5   rI   Úapi_baseÚuse_bearer_for_custom_basec                 ót   — |r3|r1d|vr-| j                  d«      s| j                  d«      r| nd| › �}d|iS d| iS )Nzapi.anthropic.comzsk-ant-r8   rL   rS   rˆ   )rI   r!  r"  r6   s       r3   Ú_make_api_key_auth_headerz,AnthropicModelInfo._make_api_key_auth_headert  sQ   € á%ÙÐ,°HÑ<ÀW×EWÑEWÐXaÔEbà&-×&8Ñ&8¸Ô&C™7È7ÐSZÐR[ÐI\ˆEØ# UÐ+Ð+Ø˜WÐ%Ð%r5   Ú
auth_tokenÚanthropic_versionÚpdf_usedÚweb_search_tool_usedÚtool_search_usedÚprogrammatic_tool_calling_usedÚinput_examples_usedr  Úis_vertex_requestÚuser_anthropic_beta_headersÚcode_execution_tool_usedÚcontainer_with_skills_usedc                 ó2  — t        «       }|r"| j                  |«      }|j                  |«       |r"|j                  d«       |j                  d«       |r|j                  d«       |
s|s|rddlm} |j                  |«       |rddlm} |j                  |«       |r|j                  d«       |r|j                  d«       |xr |j                  t        «      }|xs d	d
d
dœ}|r#d|› �|d<   d|d<   |j                  t        «       n1|r|s	d|› �|d<   n$|r"|j                  | j                  |||«      «       |�|j                  |«       |du r#|	rddlm} |j                  j                  |d<   |S t        |«      dkD  rdj                  |«      |d<   |S )Nr  r  r  r   )Ú!ANTHROPIC_TOOL_SEARCH_BETA_HEADERr  zcode-execution-2025-08-25zskills-2025-10-02ú
2023-06-01zapplication/json)úanthropic-versionÚacceptzcontent-typer8   rL   rW   rX   T)ÚANTHROPIC_BETA_HEADER_VALUESrV   r?   )r  r  rB   r  r1  r  r:   r   r   Úupdater$  r5  ÚWEB_SEARCH_2025_03_05r6   r}   rC   )rh   rI   r%  r&  r  r  r'  r  r  r(  r)  r*  r+  r  r,  r-  r.  r/  r!  r"  rF   r  r1  r  Ú	_is_oauthrH   r5  s                              r3   Úget_anthropic_headersz(AnthropicModelInfo.get_anthropic_headers}  s¢  € ô, “uˆñ Ø!%×!CÑ!CÐDVÓ!WˆKØ�I‰I�kÔ"ñ Ø�I‰IÐ,Ô-Ø�I‰IÐ1Ô2ÙØ�I‰IÐ-Ô.áÑ=ÑATÝVà�I‰IÐ7Ô8ñ ÝQà�I‰IÐ2Ô3ñ $Ø�I‰IÐ1Ô2ñ &Ø�I‰IÐ)Ô*à"ÒW w×'9Ñ'9Ô:VÓ'Wˆ	à!2Ò!B°lØ(Ø.ñ
ˆñ
 Ø)0°°	Ð':ˆG�OÑ$ØCIˆGÐ?Ñ@Ø�I‰IÔ1Õ2Ù¡Ø)0°°Ð'=ˆG�OÒ$ÙØ�N‰N˜4×9Ñ9¸'À8ÐMgÓhÔià&Ð2Ø�L‰LÐ4Ô5ð  Ñ$á#ÝUà,H×,^Ñ,^×,dÑ,d�Ð(Ñ)ð ˆô �‹Z˜!Š^Ø(+¯©°«ˆGÐ$Ñ%àˆr5   rH   Úlitellm_paramsc                 ó   — |€!t        |t        «      r|j                  d«      }t        t        |t        «      xr |j                  dd«      «      }t	        ||¬«      \  }}t
        j                  |«      }d }	|€t
        j                  «       }	|€|	€t        j                  dd|¬«      ‚|j                  d«      }
| j                  |¬	«      }| j                  |
¬
«      }| j                  |j                  d«      ¬«      }| j                  |¬	«      }| j                  |¬	«      }| j                  |
¬
«      }| j!                  |
¬
«      }| j#                  |
¬
«      }| j%                  |
¬
«      }| j'                  ||d¬«      }| j)                  |
¬
«      }| j+                  |¬«      }| j-                  |j                  d«      ¬«      }| j/                  |||||	|||j                  dd«      ||||||||||¬«      }i |¥|¥}|S )Nr!  r"  F)rH   rI   zÔMissing Anthropic API Key - A call is being made to anthropic but no key is set either in the environment variables or via params. Please set `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` in your environment varsÚ	anthropic)re   Úllm_providerr,   r„   )rt   )r„   r€   )r€   )r°   r,   rÞ   )r°   rV   )r  r,  )r  r  r'  rI   r%  r  r(  r,  r-  r  r)  r*  r+  r  r.  r/  r!  r"  )rx   r�   r^   rÚ   r`   rs   Úget_api_keyÚget_auth_tokenr¸   ÚAuthenticationErrorr{   r‹   rƒ   r‘   r   rŽ   r˜   rŸ   r£   r  r  r  r
  r9  )rh   rH   r,   rt   r°   r:  rI   r!  r"  r%  r„   r  r  r  r'  r  r(  r)  r*  r+  r  r.  r/  r-  Úanthropic_headerss                            r3   Úvalidate_environmentz'AnthropicModelInfo.validate_environmentÓ  s[  € ð Ð¤
¨>¼4Ô @Ø%×)Ñ)¨*Ó5ˆHÜ26Ü�~¤tÓ,Òh°×1CÑ1CÐD`ÐbgÓ1hó3
Ð"ô =ÀWÐV]Ô^Ñˆ�Ü$×0Ñ0°Ó9ˆà!%ˆ
Øˆ?Ü+×:Ñ:Ó<ˆJØˆ?˜zÐ1Ü×-Ñ-ð oØ(Øôð ð '×*Ñ*¨7Ó3ˆØ$(×$=Ñ$=ÀxÐ$=Ó$PÐØ$(×$>Ñ$>ÀUÐ$>Ó$KÐØ!%×!8Ñ!8À_×EXÑEXÐYfÓEgÐ!8Ó!hˆØ×*Ñ*°HÐ*Ó=ˆØ"×2Ñ2¸HÐ2ÓEˆØ&*×&BÑ&BÈÐ&BÓ&OÐØ"&×":Ñ":ÀÐ":Ó"GÐØ04×0VÑ0VÐ]bÐ0VÓ0cÐ&Ø%)×%@Ñ%@ÀuÐ%@Ó%MÐØ×)Ñ)¸/ÐQVÐlwÐ)ÓxˆØ*.×*JÑ*JÐQVÐ*JÓ*WÐ Ø,0×,NÑ,NÐ_nÐ,NÓ,oÐ"Ø-1×-RÑ-RØ")§+¡+Ð.>Ó"?ð .Só .
Ð#ð $(×#=Ñ#=Ø1Ø1ØØØ!Ø%Ø!5Ø-×1Ñ1Ð2EÀuÓMØ(CØ+Ø-Ø+IØ 3Ø#Ø%=Ø'AØØ'Að% $>ó $
Ðð* 3�WÐ2Ð 1Ð2ˆàˆr5   c                 óB   — ddl m} | xs  |d«      xs  |d«      xs dS )Nr   ©Úget_secret_strÚANTHROPIC_API_BASEÚANTHROPIC_BASE_URLzhttps://api.anthropic.com©Úlitellm.secret_managers.mainrE  )r!  rE  s     r3   Úget_api_basezAnthropicModelInfo.get_api_base  s5   € å?ð ò +ÙÐ2Ó3ò+áÐ2Ó3ò+ð +ð		
r5   c                 ó&   — ddl m} | xs  |d«      S )Nr   rD  ÚANTHROPIC_API_KEYrH  )rI   rE  s     r3   r>  zAnthropicModelInfo.get_api_key$  s   € å?àÒ=™.Ð)<Ó=Ð=r5   c                 ó&   — ddl m} | xs  |d«      S )zÕGet auth token from ANTHROPIC_AUTH_TOKEN env var.

        Unlike api_key (which uses X-Api-Key header), auth_token uses
        Authorization: Bearer header, matching the official Anthropic SDK behavior.
        r   rD  ÚANTHROPIC_AUTH_TOKENrH  )r%  rE  s     r3   r?  z!AnthropicModelInfo.get_auth_token*  s   € õ 	@àÒC™^Ð,BÓCÐCr5   c                 ó¾   — t         j                  | «      }|�)t        |«      rdd|› �iS t         j                  |||«      S t         j	                  «       }|�dd|› �iS y)a)  Resolve Anthropic credentials and return the appropriate auth header dict.

        Checks ANTHROPIC_API_KEY first (-> x-api-key or Bearer depending on
        use_bearer_for_custom_base), then ANTHROPIC_AUTH_TOKEN (-> Authorization: Bearer).
        Returns None if neither is available.
        NrL   r8   )rs   r>  r;   r$  r?  )rI   r!  r"  Úresolved_keyr%  s        r3   Úget_auth_headerz"AnthropicModelInfo.get_auth_header5  ss   € ô 1×<Ñ<¸WÓEˆØÐ#Ü% lÔ3Ø'¨7°<°.Ð)AÐBÐBÜ%×?Ñ?ÀÈhÐXrÓsÐsÜ.×=Ñ=Ó?ˆ
ØÐ!Ø# w¨z¨lÐ%;Ð<Ð<Ør5   c                 ó.   — | r| j                  dd«      S d S )Nú
anthropic/r/   )Úreplacer2   s    r3   rË   z!AnthropicModelInfo.get_base_modelK  s   € á27ˆu�}‰}˜\¨2Ó.ÐA¸TÐAr5   c                 óô  — t         j                  |«      }t         j                  ||«      }|�|€t        d«      ‚ddi}|j	                  |«       t
        j                  j                  |› d�|¬«      }	 |j                  «        |j                  «       d   }g }|D ]  }|d	   }	d
|	z   }
|j                  |
«       Œ |S # t        j                  $ r& t        d|j                  › d|j                  › �«      ‚w xY w)Nz©ANTHROPIC_API_BASE/ANTHROPIC_BASE_URL or ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN is not set. Please set the environment variable, to query Anthropic's `/models` endpoint.r3  r2  z
/v1/models)ÚurlrH   z4Failed to fetch models from Anthropic. Status code: z, Response: ÚdataÚidrS  )rs   rJ  rQ  Ú
ValueErrorr6  r¸   Úmodule_level_clientr^   Úraise_for_statusro   ÚHTTPStatusErrorrÌ   rc   r�   Újsonr  )rh   rI   r!  r_   rH   ÚresponseÚmodelsÚlitellm_model_namesr,   Ústripped_model_nameÚlitellm_model_names              r3   Ú
get_modelszAnthropicModelInfo.get_modelsO  s+  € Ü%×2Ñ2°8Ó<ˆÜ/×?Ñ?ÀÈÓRˆØÐ˜{Ð2Üð |óð ð .¨|Ð<ˆØ�‰�{Ô#Ü!×5Ñ5×9Ñ9Ø�*˜JÐ'Øð :ó 
ˆð
	Ø×%Ñ%Ô'ð !Ÿ™›¨Ñ/ˆà%'ÐØò 	;ˆEØ"'¨¡+ÐØ!-Ð0CÑ!CÐØ×&Ñ&Ð'9Õ:ð	;ð #Ð"øô ×$Ñ$ò 	ÜØFÀx×G[ÑG[ÐF\Ð\hÐiq×ivÑivÐhwÐxóð ð	ús   Á5B> Â>9C7c                 ó   — ddl m}  |«       S )z–
        Factory method to create an Anthropic token counter.

        Returns:
            AnthropicTokenCounter instance for this provider.
        r   )ÚAnthropicTokenCounter)Ú1litellm.llms.anthropic.count_tokens.token_counterre  )rh   re  s     r3   Úget_token_counterz$AnthropicModelInfo.get_token_counterm  s   € õ	
ñ %Ó&Ð&r5   rj   )NNFFF©F)NNNNFFFFFFFFFFNFFNF)NN)NNF)4rk   rl   rm   ry   r   rÚ   r{   r   r   rƒ   r   r   r‹   rŽ   r‘   r˜   rŸ   r£   Ústaticmethodr¯   r�   r	   r¼   rÁ   rÔ   r¬   rÝ   ræ   rê   rî   rñ   rô   r   Úobjectrú   r  r  r  r
  r  r   r$  r9  rB  rJ  r>  r?  rQ  rË   rc  r   rg  r‚   r5   r3   rs   rs   Š   ss  „ ð¨TÐ2BÑ-Cð Èó ð"!¨Ð-=Ñ(>ð !À4ó !ð¨dÐ3IÑ.JÈTÑ.Qð ÐVZó ð¨4Ð0GÑ+HÈ4Ñ+Oð ÐTWÐZ^ÑT^ó ð¨TÐ2IÑ-JÈTÑ-Qð ÐVZó ð
 DÐ)9Ñ$:ð 
¸tó 
ð¨°©ð ¸ó ð °t¸d±{ð Àtó ð4¨D°4©Kð ¸Dó ð8 ð
¨ð 
°ò 
ó ð
ð6 ðØðàðð ðð ð	ð
 ðð ðð 
òó ðð0 ð Sð ¨Sò ó ðð ð%<¨Cð %<°D¸±Iò %<ó ð%<ðN ð Sð ¨sð °t¸d±{ò ó ðð  ð:¨3ð :°Sð :¸TÀD¹[ò :ó ð:ð ð:°ð :¸3ð :ÐUXð :Ð]aÐdhÑ]hò :ó ð:ð& ðL¨#ð L°Cð LÈcð LÐVZò Ló ðLð0 ð	w¨3ð 	wÀSð 	wÈTò 	wó ð	wð ðo¨Cð oÀcð oÈdò oó ðoð ðu¨ð uÀ3ð uÈ4ò uó ðuð ð.Øð.à'¨¨V¨Ñ4ð.ð !ð.ð 
ò	.ó ð.ð, !ñ"à ™ð"ð �T‰zð"ð
 !ð"ð 
ó"ðH°¸±ð Àó ð¸TÀD¹[ð ÈTó ð 0ÀcÈDÁjð 0ÐUYÐZ]ÑU^ÐaeÑUeó 0ð

À3ð 
È3ó 
ð, (,Ø)-Ø#(Ø"Ø %ñ* àð* ð  ™ð* ð   $™Jð	* ð
 !ð* ð ð* ð ð* ð !ð* ð 
ˆc‰ó* ðX ñ&¨3ð &¸#À¹*ð &Ðbfð &Ðswò &ó ð&ð #Ø!%Ø(,Ø)-Ø#(ØØ"Ø %Ø%*Ø!&Ø/4Ø$)Ø!Ø"'Ø8<Ø).Ø+0Ø#Ø+0ñ)Tà�t‘ðTð ˜$‘JðTð  ™:ð	Tð
   $™JðTð !ðTð ðTð ðTð ðTð #ðTð ðTð )-ðTð "ðTð ðTð  ðTð  &*¨#¡Y°Ñ%5ð!Tð" #'ð#Tð$ %)ð%Tð& ˜‘*ð'Tð( %)ð)Tð* 
ó+Tðz #Ø#ñDàðDð ðDð Ð'Ñ(ð	Dð
 ðDð ðDð �t‘ðDð ˜‘*ðDð 
óDðL ñ
˜s T™zð 
°S¸4±Zò 
ó ð
ð ñ>˜S 4™Zð >°3¸±:ò >ó ð>ð
 ñD 3¨¡:ð D¸¸t¹ò Dó ðDð à"Ø#Ø+0ñØ�t‘ðà˜‘*ðð %)ðð 
�‰ò	ó ðð* ñB˜c D™jð B°C¸$±Jò Bó ðBñ# #¨¡*ð #¸sÀT¹zð #ÐUYÐZ]ÑU^ó #ð<'Ð#3°dÑ#:ô 'r5   rs   rt   Úreplace_with_textc                 óR  — | D �]   }t        |t        «      r|j                  d«      dk7  rŒ)|j                  d«      }t        |t        «      sŒKi }|D ]V  }t        |t        «      sŒ|j                  d«      dk(  sŒ)|j                  d«      dk(  sŒ>|j                  d«      }|sŒRd	||<   ŒX |sŒ«|rƒ|D ]~  }t        |t        «      sŒ|j                  d«      d
k(  sŒ)|j                  d«      |v sŒ=|j                  d«      xs d}t        |t        «      r|nt        d„ |D «       d«      }|||d   <   Œ€ g }	|D ]å  }t        |t        «      s|	j                  |«       Œ%|j                  d«      dk(  xr) |j                  d«      dk(  xr |j                  d«      |v }
|j                  d«      d
k(  xr |j                  d«      |v }|
rC|sŒ’|j                  |j                  d«      «      xs d}|sŒ¹|	j                  dd|› d�dœ«       ŒÒ|rŒÕ|	j                  |«       Œç |	|d<   �Œ# | S )aÝ  
    Remove (or replace) server_tool_use (name='advisor') and advisor_tool_result blocks
    from assistant message content.

    Prevents Anthropic 400 invalid_request_error: if advisor_tool_result blocks
    exist in history but the advisor tool is not in the tools array, the API rejects
    the request. This happens when the user has removed the advisor tool for cost
    control or on a follow-up turn.

    Args:
        messages: Conversation history to process (mutated in-place).
        replace_with_text: When True, replace the advisor exchange with an
            <advisor_feedback> text block so the executor retains the semantic
            context of what the advisor said.  When False (default), strip silently.
    ÚroleÚ	assistantrw   r†   Úserver_tool_userP   ÚadvisorrX  NÚadvisor_tool_resultÚtool_use_idr/   c              3   óŒ   K  — | ]<  }t        |t        «      sŒ|j                  d «      dk(  sŒ)|j                  dd«      –— Œ> y­w)r†   r�   r/   N)rx   r�   r^   )rO   rE   s     r3   rQ   z5strip_advisor_blocks_from_messages.<locals>.<genexpr>ª  s9   è ø€ Òo°1¼zÈ!ÌTÕ?RÐWX×W\ÑW\Ð]cÓWdÐhnÓWn˜QŸU™U 6¨2×.Ñoùs   ‚A˜A­Ar�   z<advisor_feedback>
z
</advisor_feedback>)r†   r�   )rx   r�   r^   ry   r   rZ   r  )rt   rk  re   rw   Úadvisor_id_to_textÚblockÚbidÚrawr�   Únew_contentÚis_advisor_useÚis_advisor_resultÚadvices                r3   Ú"strip_advisor_blocks_from_messagesr|  {  sb  € ð  ó B)ˆÜ˜'¤4Ô(¨G¯K©K¸Ó,?À;Ò,NØØ—+‘+˜iÓ(ˆÜ˜'¤4Ô(Øð $&ÐØò 	3ˆEÜ˜%¤Õ&¨5¯9©9°VÓ+<Ð@QÓ+QÐV[×V_ÑV_Ð`fÓVgÐktÓVtØ—i‘i “o�ÚØ.2Ð& sÒ+ð		3ñ "Øñ Ø ò D�ä˜u¤dÕ+ØŸ	™	 &Ó)Ð-BÓBØŸ	™	 -Ó0Ð4FÒFàŸ)™) IÓ.Ò4°"�Cô & c¬3Ô/ñ ä!Ùo¸ÔoØóð ð @DÐ& u¨]Ñ';Ò<ðDð" ˆØò 	*ˆEÜ˜e¤TÔ*Ø×"Ñ" 5Ô)Øà—	‘	˜&Ó!Ð%6Ñ6ò :Ø—I‘I˜fÓ%¨Ñ2ò:à—I‘I˜d“OÐ'9Ð9ð ð —	‘	˜&Ó!Ð%:Ñ:Òm¸u¿y¹yÈÓ?WÐ[mÐ?mð ñ Ú$Ø/×3Ñ3°E·I±I¸d³OÓDÒJÈ�FÚØ#×*Ñ*à(.Ø*>¸v¸hÐF[Ð(\ñõñ #Øà×"Ñ" 5Õ)ð5	*ð8 )ˆ�	ÓðEB)ðF €Or5   Ú
error_textc                 óT   — | sy| j                  «       }d|vryd|v r	d|v sd|v ryd|v S )aü  
    Detect Anthropic 400 errors caused by invalid thinking blocks in replayed
    history: a missing or invalid signature, or a block with empty thinking text.

    Known error formats:
    {"message":"messages.2.content.0.thinking.signature.str: Input should be a valid string"}
    messages.N.content.M.thinking.signature.str: Input should be a valid string
    messages.N.content.M: Invalid `signature` in `thinking` block
    messages.N.content.M.thinking: each thinking block must contain thinking
    Frö   Ú	signatureÚinvalidzvalid stringTzmust contain thinkingrM   )r}  rN   s     r3   Ú)is_anthropic_invalid_thinking_block_errorr�  Ñ  sG   € ñ ØØ×#Ñ#Ó%€EØ˜ÑØØ�eÑ ¨eÑ!3°~ÈÑ7NØØ" eÐ+Ð+r5   c                 ój  — g }| D ]¦  }t        |t        «      s|j                  |«       Œ%t        j                  |«      }|j                  d«      }t        |t        «      r;|D �cg c](  }t        |t        «      r|j                  d«      dv rŒ'|‘Œ* }}|sŒ‘||d<   |j                  |«       Œ¨ |S c c}w )a5  
    Return a new message list with thinking / redacted_thinking content blocks removed
    from each message. Used to recover from invalid thinking signatures on retry.

    Messages whose content is a list and becomes empty after stripping are omitted,
    since Anthropic rejects empty content arrays.
    rw   r†   )rö   Úredacted_thinking)rx   r�   r  ÚcopyÚdeepcopyr^   ry   )rt   ÚoutÚmÚmmrw   rE   Úfiltereds          r3   Ú-strip_thinking_blocks_from_anthropic_messagesrŠ  æ  s±   € ð €CØò ˆÜ˜!œTÔ"Ø�J‰J�qŒMØÜ�]‰]˜1ÓˆØ—&‘&˜Ó#ˆÜ�gœtÔ$à"öØ¬:°a¼Ô+>À1Ç5Á5ÈÃ=ÐTuÒCu’ðˆHð ñ ØØ$ˆBˆy‰MØ�
‰
�2�ðð €Jùòs   Á$(B0ÂB0rW  c                 ó†   — | j                  d«      }t        |t        «      rt        |«      | d<   | j	                  dd«       y)z¥
    Mutate an Anthropic Messages-style request dict: strip thinking blocks from
    ``messages`` and remove the top-level ``thinking`` extended-thinking param.
    rt   rö   N)r^   rx   ry   rŠ  r]   )rW  Úmsgss     r3   Ú:strip_thinking_blocks_from_anthropic_messages_request_dictr�     s9   € ð —(‘(˜:Ó&€DÜ�$œÔÜHÈÓNˆˆZÑØ‡H�HˆZ˜Õr5   c                 ó‚  — g }| D ]²  }t        |t        «      rt        |j                  d«      t        «      s|j	                  |«       ŒD|d   }|D �cg c]  }t        |«      rŒt        |«      rŒ|‘Œ }}t        |«      t        |«      k(  r|j	                  |«       Œ™|sŒœ|j	                  i |¥d|i¥«       Œ´ |S c c}w )a  
    Return a new message list with empty or whitespace-only ``{"type": "text"}``
    and ``{"type": "thinking"}`` content blocks removed.

    Anthropic's API rejects requests containing such blocks with
    ``"messages: text content blocks must be non-empty"`` and
    ``"messages.N.content.M.thinking: each thinking block must contain
    thinking"`` respectively.  Assistant messages routinely arrive with
    ``{"type": "text", "text": ""}`` alongside ``tool_use`` blocks (see
    anthropics/anthropic-sdk-python#461), and a turn served by a
    non-Anthropic reasoning model through the /v1/messages bridge can carry
    ``{"type": "thinking", "thinking": ""}`` when the model produced no
    reasoning text (e.g. it went straight to parallel tool calls).
    Multi-turn tool-use clients (e.g. Claude Code) loop these prior responses
    back as conversation history, which then causes the next request to 400
    on the unified ``/v1/messages`` path.  ``/v1/chat/completions`` already
    handles this in ``anthropic_messages_pt``; this helper provides the
    equivalent guarantee for the native Anthropic Messages path.
    ``redacted_thinking`` blocks are never touched: they carry opaque
    ``data`` instead of thinking text.

    Messages whose content is a list and becomes empty after stripping are
    omitted, matching :func:`strip_thinking_blocks_from_anthropic_messages`.
    The caller's list and its content blocks are never mutated; modified
    messages are returned as shallow copies with a fresh content list.
    rw   )rx   r�   r^   ry   r  Ú_is_empty_text_blockÚis_empty_thinking_blockr}   )rt   r†  r‡  rw   rE   r‰  s         r3   Ú2strip_empty_content_blocks_from_anthropic_messagesr‘    s³   € ð: €CØò 	3ˆÜ˜!œTÔ"¬*°Q·U±U¸9Ó5EÄtÔ*LØ�J‰J�qŒMØØ�I‘,ˆØ&Öi˜!Ô.BÀ1Õ.EÔNeÐfgÕNh’AÐiˆÐiÜˆx‹=œC ›LÒ(Ø�J‰J�q�MÚØ�J‰JÐ1˜!Ð1˜Y¨Ñ1Õ2ð	3ð €Jùò js   ÁB<Á#B<Á/B<ru  c                 ó¶   — t        | t        «      r| j                  d«      dk7  ry| j                  d«      }t        |t        «       xs |j	                  «        S )Nr†   r�   F©rx   r�   r^   r   rA   )ru  r�   s     r3   r�  r�  8  sK   € Ü�eœTÔ" e§i¡i°Ó&7¸6Ò&AØØ—)‘)˜FÓ#€DÜ˜$¤Ó$Ð$Ò8¨D¯J©J«LÐ(8Ð8r5   c                 ó¶   — t        | t        «      r| j                  d«      dk7  ry| j                  d«      }t        |t        «       xs |j	                  «        S )aœ  
    True for a ``{"type": "thinking"}`` content block whose thinking text is
    missing, not a string, or empty/whitespace-only after ``.strip()``.
    Anthropic rejects such blocks with ``"each thinking block must contain
    thinking"`` (whitespace-only included, verified live), regardless of any
    signature they carry.  ``redacted_thinking`` blocks are a different type
    and always return False.
    r†   rö   Fr“  )ru  rö   s     r3   r�  r�  ?  sN   € ô �eœTÔ" e§i¡i°Ó&7¸:Ò&EØØ—i‘i 
Ó+€HÜ˜(¤CÓ(Ð(Ò@°·±Ó0@Ð,@Ð@r5   c                 ó^   — t        | t        «      rt        | «      sy| j                  d«       S )a¸  
    True for an empty ``{"type": "thinking"}`` block carrying no signature.

    The emit-side predicate: response paths drop a thinking block only when it
    holds nothing the client could need.  A signature-only block is a real
    provider response (Bedrock Converse under adaptive thinking emits a
    reasoning block with empty text and only a signature) and the client needs
    the signature to replay reasoning across tool-use turns, so it must be
    emitted.  Request paths keep using :func:`is_empty_thinking_block`:
    Anthropic rejects empty thinking blocks in request history regardless of
    signature, and the inbound strip self-heals a replayed signature-only
    block.
    Fr  )rx   r�   r�  r^   ©ru  s    r3   Ú is_empty_unsigned_thinking_blockr—  N  s+   € ô �eœTÔ"Ô*AÀ%Ô*HØØ�y‰y˜Ó%Ð%Ð%r5   Úraw_idc                 ó‚   — t         | v r| j                  t         d«      d   n| }t        j                  dd|«      }|xs dS )zí
    Normalize a tool_use / tool_result id for Anthropic's ``^[a-zA-Z0-9_-]+$``
    pattern.

    Strips Gemini thought-signature suffixes (``__thought__``) first, then
    replaces any remaining invalid characters with underscores.
    r¶   r   z[^a-zA-Z0-9_-]rå   rr  )r   r@   Úrer1   )r˜  Úbase_idÚ	sanitizeds      r3   Únormalize_anthropic_tool_use_idr�  a  sE   € ô B]Ð`fÑAfˆf�l‰lÔ6¸Ó:¸1Ò=Ðlr€GÜ—v‘vÐ/°°gÓ>€IØÒ%˜Ð%r5   c                 óF  — t        | t        «      s| S | j                  d«      }|dv r;| j                  d«      }t        |t        «      rt	        |«      }||k7  ri | ¥d|i¥S | S |dk(  r9| j                  d«      }t        |t        «      rt	        |«      }||k7  ri | ¥d|i¥S | S )Nr†   )Útool_usero  rX  Útool_resultrr  )rx   r�   r^   r   r�  )ru  Ú
block_typer˜  rÓ   s       r3   Ú#_sanitize_tool_use_id_content_blockr¢  n  sµ   € Ü�eœTÔ"ØˆØŸ	™	 &Ó)€JØÐ4Ñ4Ø—‘˜4“ˆÜ�fœcÔ"Ü8¸Ó@ˆJØ˜VÒ#Ø2˜%Ð2  zÑ2Ð2ð €Lð 
�}Ò	$Ø—‘˜=Ó)ˆÜ�fœcÔ"Ü8¸Ó@ˆJØ˜VÒ#Ø;˜%Ð; °
Ñ;Ð;Ø€Lr5   c                 ó:  — g }| D ]Ž  }t        |t        «      rt        |j                  d«      t        «      s|j	                  |«       ŒD|d   }|D �cg c]  }t        |«      ‘Œ }}||k(  r|j	                  |«       Œx|j	                  i |¥d|i¥«       Œ� |S c c}w )uñ  
    Return a new message list with ``tool_use`` / ``server_tool_use`` ``id`` and
    ``tool_result`` ``tool_use_id`` values rewritten to satisfy Anthropic's
    ``^[a-zA-Z0-9_-]+$`` requirement.

    Cross-provider clients (e.g. Claude Code routed through kimi) may replay
    conversation history containing ids like ``functions.Bash:0`` with ``.``
    and ``:`` â€” valid on the upstream provider but rejected by Anthropic when
    the session is switched to a native Anthropic deployment.
    rw   )rx   r�   r^   ry   r  r¢  )rt   r†  r‡  rw   rE   rx  s         r3   Ú+sanitize_tool_use_ids_in_anthropic_messagesr¤  �  s�   € ð €CØò 	6ˆÜ˜!œTÔ"¬*°Q·U±U¸9Ó5EÄtÔ*LØ�J‰J�qŒMØØ�I‘,ˆØGNÖOÀ!Ô:¸1Õ=ÐOˆÐOØ˜'Ò!Ø�J‰J�q�Mà�J‰JÐ4˜!Ð4˜Y¨Ñ4Õ5ð	6ð €Jùò Ps   ÁBc                   ó.   — e Zd ZU  ed¬«      ZdZeed<   y)Ú_ReplayedSearchQueryÚallow©Úextrar/   ÚqueryN)rk   rl   rm   r   Úmodel_configrª  r   Ú__annotations__r‚   r5   r3   r¦  r¦  š  s   … Ù GÔ,€Là€Eˆ3„Or5   r¦  c                   óh   — e Zd ZU  ed¬«      Zed   ed<   dZeed<   dZ	eed<   dZ
eed<   dZeed	<   y
)Ú_ReplayedWebSearchResultr§  r¨  Úweb_search_resultr†   r/   rV  ÚtitleÚsnippetÚencrypted_contentN)rk   rl   rm   r   r«  r   r¬  rV  r   r°  r±  r²  r‚   r5   r3   r®  r®     s?   … Ù GÔ,€Là
Ð%Ñ
&Ó&Ø€CˆƒMØ€Eˆ3ƒOØ€GˆSÓØÐ�sÔr5   r®  c                   óN   — e Zd ZU  ed¬«      Zed   ed<   eed<   ee	df   ed<   y)	Ú_ReplayedWebSearchToolResultr§  r¨  Úweb_search_tool_resultr†   rr  .rw   N)
rk   rl   rm   r   r«  r   r¬  r   r\   r®  r‚   r5   r3   r´  r´  ª  s/   … Ù GÔ,€Là
Ð*Ñ
+Ó+ØÓØÐ+¨SÐ0Ñ1Ô1r5   r´  c                   óR   — e Zd ZU  ed¬«      Zed   ed<   eed<    e«       Z	eed<   y)Ú_ReplayedServerToolUser§  r¨  ro  r†   rX  ÚinputN)
rk   rl   rm   r   r«  r   r¬  r   r¦  r¸  r‚   r5   r3   r·  r·  ²  s+   … Ù GÔ,€Là
Ð#Ñ
$Ó$ØƒGÙ"6Ó"8€EÐÔ8r5   r·  c                   ó,   — e Zd ZU dZed   ed<   eed<   y)Ú
_TextBlockr�   r†   N)rk   rl   rm   r†   r   r¬  r   r‚   r5   r3   rº  rº  º  s   … Ø"€Dˆ'�&‰/Ó"Ø
„Ir5   rº  Ú_WEB_SEARCH_TOOL_RESULT_ADAPTERÚ_SERVER_TOOL_USE_ADAPTERc                 óŠ   — 	 t         j                  | «      }t        d„ |j                  D «       «      ry|S # t        $ r Y yw xY w)aá  
    The parsed block when it is a ``web_search_tool_result`` carrying no
    ``encrypted_content``, else None for anything Anthropic itself issued.

    An empty ``content`` list is flattenable too. It is what the interceptor emits
    when a search legitimately returns nothing and when a search raises, and it
    carries neither evidence to preserve nor an ``encrypted_content`` to respect,
    so leaving it in place only buys the 400 this whole function exists to avoid.
    Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wrj   )r²  ©rO   Úresults     r3   rQ   z6_flattenable_web_search_tool_result.<locals>.<genexpr>Ñ  s   è ø€ Ò
A¨ˆ6×#Õ#Ñ
Aùs   ‚)r»  Úvalidate_pythonr   r­   rw   )ru  Úparseds     r3   Ú#_flattenable_web_search_tool_resultrÃ  Ã  sG   € ðÜ7×GÑGÈÓNˆô Ñ
A°&·.±.Ô
AÔAØØ€Møô	 ò Ùðús   ‚6 ¶	AÁAc                 óL   — 	 t         j                  | «      S # t        $ r Y y w xY wrj   )r¼  rÁ  r   r–  s    r3   Ú_replayed_server_tool_userÅ  Ö  s*   € ðÜ'×7Ñ7¸Ó>Ð>øÜò Ùðús   ‚ —	#¢#rª  Úresults.c                 ój   — | rd| › d�nd}|s|› d�S dj                  d„ |D «       «      }|r|› d|› �S |S )NzWeb search results for 'z':zWeb search results:z

No results were returned.z

c              3   óô   K  — | ]p  }d j                  d„ |j                  rd|j                  › �nd|j                  rd|j                  › �nd|j                  rd|j                  › �ndfD «       «      –— Œr y­w)ú
c              3   ó$   K  — | ]  }|r|–— Œ
 y ­wrj   r‚   )rO   Úlines     r3   rQ   z7_render_web_search_results.<locals>.<genexpr>.<genexpr>â  s   è ø€ ò 
àñ
 ô ñ
ùs   ‚zTitle: r/   zURL: z	Snippet: N)rC   r°  rV  r±  r¿  s     r3   rQ   z-_render_web_search_results.<locals>.<genexpr>á  sw   è ø€ ò ð ð 	�	‰	ñ 
ð -3¯LªL�'˜&Ÿ,™,˜Ñ(¸bØ(.¯
ª
�%˜Ÿ
™
�|Ñ$¸Ø06·²�)˜FŸN™NÐ+Ñ,ÀBðô
÷ 	
ñùs   ‚A6A8)rC   )rª  rÆ  ÚheaderÚbodys       r3   Ú_render_web_search_resultsrÎ  Ý  s^   € Ù<AÐ.¨u¨g°RÑ8ÐG\€FÙØ�Ð6Ð7Ð7Ø—+‘+ñ ð ôó €Dñ %)ˆfˆX�T˜$˜Ð Ð4¨fÐ4r5   ÚflattenableÚqueriesc                 óè   — t        | «      }|�Ht        t        |j                  |j                  d«      |j
                  «      ¬«      j                  «       S t        | «      }|�|j                  |v ry | S )Nr/   )r�   )	rÃ  rº  rÎ  r^   rr  rw   Ú
model_dumprÅ  rX  )ru  rÏ  rÐ  Úparsed_resultÚ
parsed_uses        r3   Ú"_rewrite_replayed_web_search_blockrÕ  ð  sp   € ô
 ?¸uÓE€MØÐ ÜÜ+¨G¯K©K¸×8QÑ8QÐSUÓ,VÐXe×XmÑXmÓnô
ç
‰*‹,ð	ô 2°%Ó8€JØÐ *§-¡-°;Ñ">ØØ€Lr5   re   c                 óô  ‡‡— t        | t        «      rt        | j                  d«      t        «      s| S | d   }t        |t        «      r| S t        d„ |D «       D �ci c]  }|�|j                  |“Œ c}«      Š‰s| S t        d„ |D «       D �ci c]%  }|�!|j                  |j                  j                  “Œ' c}«      Št        ˆˆfd„|D «       «      }i | ¥d|D �cg c]  }|€Œ|‘Œ	 c}i¥S c c}w c c}w c c}w )Nrw   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrj   )rÃ  ©rO   ru  s     r3   rQ   z9_flatten_web_search_results_in_message.<locals>.<genexpr>	  s   è ø€ Ò[È%Ô>¸u×EÑ[ùó   ‚c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrj   )rÅ  rØ  s     r3   rQ   z9_flatten_web_search_results_in_message.<locals>.<genexpr>  s   è ø€ ÒQÀÔ4°U×;ÑQùrÙ  c              3   ó8   •K  — | ]  }t        |‰‰«      –— Œ y ­wrj   )rÕ  )rO   ru  rÏ  rÐ  s     €€r3   rQ   z9_flatten_web_search_results_in_message.<locals>.<genexpr>  s   øè ø€ ÒrÐafÔ?ÀÀ{ÐT[×\Ñrùs   ƒ)rx   r   r^   r   r   r   rr  rX  r¸  rª  r\   )re   rw   rÂ  Ú	rewrittenrE   rÏ  rÐ  s        @@r3   Ú&_flatten_web_search_results_in_messagerÝ     s  ù€ Ü�gœwÔ'¬z¸'¿+¹+ÀiÓ:PÔRZÔ/[ØˆØ˜YÑ'€GÜ�'œ3ÔØˆÜ)ñ \ÐSZÔ[ö	
àØÐ!ð ×Ñ Ñ&ò	
ó€Kñ ØˆÜ%ñ RÈÔQö	
àØÐ!ð �I‰I�v—|‘|×)Ñ)Ñ)ò	
ó€Gô ÔrÐjqÔrÓr€IØJˆgÐJ�y¨iÖ"I¨¸1¹=¢1Ò"IÑJÐJùò!	
ùò	
ùò #Js   ÁC+Â*C0ÃC5Ã"C5c                 ó>   — | D �cg c]  }t        |«      ‘Œ c}S c c}w )a£  
    Return a new message list with replayed ``web_search_tool_result`` blocks that
    carry no ``encrypted_content`` rewritten into plain ``text`` blocks holding the
    same title / url / snippet evidence.

    ``encrypted_content`` is an opaque blob only Anthropic's own search backend can
    mint, so blocks synthesized by LiteLLM (websearch interception against a search
    provider) are rejected with ``Invalid encrypted_content in search_result block``
    when a native client loops them back as history. Flattening them keeps the
    evidence in the conversation instead of 400ing the follow-up turn, and leaves
    genuine Anthropic-issued blocks untouched.
    )rÝ  )rt   r‡  s     r3   Ú<flatten_unencrypted_web_search_results_in_anthropic_messagesrß    s    € ð @HÖH¸!Ô2°1Õ5ÒHÐHùÒHs   …c                 óè   — i }d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d<   | j                  «       D ��ci c]  \  }}d	j                  d
|«      |“Œ }}}i |¥|¥}|S c c}}w )Nz"anthropic-ratelimit-requests-limitzx-ratelimit-limit-requestsz&anthropic-ratelimit-requests-remainingzx-ratelimit-remaining-requestsz anthropic-ratelimit-tokens-limitzx-ratelimit-limit-tokensz$anthropic-ratelimit-tokens-remainingzx-ratelimit-remaining-tokensz{}-{}r=  )r[   Úformat)rH   Úopenai_headersÚkr§   Úllm_response_headersÚadditional_headerss         r3   Úprocess_anthropic_headersræ  ,  s¹   € Ø€NØ+¨wÑ6Ø7>Ð?cÑ7dˆÐ3Ñ4Ø/°7Ñ:Ø;BÐCkÑ;lˆÐ7Ñ8Ø)¨WÑ4Ø5<Ð=_Ñ5`ˆÐ1Ñ2Ø-°Ñ8Ø9@ÐAgÑ9hˆÐ5Ñ6àT[×TaÑTaÓTc×"dÉDÈAÈq 7§>¡>°.À!Ó#DÀaÑ#GÐ"dÐÑ"dà JÐ#7Ð J¸>Ð JÐØÐùó #es   ÁA.Ú
created_atc                 ó\   — d| d   | d   || j                  d«      | j                  d«      dœS )Nr,   rX  Úmax_input_tokensÚmax_output_tokens)r†   rX  Údisplay_namerç  ré  Ú
max_tokensr•   )r,   rç  s     r3   Ú_anthropic_model_entryrí  =  s:   € àØ�D‰kØ˜d™Ø Ø!ŸI™IÐ&8Ó9Ø—i‘iÐ 3Ó4ñð r5   r_  c                 ó  — t        j                  t        t        j                  ¬«      j                  «       j                  dd«      }| D �cg c]  }t        ||«      ‘Œ }}|d| r| d   d   nd| r
| d   d   d	œS dd	œS c c}w )
aÒ  Build the Anthropic-native /v1/models envelope.

    Clients that send an anthropic-version header parse the Anthropic Models API
    shape (type/display_name/created_at plus has_more/first_id/last_id) and filter
    the list themselves, so every model is returned here. The token limits carry
    over from the OpenAI-shaped listing, named as the Messages API names them, and
    are always present because the vendor shape declares them nullable, not optional
    )Útzz+00:00ÚZFr   rX  Néÿÿÿÿ)rW  Úhas_moreÚfirst_idÚlast_id)r   Úfromtimestampr   r   ÚutcÚ	isoformatrT  rí  )r_  rç  r,   rW  s       r3   Ú$create_anthropic_model_list_responserø  H  sŸ   € ô 	×ÑÔ<ÄÇÁÔN×XÑXÓZ×bÑbÐckÐmpÓqð ð @FöØ6;Ô˜u jÕ1ð€Dð ð ØÙ'-�F˜1‘I˜d’O°4Ù'-�6˜"‘:˜dÑ#ñ	ð ð 48ñ	ð ùòs   ÁA>rh  )[Ú__doc__r„  rš  Úcollections.abcr   r   r   r   r   Útypesr   Útypingr	   r
   r   ro   Úpydanticr   r   r   r   r¸   Úlitellm.constantsr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú3litellm.litellm_core_utils.prompt_templates.factoryr   Ú litellm.llms.base_llm.base_utilsr   r   Ú)litellm.llms.base_llm.chat.transformationr   r  r   r   r   r   r   Úlitellm.types.llms.openair   Ú!litellm.types.proxy.model_listingr   r   r¬  r'   Úcompiler(   r)   r*   r+   r   r4   rÚ   r;   rG   r�   r\   r`   rb   rs   ry   r|  r�  rŠ  r�  r‘  r�  rj  r�  r—  r�  r¢  r¤  r¦  r®  r´  r·  rº  r»  r¼  rÃ  rÅ  rÎ  rÕ  rÝ  rß  rp   ræ  rí  rø  r‚   r5   r3   ú<module>r     s8  ðòó Û 	ß =Ñ =ß 'Ý "ß &Ñ &ã ß HÓ Hã Ý ;õõ÷ PÝ F÷õ õ 7Ý ?ðNð  ó ñ *:à!$Ø #ØØØØØØñ	ó*Ð  ó ð %/ B§J¡JÐ/AÓ$BÐ ˜EÓ BØ%/ R§Z¡Z°Ó%9Ð ˜UÓ 9Ø", "§*¡*¨ZÓ"8Ð ˜%Ó 8Ø&˜BŸJ™J }Ó5Ð �EÓ 5ð	 cð 	¨có 	ð: #¨¡*ð :°ó :ð# #¨¡*ð #¸ð #Àó #ð!¨tð !¸cÀD¹jð !ÈUÐSWÐY\Ð_cÑYcÐScÑMdó !ôHTÐ%ô Tôn'Ð)ô n'ñbS°°c±ð SÈtð SÐ`dÐehÑ`ió Sðl,¸#ð ,À$ó ,ð*¸DÀ¹Ið È$ÈsÉ)ó ð4
Ø
ˆs�Cˆx‰.ð
à	ó
ð(Ø�3‰ið(à	ˆ#�Yó(ðV9 ð 9¨ó 9ðA 6ð A¨dó Að&¨Fð &°tó &ð&
&¨Cð 
&°Có 
&ð¨sð °só ð&¸$¸s¹)ð ÈÈSÉ	ó ô2˜9ô ô ˜yô  ô2 9ô 2ô9˜Yô 9ô�ô ñ
 *5Ð5QÓ)RÐ  Ó RÙ"-Ð.DÓ"EÐ ˜%Ó Eð¨vð Ð:VÐY]Ñ:]ó ð& Vð Ð0FÈÑ0Mó ð5 cð 5°EÐ:RÐTWÐ:WÑ4Xð 5Ð]`ó 5ð&Øðà˜Ð:Ð:Ñ;ðð �S˜#�XÑðð ˆd�]ó	ð K°Fð K¸vó Kð4IØ�3‰iðIà	ˆ#�YóIð$ u§}¡}°tÑ';ð Àó ð"Ð"3ð Àð ÈÐQTÐV\ÐQ\ÑI]ó ð°Ð:KÑ1Lð ÐQXÐY\Ð^dÐYdÑQeô r5   