
    j-                         d Z ddlmZ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 ddlmZ dd	lmZ  G d
 de      Z G d de      Z G d de      Zdeej4                  ef   defdZy)z6
This file contains common utils for anthropic calls.
    )AnyDictListOptionalUnionN)get_file_ids_from_messages)BaseLLMModelInfoBaseTokenCounter)BaseLLMException)AllAnthropicToolsValuesAnthropicMcpServerTool)AllMessageValues)TokenCountResponsec                   F     e Zd Z	 ddedeej                     f fdZ xZS )AnthropicErrorstatus_codeheadersc                 *    t         |   |||       y )N)r   messager   )super__init__)selfr   r   r   	__class__s       |/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/common_utils.pyr   zAnthropicError.__init__   s     	['7S    N)	__name__
__module____qualname__intr   httpxHeadersr   __classcell__)r   s   @r   r   r      s1    
 ,0	TT %--(	T Tr   r   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   defd	Zd
ee   deee      fdZdedefdZ	 	 	 	 	 	 	 	 d$dedee   dee   dedededededee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d&dee   dee   fd       Zed&dee   dee   fd        Zed&dee   dee   fd!       Z	 d%dee   dee   dee   fd"Zdee   fd#Zy)'AnthropicModelInfomessagesreturnc                     |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)get
isinstancelist)r   r&   r   _message_contentr*   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   r&   file_idss      r   is_file_id_usedz"AnthropicModelInfo.is_file_id_used0   s     .h78}q  r   mcp_serversc                     |y|ryy)NFT )r   r4   s     r   is_mcp_server_usedz%AnthropicModelInfo.is_mcp_server_used7   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_)
startswith)r   r8   tools      r   is_computer_tool_usedz(AnthropicModelInfo.is_computer_tool_used@   s=     =D~$v,"9"9+"FF|#  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.

        r*   r:   textTF)r,   r-   )r   r&   r   r*   s       r   is_pdf_usedzAnthropicModelInfo.is_pdf_usedK   sZ    
  GW$I&2wy148&y1G(WV_-F#  2   r   anthropic_beta_headerc                 *    |y |j                  d      S )N,)split)r   rB   s     r    _get_user_anthropic_beta_headersz3AnthropicModelInfo._get_user_anthropic_beta_headers[   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_20241022)r+   )r   rG   computer_tool_beta_mappings      r   get_computer_tool_beta_headerz0AnthropicModelInfo.get_computer_tool_beta_headerb   s-     ";!:&
" *--!#<
 	
r   Napi_keyanthropic_versioncomputer_tool_usedprompt_caching_setpdf_usedfile_id_usedmcp_server_usedis_vertex_requestuser_anthropic_beta_headersc
                    t               }
|r|
j                  d       |r"| j                  |      }|
j                  |       |r"|
j                  d       |
j                  d       |r|
j                  d       |xs d|ddd}|	|
j                  |	       |du r	 |S t	        |
      d	kD  rd
j                  |
      |d<   |S )Nzprompt-caching-2024-07-31zfiles-api-2025-04-14zcode-execution-2025-05-22zmcp-client-2025-04-04
2023-06-01zapplication/json)anthropic-version	x-api-keyacceptzcontent-typeTr   rD   anthropic-beta)setaddrL   updater1   join)r   rM   rN   rO   rP   rQ   rR   rS   rT   rU   betasbeta_headerr   s                r   get_anthropic_headersz(AnthropicModelInfo.get_anthropic_headerst   s     II12<<=OPKIIk" II,-II12II-. "3!Bl (.	
 '2LL45 $  Z!^(+G$%r   r   modeloptional_paramslitellm_paramsapi_basec                    |t        j                  dd|      |j                  d      }| j                  |      }	| j	                  |      }
| j                  |j                  d            }| j                  |      }| j                  |      }| j                  |j                  d	      
      }| j                  |
