
    gu                     8   d dl Z d dlZd dlZd dlmZmZ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 d dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$ d d	l%m&Z' d d
l%m(Z( d dl)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0 er	d dl1m2Z3 e3Z4neZ4 G d de      Z5y)    N)TYPE_CHECKINGAnyDictListOptionalUnioncast)RESPONSE_FORMAT_TOOL_NAME)map_finish_reason)anthropic_messages_pt)
BaseConfigBaseLLMException)AllAnthropicToolsValuesAnthropicComputerToolAnthropicHostedToolsAnthropicInputSchemaAnthropicMessagesToolAnthropicMessagesToolChoiceAnthropicSystemMessageContent)AllMessageValuesChatCompletionCachedContentChatCompletionSystemMessageChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunkChatCompletionToolParam)Message)PromptTokensDetailsWrapper)ModelResponseUsageadd_dummy_toolhas_tool_call_blocks   )AnthropicErrorprocess_anthropic_headers)Loggingc                       e Zd ZU dZdZee   ed<   dZee	   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   	 	 	 	 	 	 	 d?dee   dee	   dee   dee   dee   d	ee   d
ee   ddfdZe fd       ZdefdZdefdZ	 	 	 	 	 d@dedee   dededededefdZdee   dee   dee   fdZdedefdZdedee   fdZdeeeee   f      deee      fd Z d!edee   defd"Z!d#ed!eded$edef
d%Z"	 dAd&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%   defd+Z(d(ee%   dee)   fd,Z*ded(ee%   d!ed-ed.edefd/Z+d0ee   d1ee,   dee-   fd2Z.	 	 dBded3e/j`                  d4e1d5e2d6e3d(ee%   d!e3d-ed7e4dee   d0ee   de1fd8Z5e6d1ee,   dee-   fd9       Z7d:ed;ed.ee3e/jp                  f   de9fd<Z:	 	 dBd.eded(ee%   d!edee   d=ee   de3fd>Z; xZ<S )CAnthropicConfigz
    Reference: https://docs.anthropic.com/claude/reference/messages_post

    to pass metadata to anthropic, it's {"user_id": "any-relevant-information"}
       
max_tokensNstop_sequencestemperaturetop_ptop_kmetadatasystemreturnc                     t               }|j                         D ]%  \  }	}
|	dk7  s|
t        | j                  |	|
       ' y )Nself)localsitemssetattr	__class__)r2   r)   r*   r+   r,   r-   r.   r/   locals_keyvalues              _/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/anthropic/chat/transformation.py__init__zAnthropicConfig.__init__=   s;     (!--/JCf}!2U3 *    c                      t         |          S N)super
get_config)clsr6   s    r:   r@   zAnthropicConfig.get_configN   s    w!##r<   modelc                 
    g dS )N)streamstopr+   r,   r)   max_completion_tokenstoolstool_choiceextra_headersparallel_tool_callsresponse_formatuser )r2   rB   s     r:   get_supported_openai_paramsz+AnthropicConfig.get_supported_openai_paramsR   s    
 	
r<   c                     dddS )N
2023-06-01prompt-caching-2024-07-31)anthropic-versionanthropic-betarM   )r2   s    r:   get_cache_control_headersz)AnthropicConfig.get_cache_control_headersb   s    !-9
 	
r<   api_keyanthropic_versioncomputer_tool_usedprompt_caching_setpdf_usedis_vertex_requestc                     g }|r|j                  d       |r|j                  d       |r|j                  d       |xs d|ddd}|du r	 |S t        |      dkD  rd	j                  |      |d
<   |S )NrQ   zcomputer-use-2024-10-22zpdfs-2024-09-25rP   zapplication/json)rR   z	x-api-keyacceptzcontent-typeTr   ,rS   )appendlenjoin)	r2   rU   rV   rW   rX   rY   rZ   betasheaderss	            r:   get_anthropic_headersz%AnthropicConfig.get_anthropic_headersh   s     LL45LL23LL*+!2!Bl (.	
 $  Z!^(+G$%r<   rH   parallel_tool_usec                    d }|dk(  rt        d      }nV|dk(  rt        d      }nDt        |t              r4|j                  di       j                  d      }t        d      }|||d<   ||| |d<   |S t        d| 	      }|S )
