
    h!$                         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 ddlmZ ddlmZmZ ddlm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)BaseLLMException)AllAnthropicToolsValuesAnthropicMcpServerTool)AllMessageValuesc                   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       _/var/www/Befach/backend/env/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fdZdee   defd	Zd
ee   deee      fdZ	 	 	 	 	 	 	 	 d!dedee   d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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_used/   s     .h78}q  r   mcp_serversc                     |y|ryy)NFT )r   r1   s     r   is_mcp_server_usedz%AnthropicModelInfo.is_mcp_server_used6   s     r   toolsc                 N    |y|D ]  }d|v s|d   j                  d      s y y)NFtype	computer_T)
startswith)r   r5   tools      r   is_computer_tool_usedz(AnthropicModelInfo.is_computer_tool_used?   s6     =D~$v,"9"9+"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'   r7   textTF)r)   r*   )r   r#   r   r'   s       r   is_pdf_usedzAnthropicModelInfo.is_pdf_usedI   sZ    
  GW$I&2wy148&y1G(WV_-F#  2   r   anthropic_beta_headerc                 *    |y |j                  d      S )N,)split)r   r?   s     r    _get_user_anthropic_beta_headersz3AnthropicModelInfo._get_user_anthropic_beta_headersY   s     !($**3//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
                 b   t               }
|r|
j                  d       |r|
j                  d       |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computer-use-2024-10-22z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   rA   anthropic-beta)setaddupdater.   join)r   rD   rE   rF   rG   rH   rI   rJ   rK   rL   betasr   s               r   get_anthropic_headersz(AnthropicModelInfo.get_anthropic_headers`   s     II12II/0 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_providerrY   r5   )r#   )r5   r1   )r1   rR   )r?   rK   F)rF   rG   rH   rD   rI   rK   rL   rJ   )
litellmAuthenticationErrorr(   r,   r;   r4   r>   r0   rC   rX   )r   r   rY   r#   rZ   r[   rD   r\   r5   rG   rF   rJ   rH   rI   rL   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.mainrf   )r\   rf   s     r   get_api_basezAnthropicModelInfo.get_api_base   s%    ?  +23+*	
r   c                 &    ddl m} | xs  |d      S )Nr   re   ANTHROPIC_API_KEYrh   )rD   rf   s     r   get_api_keyzAnthropicModelInfo.get_api_key   s    ?=.)<==r   c                 .    | r| j                  dd      S d S )N
anthropic/ )replace)rY   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/modelsrN   )rP   rO   )urlr   z4Failed to fetch models from Anthropic. Status code: z, Response: dataidro   )r"   rj   rm   
ValueErrorr`   module_level_clientr(   raise_for_statusr   HTTPStatusError	Exceptionr   r=   jsonappend)	r   rD   r\   responsemodelslitellm_model_namesrY   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$)NFFFFFFN)NNr   )r   r   r   r   r   boolr,   r0   r   r   r4   r
   r;   r>   strrC   dictrX   r   rc   staticmethodrj   rm   rr   r   r3   r   r   r"   r"      sZ   T2B-C  "!-=(> !4 !#D)?$@A	d#:;<	D)9$: t  0%-c]0	$s)	0 ,0#(#(" %"';?)) $C=) !	)
 !) ) ) )  ) &.d3i%8) 
)d "&"&)) ) '(	)
 ) ) #) 3-) 
)V 
x} 
 
 
 >Xc] >hsm > >
 Bhsm Bx} B B HL#}#7?}#	c#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{}-{}r_   )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15A~q)1,  D0CNCs   A.)__doc__typingr   r   r   r   r   r`   8litellm.litellm_core_utils.prompt_templates.common_utilsr    litellm.llms.base_llm.base_utilsr   )litellm.llms.base_llm.chat.transformationr	   litellm.types.llms.anthropicr
   r   litellm.types.llms.openair   r   r"   r   r   r   r3   r   r   <module>r      sk    / .   > F X 6T% TI#) I#XuU]]D-@'A d r   