|	||||j                  dd      ||      }i ||}|S )NzMissing 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` in your environment vars	anthropic)r   llm_providerrc   r8   )r&   )r8   r4   )r4   r[   )rB   rT   F)rO   rP   rQ   rM   rR   rT   rU   rS   )
litellmAuthenticationErrorr+   r/   r>   r7   rA   r3   rF   rb   )r   r   rc   r&   rd   re   rM   rf   r8   rP   rO   rS   rQ   rR   rU   anthropic_headerss                   r   validate_environmentz'AnthropicModelInfo.validate_environment   s&    ?-- U(   ##G,!666I!77e7D11'++M: 2 
 ##X#6++X+>&*&K&K")++.>"? 'L '
# !6611%-112EuM(C+ 7 	
 3W2 12r   c                 .    ddl m} | xs  |d      xs dS )Nr   get_secret_strANTHROPIC_API_BASEzhttps://api.anthropic.comlitellm.secret_managers.mainrp   )rf   rp   s     r   get_api_basezAnthropicModelInfo.get_api_base   s%    ?  +23+*	
r   c                 &    ddl m} | xs  |d      S )Nr   ro   ANTHROPIC_API_KEYrr   )rM   rp   s     r   get_api_keyzAnthropicModelInfo.get_api_key   s    ?=.)<==r   c                 .    | r| j                  dd      S d S )N
anthropic/ )replace)rc   s    r   get_base_modelz!AnthropicModelInfo.get_base_model   s    27u}}\2.ATAr   c                    t         j                  |      }t         j                  |      }||t        d      t        j
                  j                  | d|d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 or ANTHROPIC_API_KEY is not set. Please set the environment variable, to query Anthropic's `/models` endpoint.z
/v1/modelsrW   )rY   rX   )urlr   z4Failed to fetch models from Anthropic. Status code: z, Response: dataidry   )r%   rt   rw   
ValueErrorrj   module_level_clientr+   raise_for_statusr!   HTTPStatusError	Exceptionr   r@   jsonappend)	r   rM   rf   responsemodelslitellm_model_namesrc   stripped_model_namelitellm_model_names	            r   
get_modelszAnthropicModelInfo.get_models   s    &228<$009w T  ..22*J'")M 3 

	%%' ( E"'+!-0C!C&&'9:  #" $$ 	FxG[G[F\\hiqivivhwx 	s   "B+ +9C$c                     t               S )z
        Factory method to create an Anthropic token counter.
        
        Returns:
            AnthropicTokenCounter instance for this provider.
        )AnthropicTokenCounter)r   s    r   get_token_counterz$AnthropicModelInfo.get_token_counter   s     %&&r   )NNFFFFFN)NNr   )r   r   r   r   r   boolr/   r3   r   r   r7   r   strr>   rA   rF   rL   dictrb   r   rm   staticmethodrt   rw   r|   r   r
   r   r6   r   r   r%   r%      s   T2B-C  "!-=(> !4 !#D)?$@A		d#:;<		#	D)9$: t  0%-c]0	$s)	0
3 
3 
* ,0,0#(" %"';?** $C=* %SM	*
 !* * * *  * &.d3i%8* 
*f "&"&)) ) '(	)
 ) ) #) 3-) 
)V 
x} 
 
 
 >Xc] >hsm > >
 Bhsm Bx} B B HL#}#7?}#	c#<'8,<#= 'r   r%   c                       e Zd ZdZ	 ddee   defdZ	 	 ddedeee	ee
f         deee	ee
f         d	ee	ee
f      d
edee   fdZy)r   z4Token counter implementation for Anthropic provider.Ncustom_llm_providerr'   c                 @    ddl m} ||j                  j                  k(  S )Nr   )LlmProviders)litellm.types.utilsr   	ANTHROPICvalue)r   r   r   s      r   should_use_token_counting_apiz3AnthropicTokenCounter.should_use_token_counting_api
  s     	5"l&<&<&B&BBBr   model_to_user&   contents
deploymentrequest_modelc           	         K   ddl m}  ||||       d {   }|0t        |j                  dd      |||j                  dd      |      S y 7 7w)Nr   )count_tokens_with_anthropic_api)r   r&   r   total_tokenstokenizer_usedrz   )r   r   
model_usedtokenizer_typeoriginal_response)litellm.proxy.utilsr   r   r+   )r   r   r&   r   r   r   r   results           r   count_tokensz"AnthropicTokenCounter.count_tokens  si      	H6%!
 
 %#ZZ:+'%zz*:B?"(  
s   AA8Ar   )Nrz   )r   r   r   __doc__r   r   r   r   r   r   r   r   r   r6   r   r   r   r     s    > .2C%c]C 
C 04 4S#X/0 4S#X/0	
 T#s(^,  
$	%r   r   r   r'   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{}-{}ri   )itemsformat)r   openai_headerskv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.)r   typingr   r   r   r   r   r!   rj   8litellm.litellm_core_utils.prompt_templates.common_utilsr    litellm.llms.base_llm.base_utilsr	   r
   )litellm.llms.base_llm.chat.transformationr   litellm.types.llms.anthropicr   r   litellm.types.llms.openair   r   r   r   r%   r   r"   r   r   r6   r   r   <module>r      s}    4 3   P F X 6 2T% Tf') f'R#, #LuU]]D-@'A d r   