
    ijb              	       4   d Z ddlmZmZmZmZ ddlZddl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	ee   d
efdZdee   ded
efdZdedee   d
eeee   f   fdZ G d de      Z G d de      Zdeej@                  ef   d
efdZ!y)z6
This file contains common utils for anthropic calls.
    )DictListOptionalUnionN)get_file_ids_from_messages)BaseLLMModelInfoBaseTokenCounter)BaseLLMException)ANTHROPIC_HOSTED_TOOLSANTHROPIC_OAUTH_BETA_HEADERANTHROPIC_OAUTH_TOKEN_PREFIXAllAnthropicToolsValuesAnthropicMcpServerTool)AllMessageValuesvaluereturnc                 ^    | y| j                  d      r| dd } | j                  t              S )zACheck if a value contains an Anthropic OAuth token (sk-ant-oat*).NFBearer    )
startswithr   )r   s    t/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/common_utils.pyis_anthropic_oauth_keyr      s5    }	"ab	899    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       r   _merge_beta_headersr%   #   s\     (s 3A 31qwwyQWWY 3EA	IIh88F5M"" Bs
   A-A-headersapi_keyc                    | j                  dd      }|rg|j                  dt               rO|j                  dd      }| j	                  dd       t        | j                  d      t              | d<   d| d<   | |fS |rV|j                  t              rA| j	                  dd       d| | d<   t        | j                  d      t              | d<   d| d<   | |fS )	aQ  
    Handle Anthropic OAuth token detection and header setup.

    If an OAuth token is detected in the Authorization header, 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)
    authorization r   	x-api-keyNanthropic-betatrue)anthropic-dangerous-direct-browser-access)getr   r   replacepopr%   r   )r&   r'   auth_headers      r   !optionally_handle_anthropic_oauthr3   ,   s    " ++or2K{--8T7U.VW%%i4K&$7KK()+F%
 ! @F;<7%%&BCK&%,WI#6 $7KK()+F%
 ! @F;<Gr   c                   F     e Zd Z	 ddedeej                     f fdZ xZS )AnthropicErrorstatus_coder&   c                 *    t         |   |||       y )N)r6   messager&   )super__init__)selfr6   r8   r&   	__class__s       r   r:   zAnthropicError.__init__R   s     	['7Sr   N)	__name__
__module____qualname__intr   httpxHeadersr:   __classcell__)r<   s   @r   r5   r5   Q   s1    
 ,0	TT %--(	T Tr   r5   c            %          e Zd Zdee   defdZdee   defdZdeee	      defdZ
deee      dee   fdZdeee      defd	Zdee   defd
Zdee   defdZdee   defdZdee   defdZededefd       Z	 d7dee   dee   defdZdee   defdZdee   defdZdee   deee      fdZdedefdZ	 	 	 	 	 d8dedee   dee   dedededee   fdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9dee   dee   d ee   dee   ded!ededed"ed#ed$ed%ed&ed'ed(eee      d)ed*edef$d+Z	 	 d:d,ededee   ded-edee   d.ee   defd/Zed7d.ee   dee   fd0       Zed7dee   dee   fd1       Z ed7dee   dee   fd2       Z!ed7dee   dee   fd3       Z"ed7dee   dee   fd4       Z#	 d:dee   d.ee   dee   fd5Z$dee%   fd6Z&y);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)r;   rG   r8   _message_contentrJ   s        r   is_cache_control_setz'AnthropicModelInfo.is_cache_control_set\   s[      G{{?D1=&{{95+
;KT0R/G&'1#  0   r   c                 4    t        |      }t        |      dkD  S )z`
        Return if {"source": {"type": "file", "file_id": ..}} in message content block
        r   )r   len)r;   rG   file_idss      r   is_file_id_usedz"AnthropicModelInfo.is_file_id_usedm   s     .h78}q  r   mcp_serversc                     |y|ryy)NFT )r;   rS   s     r   is_mcp_server_usedz%AnthropicModelInfo.is_mcp_server_usedt   s     r   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   r;   rW   tools      r   is_computer_tool_usedz(AnthropicModelInfo.is_computer_tool_used}   s=     =D~$v,"9"9+"FF|#  r   c                 ~    |y|D ]5  }d|v s|d   j                  t        j                  j                        s5 y y)z'Returns True if web_search tool is usedFrY   T)r   r   