Nautotyperequiredanyfunctionnametooldisable_parallel_tool_use)rh   rn   )r   
isinstancedictget)r2   rH   rd   _tool_choice
_tool_names        r:   _map_tool_choicez AnthropicConfig._map_tool_choice   s     ?C& 6L J&6EBLT*$R8<<VDJ6FCL%'1V$( '@Q<Q89 	  ;2C.C  r<   rm   c                    d }|d   dk(  s|d   dk(  rU|d   j                  ddi d      }t        di |}t        |d   d   |      }|d   j                  d	      }|||d	<   |}n|d   j                  d
      rd|d   vrt	        d      |d   d   j                  d      }|d   d   j                  d      }||t	        d      t        |d   |d   j                  dd      ||      }	|d   d   j                  d      }
|
|
|	d<   |	}nY|d   j                  d      s|d   j                  d      r1|d   j                  d      }|t	        d      t        |d   |      }|t	        d|d          |j                  dd       }|j                  di       j                  dd       }|||d<   |S |t        |t              rt        di ||d<   |S )Nrh   rk   custom
parametersobject)rh   
propertiesrl   rl   input_schemadescription	computer_z&Missing required parameter: parametersdisplay_width_pxdisplay_height_pxzAMissing required parameter: display_width_px or display_height_pxcomputer)rh   rl   r~   r   display_numberbash_text_editor_z Missing required parameter: name)rh   rl   zUnsupported tool type: cache_controlrM   )
rq   r   r   
startswith
ValueErrorr   r   ro   rp   r   )r2   rm   returned_tool_input_schemar{   _tool_description_display_width_px_display_height_px_computer_tool_display_numberfunction_name_cache_control_cache_control_functions                 r:   _map_tool_helperz AnthropicConfig._map_tool_helper   s    <@<:%f)A"&z"2"6"6$"$#M 2F1V1VL)*%f-)E
  