WEB_SEARCHr   r[   s      r   is_web_search_tool_usedz*AnthropicModelInfo.is_web_search_tool_used   sG     =D~$v,"9"9&1177# 	 
 r   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.

        rJ   rY   textTF)rK   rL   )r;   rG   r8   rJ   s       r   is_pdf_usedzAnthropicModelInfo.is_pdf_used   sZ    
  GW$I&2wy148&y1G(WV_-F#  2   r   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.
        FrY   r*   )tool_search_tool_regex_20251119tool_search_tool_bm25_20251119Tr/   r;   rW   r\   	tool_types       r   is_tool_search_usedz&AnthropicModelInfo.is_tool_search_used   s;     D,I     r   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/   rK   rL   dict)r;   rW   r\   rl   rn   function_allowed_callerss         r   !is_programmatic_tool_calling_usedz4AnthropicModelInfo.is_programmatic_tool_calling_used   s     D"hh'8$?O:ot#D,? xx
B/H(D)+3<<8I4+P(+
,d1 14LL# " r   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   Trn   )r/   rK   rL   rP   ro   )r;   rW   r\   rs   rn   function_input_exampless         r   is_input_examples_usedz)AnthropicModelInfo.is_input_examples_used   s     D!XX&6=N~t4'!+ xx
B/H(D)*2,,7G*N'+"#:DA34q8' * r   modelc                 L    | j                         t        fddD              S )zBCheck if the model is a Claude 4.6 model (Opus 4.6 or Sonnet 4.6).c              3   &   K   | ]  }|v  
 y wr=   rU   ).0vmodel_lowers     r   	<genexpr>z:AnthropicModelInfo._is_claude_4_6_model.<locals>.<genexpr>   s"      
	 	s   )zopus-4-6opus_4_6zopus-4.6zopus_4.6z
sonnet-4-6
sonnet_4_6z
sonnet-4.6z
sonnet_4.6)lowerany)rv   r{   s    @r   _is_claude_4_6_modelz'AnthropicModelInfo._is_claude_4_6_model   s,     kkm 
	
 
 	
r   Noptional_paramsc                 T   |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   r   r/   rK   strro   )r;   r   rv   r   r   r   s         r   is_effort_usedz!AnthropicModelInfo.is_effort_used  s      T..u5 jEKKM1Z5;;=5P.223EFJ/?$E (++O<Zt<"&&x0F*VS1r   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".
        FrY   r*   rm   Trg   rh   s       r   is_code_execution_tool_usedz.AnthropicModelInfo.is_code_execution_tool_used#  s5     D,I55  r   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/   rK   ro   rL   rP   )r;   r   r   r   s       r   is_container_with_skills_usedz0AnthropicModelInfo.is_container_with_skills_used2  sP     #''4	It4]]8,F*VT2s6{Qr   anthropic_beta_headerc                 *    |y |j                  d      S )Nr   )r   )r;   r   s     r    _get_user_anthropic_beta_headersz3AnthropicModelInfo._get_user_anthropic_beta_headersB  s     !($**3//r   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_20241022rg   )r;   r   computer_tool_beta_mappings      r   get_computer_tool_beta_headerz0AnthropicModelInfo.get_computer_tool_beta_headerI  s-     ";!:&
" *--!#<
 	
r   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files-api-2025-04-14code-execution-2025-05-22mcp-client-2025-04-04)litellm.types.llms.anthropicr   r   appendr   rL   set)r;   rv   r   r   r   r   r   r   r$   effort_usedbeta_headers              r   get_anthropic_beta_listz*AnthropicModelInfo.get_anthropic_beta_list[  s     	N ))/5ALL56<<=OPKLL% LL/0LL45LL01CJr   r'   
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                    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               n|r|s	d| |d<   n|r||d<   ||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-typer   r)   r-   r.   r+   T)ANTHROPIC_BETA_HEADER_VALUESr,   r   )r   r   r    r   r   r   r   r   r   updater   WEB_SEARCH_2025_03_05r   rP   r!   )r;   r'   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r   r   r   	_is_oauthr&   r   s                            r   get_anthropic_headersz(AnthropicModelInfo.get_anthropic_headers  s   (  <<=OPKIIk" II,-II12II-.=ATVII78 QII23 $II12 &II)*P 2 23O P	!2!Bl(.

 )0	':GO$CIG?@II12)0'=GO$#*GK &2LL45 $#U 1FFLL $  Z!^(+G$%r   r&   litellm_paramsapi_basec                 Z   t        ||      \  }}t        j                  |      }d }|t        j                         }||t	        j
                  dd|      |j                  d      }	| j                  |      }
| j                  |	      }| j                  |j                  d      	      }| j                  |      }| j                  |      }| j                  |	      }| j                  |	      }| j                  |	      }| j                  |	      }| j!                  ||
      }| j#                  |	      }| j%                  |      }| j'                  |j                  d            }| j)                  ||
||||||j                  dd      ||||||||      }i ||}|S )N)r&   r'   zMissing 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)r8   llm_providerrv   rW   )rG   )rW   rS   )rS   )r   rv   )r   r,   )r   r   F)r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   r   )r3   rF   get_api_keyget_auth_tokenlitellmAuthenticationErrorr/   rN   r]   rV   rc   rR   r`   rj   rq   ru   r   r   r   r   r   )r;   r&   rv   rG   r   r   r'   r   r   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   anthropic_headerss                           r   validate_environmentz'AnthropicModelInfo.validate_environment  s    =W
 %009$(
?+::<J?z1-- o(   ##G,!666I!77e7D11'++M: 2 
 ##X#6++X+>#;;%;H33%3@)-)O)O *P *
& #999F))/QV)W#'#C#C%#C#P %)%G%G+ &H &
" '+&K&K")++.>"? 'L '
# !6611!%!5-112EuM(C+-+I 3#%='A! 7 
& 3W2 12r   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.mainr   )r   r   s     r   get_api_basezAnthropicModelInfo.get_api_base"  s5    ?  +23+23+ +		
r   c                 &    ddl m} | xs  |d      S )Nr   r   ANTHROPIC_API_KEYr   )r'   r   s     r   r   zAnthropicModelInfo.get_api_key-  s    ?=.)<==r   c                 &    ddl m} | xs  |d      S )zGet 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   r   ANTHROPIC_AUTH_TOKENr   )r   r   s     r   r   z!AnthropicModelInfo.get_auth_token3  s     	@C^,BCCr   c                     t         j                  |       }|t        |      rdd| iS d|iS t         j                         }|dd| iS y)zResolve Anthropic credentials and return the appropriate auth header dict.

        Checks ANTHROPIC_API_KEY first (-> x-api-key), then
        ANTHROPIC_AUTH_TOKEN (-> Authorization: Bearer).
        Returns None if neither is available.
        Nr)   r   r+   )rF   r   r   r   )r'   resolved_keyr   s      r   get_auth_headerz"AnthropicModelInfo.get_auth_header>  sh     *55g>#%l3'7<.)ABB..'668
!#wzl%;<<r   c                 .    | r| j                  dd      S d S )N
anthropic/r*   )r0   )rv   s    r   get_base_modelz!AnthropicModelInfo.get_base_modelP  s    27u}}\2.ATAr   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)NzANTHROPIC_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.r   r   z
/v1/models)urlr&   z4Failed to fetch models from Anthropic. Status code: z, Response: dataidr   )rF   r   r   
ValueErrorr   r   module_level_clientr/   raise_for_statusrB   HTTPStatusError	Exceptionr6   rb   jsonr   )r;   r'   r   r2   r&   responsemodelslitellm_model_namesrv   stripped_model_namelitellm_model_names              r   
get_modelszAnthropicModelInfo.get_modelsT  s&    &228<(88A{2 |  '5{#..22*J' 3 

	%%' ( E"'+!-0C!C&&'9:  #" $$ 	FxG[G[F\\hiqivivhwx 	s   4B= =9C6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_counterr   )r;   r   s     r   get_token_counterz$AnthropicModelInfo.get_token_countert  s    	
 %&&r   r=   )NNFFF)NNNNFFFFFFFFFFNFF)NN)'r>   r?   r@   r   r   boolrN   rR   r   r   rV   r   r   r]   r`   rc   rj   rq   ru   staticmethodr   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   rU   r   r   rF   rF   [   s   T2B-C  "!-=(> !4 !#D)?$@A		d#:;<		#	d#:;<	D)9$: t  $ D  x~ $ 8HTN t @ 
C 
D 
 
$ GK'~6>sm	@$ D Xd^ PT  0%-c]0	$s)	0
3 
3 
* +/,0#(" %( (  "$(  %SM	( 
 !(  (  (  
c( X "&$(+/,0#(" %%*!&/4$)!"';?).+0%T#T SMT $C=	T
 %SMT !T T T T #T T )-T "T T  T  &.d3i%8!T" #'#T$ %)%T& 
'Tz "&"&EE E '(	E
 E E #E 3-E 
EN 
x} 
 
 
 >Xc] >hsm > >
 D8C= DHSM D D # (4.  " Bhsm Bx} B B HL#}#7?}#	c#@'8,<#= 'r   rF   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   )itemsformat)r&   openai_headerskrz   llm_response_headersadditional_headerss         r   process_anthropic_headersr     s    N+w67>08
34 07:;B4<
78 *W45<.6
12 .89@2:
56
 :A9HA~q)1,   D0CNCs   A.)"__doc__typingr   r   r   r   rB   r   8litellm.litellm_core_utils.prompt_templates.common_utilsr    litellm.llms.base_llm.base_utilsr   r	   )litellm.llms.base_llm.chat.transformationr
   r   r   r   r   r   r   litellm.types.llms.openair   r   r   r   r%   ro   tupler3   r5   rF   rC   r   rU   r   r   <module>r      s    / .   P F  7:(3- :D :#(3- #3 #3 #""$SM"
4#"JT% Td') d'NuU]]D-@'A d r   