+//>L''3m$!M&\$$[14
#33 !IJJ/3J/?/M/Q/Q"0 15Z0@0N0R0R#1 !(,>,F W  3&\*%))&*=!2"4	N #:.|<@@AQRO*3B/0*M&\$$W-f1H1H2
 !,008M$ !CDD0&\"M  6tF|nEFF /48"&((:r":">">PT"U%-;M/*  %0Z#T6
 .I .).M/* r<   rG   c                     g }|D ]:  }d|v r|j                  |       | j                  |      }|j                  |       < |S )Nr{   )r^   r   )r2   rG   anthropic_toolsrm   new_tools        r:   
_map_toolszAnthropicConfig._map_tools   sM    D%&&t,006&&x0  r<   rE   c                 N   d }t        |t              r/t        j                  d|      rt        j
                  du r|S |g}|S t        |t              rSg }|D ]<  }t        j                  d|      rt        j
                  du r,|j                  |       > t        |      dkD  r|}|S )Nz^\s+$Tr   )	ro   strrematchlitellmdrop_paramslistr^   r_   )r2   rE   new_stopnew_vvs        r:   _map_stop_sequencesz#AnthropicConfig._map_stop_sequences   s     )-dC xx$'G,?,?4,GvH  d#E88Ha(W-@-@D-HQ  5zA~ r<   optional_paramsc                 4    d|vr||d<   |S g |d   ||d<   |S )NrG   rM   )r2   r   rG   s      r:   _add_tools_to_optional_paramsz-AnthropicConfig._add_tools_to_optional_params  sG     /)',OG$ 	( )((OG$ r<   non_default_paramsr   c                    |j                         D ]Y  \  }}|dk(  r||d<   |dk(  r||d<   |dk(  r$| j                  |      }| j                  ||      }|dk(  s|dk(  r8| j                  |j	                  d      |j	                  d            }|||d<   |dk(  r	|d	u r||d<   |d
k(  r8t        |t              st        |t              r| j                  |      }	|	|	|d<   |dk(  r||d<   |dk(  r||d<   |dk(  rbt        |t              rRd }
d|v r|d   }
nd|v r|d   d   }
	 t        dd}| j                  |
      }| j                  ||g      }||d<   d	|d<   |dk(  sSd|i|d<   \ |S )Nr)   rF   rG   )r   rG   rH   rJ   )rH   rd   rD   TrE   r*   r+   r,   rK   response_schemajson_schemaschemarm   )rl   rh   )r   	json_moderL   user_idr.   )r4   r   r   rt   rq   ro   r   r   r   rp   r
   *_create_json_tool_call_for_response_format)r2   r   r   rB   r   paramr9   
tool_valuerr   _valuer   r   s               r:   map_openai_paramsz!AnthropicConfig.map_openai_params  s    /446LE5$05-//05-!__U3
"&"D"D$3: #E # %2G)G))$6$:$:=$I*<*@*@AV*W *    +5AOM2 Ud],1)Juc$:jPT>U11%8%8>O$45%16.+0())j.E.2$-"'(9":K"e+"'"6x"@K )B6RGG + H  #'"D"D$3E7 #E # 2>./3,/8%.@
+o 7r r<   r   c                 h    t        d      }|d|d<   i |d<   nd|i|d<   t        t        |      }|S )a3  
        Handles creating a tool call for getting responses in JSON format.

        Args:
            json_schema (Optional[dict]): The JSON schema the response should be in

        Returns:
            AnthropicMessagesTool: The tool call to send to Anthropic API to get responses in JSON format
        rx   rg   TadditionalPropertiesry   valuesrz   )r   r   r
   )r2   r   r   r   s       r:   r   z:AnthropicConfig._create_json_tool_call_for_response_format`  sV     /C/
  59M01*,M,'+3[*AM,'%*
 r<   messagesc                     |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.
        r   NTcontentF)rq   ro   r   )r2   r   message_message_contentr   s        r:   is_cache_control_setz$AnthropicConfig.is_cache_control_set~  s[      G{{?D1=&{{95+
;KT0R/G&'1#  0   r<   c                 N    |y|D ]  }d|v s|d   j                  d      s y y)NFrh   r}   T)r   )r2   rG   rm   s      r:   is_computer_tool_usedz%AnthropicConfig.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   rh   textTF)ro   r   )r2   r   r   r   s       r:   is_pdf_usedzAnthropicConfig.is_pdf_used  sZ    
  GW$I&2wy148&y1G(WV_-F#  2   r<   c                 :   g }g }t        |      D ]  \  }}|d   dk(  sd}t        di |}t        |d   t              r0t	        d|d         }d|v r|d   |d<   |j                  |       d}ngt        |d   t              rT|d   D ]J  }	t	        |	j                  d	      |	j                  d            }d|	v r|	d   |d<   |j                  |       L d}|s|j                  |        t        |      d
kD  r!t        |      D ]  }|j                  |        |S )z
        Translate system message to anthropic format.

        Removes system message from the original list and returns a new list of anthropic system message content.
        roler/   Fr   r   )rh   r   r   Trh   r   rM   )	enumerater   ro   r   r   r^   r   rq   r_   reversedpop)
r2   r   system_prompt_indicesanthropic_system_message_listidxr   valid_contentsystem_message_block anthropic_system_message_content_contents
             r:   translate_system_messagez(AnthropicConfig.translate_system_message  s_    !#MO%%h/LCv(*&+'B'MW'M$29=sC7T#1)<84 '*>>0A 9I 2888 %)M	 2D9$+I$69%-\\&%9%-\\&%9 9 +h6 ( 9 =_M 6<<< %7 %)M )005I 0J $%) 56S! 7 -,r<   litellm_paramsrb   c           	         	 d|vrT|Rt        |      rGt        j                  r| j                  t	        d            |d<   nt        j
                  ddd      | j                  |      }t        |      d	kD  r||d
<   	 t        ||d      }t        j                  j                         }	|	j                         D ]  \  }
}|
|vs|||
<    |j!                  dd      }|rt#        |t$              rd|v r
d|d   i|d<   ||d|}|S # t        $ r+}t        ddj                  t        |      |            d}~ww xY w)z9
        Translate messages to anthropic format.
        rG   N	anthropic)custom_llm_providerzAnthropic doesn't support tool calling without `tools=` param specified. Pass `tools=` param OR set `litellm.modify_params = True` // `litellm_settings::modify_params: True` to add dummy tool to the request. )r   rB   llm_providerr   r   r/   )rB   r   r   i  z{}
Received Messages={})status_coder   r.   r   )rB   r   )r!   r   modify_paramsr   r    UnsupportedParamsErrorr   r_   r   	Exceptionr#   formatr   r'   r@   r4   rq   ro   rp   )r2   rB   r   r   r   rb   r   anthropic_messageseconfigkr   _litellm_metadatadatas                 r:   transform_requestz!AnthropicConfig.transform_request  s~   	 ?*$$X.$$+/??"{C,( 44 n!,  )-(E(Ex(E(X%,-1(EOH%
	!6!(" ((335LLNDAq(%&"	 # +..z4@,d3..+46G	6R*SOJ' *
 
 ;  	 299#a&(K 	s    D	 		D=&D88D=r   
tool_callsc                     d }|du r[t        |      dk(  rMd }d|d   d   v r)|d   d   d   t        k(  r|d   d   j                  d      }|t        j	                  |      }|S )NT   rl   r   rk   	arguments)r   )r_   r
   rq   r'   !_convert_tool_response_to_message)r2   r   r   _messagejson_mode_content_strs        r:   !_transform_response_for_json_modez1AnthropicConfig._transform_response_for_json_mode(  s    
 .2ZA!537!*Q-
33qM*-f59RR(21j(A(E(Ek(R%$0*LL) M  r<   raw_responsemodel_responselogging_objrequest_dataencodingc                    i }t        t        |j                              |d<   |j                  ||
|j                  d|i       	 |j                         }d|v r1t        |dd       }t        t        |d         |j                  |      d}g }t        |d	         D ]d  \  }}|d
   dk(  r	||d   z  }|d
   dk(  s |j                  t        |d   dt        |d   t        j                   |d               |             f t#        j$                  ||xs d       }| j'                  ||      }|d|d<   |}||j(                  d   _        |d	   |j,                  d<   t/        |d         |j(                  d   _        |d   d   }|d   d   }|d   }d}d}t3        t5        j4                               |_        ||_        d|v r
|d   }||z  }d|v r
|d   }||z  }t;        |      }||z   }t=        ||||||      }t?        |d|       ||_        |S # t        $ rM}t        |dd       }t        dj                  t        |      |j                        |j                  |      d }~ww xY w) Nadditional_headerscomplete_input_dict)inputrU   original_responseadditional_argsrb   z7Unable to get json response - {}, Original Response: {})r   r   rb   errorr   r   rh   r   tool_useidrk   rl   r   )rl   r   )r   rh   rk   index)r   r   )r   r   rE   stop_reasonr   r   usageinput_tokensoutput_tokenscache_creation_input_tokenscache_read_input_tokens)cached_tokens)prompt_tokenscompletion_tokenstotal_tokensprompt_tokens_detailsr   r   ) r$   rp   rb   	post_callr   jsonr   getattrr#   r   r   r   r   r^   r   r   dumpsr   r   r   choicesr   _hidden_paramsr   finish_reasoninttimecreatedrB   r   r   r5   )r2   rB   r   r   r   r   r   r   r   r   rU   r   r  completion_responser   response_headerstext_contentr   r   r   r   json_mode_messager   r   _usager   r   r   r   r   s                                 r:   transform_responsez"AnthropicConfig.transform_response<  s     "/H%%&0
+, 	*//2LA	 	 	

	"."3"3"5 ))&|YE /89(44(  L<>J )*=i*H IW6?f, GFO3LV_
2%%3&t}!+%H%,V_*.**WW5E*F& #&
 !J" %$,H !% F F#% !G ! !,5;#M2,08N""1%-ATBN))*=> 7H#M27N""1%3
 ,G4^D/8I$W-+,#'(!$TYY[!1$(F2*01N*O'88M$.&,-F&G#44M :1!
 %'88'/%"7(C$;
 	/(6%w  	&|YE QXXFL-- )44( 	s   H 	I- AI((I-c                    | d   d   j                  d      }	 |t        j                  |      }t        |t              r>|j                  d      x}+t        j                  t        j                  |            }|S t        j                  t        j                  |            }|S 	 y# t        j                  $ r t        j                  |      cY S w xY w)z
        In JSON mode, Anthropic API returns JSON schema as a tool call, we need to convert it to a message to follow the OpenAI format

        r   rk   r   Nr   )r   )	rq   r  loadsro   rp   r   r   r  JSONDecodeError)r   r   argsr   r   s        r:   r   z1AnthropicConfig._convert_tool_response_to_message  s     0:!}Z/H/L/L0
	B$0zz"78tT*#'88H#55B&tzz&7IJH#O  'tzz$7GHH#O 1   ## 	B??+@AA	Bs   A$B+ >*B+ +)CCerror_messager   c                 N    t        ||t        t        j                  |            S )N)r   r   rb   )r#   r	   httpxHeaders)r2   r  r   rb   s       r:   get_error_classzAnthropicConfig.get_error_class  s%     #!0
 	
r<   api_basec                     |t        j                  dd|      |j                  d      }| j                  |      }| j	                  |      }	| j                  |      }
| j                  |	||
|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 varsr   )r   r   rB   rG   r   )rG   F)rW   rX   rY   rU   rZ   )r   AuthenticationErrorrq   r   r   r   rc   )r2   rb   rB   r   r   rU   r  rG   rX   rW   rY   anthropic_headerss               r:   validate_environmentz$AnthropicConfig.validate_environment  s     ?-- U(   ##G,!666I!77e7D##X#6 6611# 7 
 3W2 12r<   )r(   NNNNNN)NFFFFr>   )NN)=__name__
__module____qualname____doc__r)   r   r  __annotations__r*   r   r+   r,   r-   r.   rp   r/   r   r;   classmethodr@   rN   rT   boolrc   r   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   LitellmMessager   r  Responser   LoggingClassr   r   r  staticmethodr   r  r   r  r  __classcell__)r6   s   @r:   r'   r'   ,   s    	   &*NHTN)!%K#%E8C=E8C=#Hhtn# FHSM  )-%)###' $4
4
 !4 c]4 }4 }4 4.4 4 
4" $ $
 
 
4 
 ,0#(#("' $C= !	
 !    
@#C==Ed^	-	.8O+O	 Ob	 	.E)F 	U3S	>23	$s)	$
#
,01H,I
	
@ @ @ 	@
 @ 
@H '+d^ 
<T2B-C  "d#:;<	D)9$: t  3--.3-	+	,3-jHH '(H 	H
 H H 
HTD> 45 
.	!	> "&$(xx nnx &	x
 "x x '(x x x x #x D>x 
xt 45	.	! <
 
/2
=B4CV=W
	
 "&"&  '(	
  # 3- 
r<   r'   )6r  r   r	  typingr   r   r   r   r   r   r	   r  r   litellm.constantsr
   'litellm.litellm_core_utils.core_helpersr   3litellm.litellm_core_utils.prompt_templates.factoryr   )litellm.llms.base_llm.chat.transformationr   r   litellm.types.llms.anthropicr   r   r   r   r   r   r   litellm.types.llms.openair   r   r   r   r   r   litellm.types.utilsr   r&  r   litellm.utilsr   r   r    r!   common_utilsr#   r$   *litellm.litellm_core_utils.litellm_loggingr%   LiteLLMLoggingObjr(  r'   rM   r<   r:   <module>r7     sq     	  H H H   7 E U R    : : T T DW$LLOj Or<   