
    ^hl                        S r SSKrSSKrSSKJrJrJrJrJrJ	r	  SSK
r
SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSKJrJrJr  SSKJrJrJrJrJrJrJr  SSKJrJ r   SS	KJ!r!  SS
K"J#r#J$r$J%r%  SSK&J'r'  SSK(J)r)J*r*  SSK+J,r,  S\\   S\-S\.S\-S\-S\/S\\	\0\
Rb                  4      S\2S\\\
Rf                  4   4S jr4S\\   S\-S\.S\-S\-S\/S\\	\0\
Rb                  4      S\2S\\\
Rf                  4   4S jr5 " S S\'5      r6 " S S5      r7g) zE
Calling + translation logic for anthropic's `/v1/messages` endpoint
    N)AnyCallableListOptionalTupleUnion)LlmProviders)map_finish_reason)AsyncHTTPHandlerHTTPHandlerget_async_httpx_client)!AnthropicChatCompletionUsageBlockContentBlockDeltaContentBlockStartContentBlockStopMessageBlockDeltaMessageStartBlock
UsageDelta)ChatCompletionToolCallChunkChatCompletionUsageBlock)GenericStreamingChunk)CustomStreamWrapperModelResponseProviderConfigManager   )BaseLLM   )AnthropicErrorprocess_anthropic_headers   )AnthropicConfigclientapi_baseheadersdatamodelmessagestimeout	json_modereturnc	                   #    U c  [         R                  n  U R                  XUSUS9I S h  vN n	[        U	R                  5       SUS	9nUR!                  US
USU0S9  XR"                  4$  N>! [        R                   av  n
[        U
SS 5      n[        U
SS 5      nUc  U(       a  [        USS 5      n[        U
R                  R                  U
R                  R                  5       I S h  vN  US9eS n
A
f[         aA  n
[         R                   H  n[        X5      (       d  M  U
e   [        S[        U
5      S9eS n
A
ff = f7f)NTr$   r%   streamr(   r$   responsestatus_codemessager$     r0   r1   Fstreaming_responsesync_streamr)    complete_input_dictinputapi_keyoriginal_responseadditional_args)litellmmodule_level_aclientposthttpxHTTPStatusErrorgetattrr   r.   r0   aread	ExceptionLITELLM_EXCEPTION_TYPES
isinstancestrModelResponseIteratoraiter_lines	post_callr$   )r"   r#   r$   r%   r&   r'   logging_objr(   r)   r.   eerror_headerserror_response	exceptioncompletion_streams                  ]/home/james-whalen/.local/lib/python3.13/site-packages/litellm/llms/anthropic/chat/handler.py	make_callrS   +   sS     ~-->Dw % 
 
& .#//1 +.5	   ....C
    	
9d3 J5 ^#NItDM

..****,,,!
 	

  > 88I!'' 9 c!f==	>sV   EA- A+A- :E+A- -E A(C2)C,*C22E ?!D;$D;;E  Ec	                    U c  [         R                  n  U R                  XUSUS9n	U	R                  S:w  a0  [        U	SS 5      n[        U	R                  U	R                  5       US9e[        U	R                  5       SUS	9nUR!                  US
SSU0S9  XR"                  4$ ! [        R                   am  n
[        U
SS 5      n[        U
SS 5      nUc  U(       a  [        USS 5      n[        U
R                  R                  U
R                  R                  5       US9eS n
A
f[         aA  n
[         R                   H  n[        X5      (       d  M  U
e   [        S[        U
5      S9eS n
A
ff = f)NTr,   r$   r.   r/   r2   r3      r4   r7   zfirst stream response receivedr8   r9   )r>   module_level_clientr@   rA   rB   rC   r   r.   r0   readrE   rF   rG   rH   rI   
iter_linesrK   r$   )r"   r#   r$   r%   r&   r'   rL   r(   r)   r.   rM   rN   rO   rP   response_headersrQ   s                   rR   make_sync_callrZ   ^   s~    ~,,>;;Dw  
& s""8Y= ,,MMO$
 	
 .#..0di
 :.5	   ....I    	
9d3 J5 ^#NItDM

..JJOO%!
 	

  > 88I!'' 9 c!f==	>s*   B! !E+5A(DE+*!E&E&&E+c                   f  ^  \ rS rSrSU 4S jjrSSS0 4S\S\S\S\S	\S
\	S\
\\R                  4   S\\   S\S\4S jjrS0 S4S\S\S\S\S	\S
\	S\
\\R                  4   S\S\S\S\S\\   S\
\\4   4S jjrSS0 S4S\S\S\S\S\S	\S
\	S\S\
\\R                  4   S\4S jjrS rSrU =r$ )AnthropicChatCompletion   r*   Nc                 "   > [         TU ]  5         g N)super__init__)self	__class__s    rR   ra    AnthropicChatCompletion.__init__   s        r&   r'   r#   custom_prompt_dictmodel_responseprint_verboser(   r"   r%   r)   c                    #    SUS'   [        UUU[        R                  " U5      UUUUUS9	I S h  vN u  nn[        UUSU[	        U5      S9nU$  N7f)NTr-   	r"   r#   r$   r%   r&   r'   rL   r(   r)   	anthropicrQ   r&   custom_llm_providerrL   _response_headers)rS   jsondumpsr   r   )rb   r&   r'   r#   rf   rg   rh   r(   r"   encodingr;   rL   r-   _is_function_callr%   r)   optional_paramslitellm_params	logger_fnr$   rQ   streamwrappers                         rR   acompletion_stream_function3AnthropicChatCompletion.acompletion_stream_function   sv     , X+4D!#
,
 
&
"7 ,/ +#7@
 %
&
s   .AA Ars   rt   c                 >  #    U=(       d!    [        [        R                  R                  S9n UR	                  UUXS9I S h  vN n[        5       R                  UUUU
U	UUUUUUS9$  N%! [
         a  nU
R                  UU	[        U5      SU0S9  [        USS5      n[        USS 5      n[        US[        U5      5      n[        US	S 5      nUc  U(       a  [        USS 5      nU(       a  [        US5      (       a  [        USU5      n[        UUUS
9eS nAff = f7f)N)llm_provider)r$   ro   r(   r8   r9   r0   r2   r$   textr.   r1   r0   r$   r&   raw_responserg   rL   r;   request_datar'   rs   rt   rq   r)   )r   r>   r	   	ANTHROPICr@   rE   rK   rH   rC   hasattrr   r!   transform_response)rb   r&   r'   r#   rf   rg   rh   r(   rq   r;   rL   r-   rr   r%   rs   r)   rt   ru   r$   r"   async_handlerr.   rM   r0   rN   
error_textrO   s                              rR   acompletion_function,AnthropicChatCompletion.acompletion_function   sQ    ,  
"8 --77#
	*//' 0  H2  33!)#+) 4 
 	
3  	!!"%a&!6 =	 "  "!]C8K#Ay$7M FCF3J$Q
D9N$ '	4 H'.&"A"A$^VZH
 "'% !	s;   +DA* A(A* !D(A* *
D4B!DDDrm   c                 ,   [         R                  " U5      nUR                  SS 5      nUR                  SS5      nUR                  SS5      nSn[         R                  " U5      n[        5       R	                  U	UUU0 UESU0ES9n[
        R                  " U[        U5      S9nUR                  UUUUUS9nU
R                  UU	UUUS.S	9  U" S
U 35        USL ap  USL aJ  U" S5        UUS'   U R                  UUUUUUUUU	U
UUUUUUUUUb  [        U[        5      (       a  US9$ S S9$ U R                  UUUUUUUUU	U
UUUUUUUUUS9$ USL aC  UUS'   [        UUU[        R                   " U5      UUU
UUS9	u  nn[#        UUSU
[%        U5      S9$ Ub  [        U[&        5      (       d
  ['        US9nOUn UR)                  UU[        R                   " U5      US9n[        5       R5                  UUUU
U	UUUUUUS9$ ! [*         a  n[-        USS5      n[-        USS 5      n[-        US[/        U5      5      n[-        USS 5      nUc  U(       a  [-        USS 5      nU(       a  [1        US5      (       a  [-        USU5      n[3        UUUS9eS nAff = f)Nr-   r)   Fis_vertex_request)r;   r$   r&   r'   rs   )r&   provider)r&   r'   rs   rt   r$   )r8   r#   r$   )r:   r;   r=   z_is_function_call: Tz,makes async anthropic streaming POST request)r&   r'   r%   r#   rf   rg   rh   rq   r;   rL   rs   r-   rr   r)   rt   ru   r$   r(   r"   )r&   r'   r%   r#   rf   rg   rh   rq   r;   rL   rs   r-   rr   rt   ru   r$   r"   r)   r(   rj   rk   rl   )r(   )r$   r%   r(   r0   r2   r$   r{   r.   r|   r}   )copydeepcopypopr!   validate_environmentr   get_provider_chat_configr	   transform_requestpre_callrw   rG   r   r   rZ   ro   rp   r   r   r   r@   rE   rC   rH   r   r   r   )rb   r&   r'   r#   rm   rf   rg   rh   rq   r;   rL   rs   r(   rt   acompletionru   r$   r"   r-   r)   r   rr   configr%   rQ   r.   rM   r0   rN   r   rO   s                                  rR   
completion"AnthropicChatCompletion.completion	  s   ( --8 $$Xt4)--k5A	"1"5"56I5"Q!==*!#88WW0CEVW 9 
 '??!"56

 ''+) ( 
 	'+$" 	 	
 	+,=+>?@$$LM!'X77%%'9#1"/%# +$3!&7'#1'## "-*VEU2V2V ) 8  , "- 8  4 00%%'9#1"/%# +$3!&7#1'#!'#' 1  0 $!'X-;!%#D)% +#'
.*!7 +&7(3 +&?&H  >FK)H)H(9F#F%{{  '!ZZ- '	  +  H*  33!)#+) 4 
 	
 ! ")!]C"@K$+Ay$$?M!(FCF!;J%,Q
D%AN$,(/	4(P%'.&*I*I%,^VZ%P
( *$/ - s   9&H   
J
BJJc                     g r_    rb   s    rR   	embedding!AnthropicChatCompletion.embedding  s    re   r   )r*   N)__name__
__module____qualname____firstlineno__ra   rH   listdictr   r   r   floatrA   Timeoutr   r   boolrw   r   r   r   r   __static_attributes____classcell__)rc   s   @rR   r\   r\      s   ( )** * 	*
 !* &*  * uemm+,* )** *  !*| -1)@
@
 @
 	@

 !@
 &@
  @
 uemm+,@
 @
 @
  !@
" #@
( )*)@
* 
}11	2+@
b %p
p
 p
 	p

 !p
 !p
 &p
  p
 p
 uemm+,p
 p
d re   r\   c            	           \ rS rSr SS\S\\   4S jjrS\4S jrS\\	\
4   S\4S jrS	\	S\4S
 jrS\S\\   S\\\\   4   4S jrS rS rS rS rS	\S\4S jrSrg)rI   i  r6   r)   c                 Z    Xl         U R                   U l        / U l        SU l        X0l        g )N)r5   response_iteratorcontent_blocks
tool_indexr)   )rb   r5   r6   r)   s       rR   ra   ModelResponseIterator.__init__  s,     #5!%!8!879"re   r*   c                     Sn[        U R                  5      S:X  a  gU R                  S   S   S   S:X  a  gU R                   H(  nUS   S   S:X  d  M  XS   R                  SS5      -  nM*     [        U5      S:X  a  g	g)
z>
Check if the tool call block so far has been an empty string
r7   r   Fdeltatype
text_deltainput_json_deltapartial_jsonT)lenr   get)rb   argsblocks      rR   check_empty_tool_call_args0ModelResponseIterator.check_empty_tool_call_args  s     t""#q(q!'*62lB((EW~f%);;g**>2>> ) t9>re   anthropic_usage_chunkc           	      V   [        UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      -   S9nUR                  S5      nUb  [        U[        5      (       a  X2S'   UR                  S5      nUb  [        U[        5      (       a  XBS'   U$ )Ninput_tokensr   output_tokens)prompt_tokenscompletion_tokenstotal_tokenscache_creation_input_tokenscache_read_input_tokens)r   r   rG   int)rb   r   usage_blockr   r   s        rR   _handle_usage#ModelResponseIterator._handle_usage  s     8/33NAF377K.22>1E#'';<
 '<&?&?)'
# '2z'8
 8
 :U56"7";";<U"V".:#S4
 4
 6M12re   chunkc           	          UR                  SS5      =(       d    SnSnS nSnSnS n[        UR                  SS5      5      nUS:X  a_   [        S$0 UD6n	U R                  R	                  U	5        SU	S   ;   a
  U	S   S   nGOS	U	S   ;   a  S S
S U	S   S	   S.U R
                  S.nGO|US:X  al   [        S$0 UD6n
/ U l        U
S   S   S:X  a
  U
S   S   nGOMU
S   S   S:X  a5  U =R
                  S-  sl        U
S   S   S
U
S   S   SS.U R
                  S.nGO
US:X  a7  [        S$0 UD6  U R                  5       nU(       a  S S
S SS.U R
                  S.nOUS:X  aF   [        S$0 UD6n[        US   R                  SS5      =(       d    SS9nU R                  US   S9nSnOUS:X  a+   [        S$0 UD6nSUS   ;   a  U R                  US   S   S9nOPUS:X  aJ   UR                  S0 5      =(       d    0 nUR                  SS 5      =(       d    [        U5      n[        USS 9eU R                  X4S!9u  p4[!        UUUUUUS"9nU$ ! ["        R$                   a    ['        S#U 35      ef = f)%Nr   r7   Findexr   content_block_deltar{   r   r   function)name	arguments)idr   r   r   content_block_startcontent_blocktool_user    r   r   content_block_stopz{}message_deltastop_reasonstop)finish_reasonusage)r   Tmessage_startr1   errorr2   )r1   r0   )r{   r   )r{   r   is_finishedr   r   r   z"Failed to decode JSON from chunk: r   )r   r   r   r   appendr   r   r   r   r   r
   r   r   rH   r   _handle_json_mode_chunkr   ro   JSONDecodeError
ValueError)rb   r   
type_chunkr{   r   r   r   r   r   r   r   is_emptyr   message_start_block_error_dictr1   returned_chunks                    rR   chunk_parser"ModelResponseIterator.chunk_parser  s#   ~	K62.4"JD>BHKM8<E		'1-.E22 !2 :E :##**=9]733(1&9D#}W'==" *$()6w)?)O% "& H 44 '8&@%&@#&(#&7?6I.?GD(9&AZOOOq(O1/B4H *$7$H$P)+% "& H 33 )5)::<" *$()-% "& H .
 !2 :E : 1"/"8"<"<]F"S #! **wAW*X".& '8&@%&@#1)<< ...A).LW.U / E w& $ii4:%//)T:Hc%j$# # 
 "99t9WND2!'+N "!## 	KA%IJJ	Ks   II #I'r{   r   c                     U R                   SL a2  Ub/  [        R                  " U/S9nUb  UR                  =(       d    SnSnX4$ )a  
If JSON mode is enabled, convert the tool call to a message.

Anthropic returns the JSON schema as part of the tool call
OpenAI returns the JSON schema as part of the content, this handles placing it in the content

Args:
    text: str
    tool_use: Optional[ChatCompletionToolCallChunk]
Returns:
    Tuple[str, Optional[ChatCompletionToolCallChunk]]

    text: The text to use in the content
    tool_use: The ChatCompletionToolCallChunk to use in the chunk response
TN)
tool_callsr7   )r)   r!   !_convert_tool_response_to_messagecontent)rb   r{   r   r1   s       rR   r   -ModelResponseIterator._handle_json_mode_chunkz  sM    $ >>T!h&:%GG$:G ","~re   c                     U $ r_   r   r   s    rR   __iter__ModelResponseIterator.__iter__  s    re   c           	          U R                   R                  5       n Un[        U[        5      (       a,  UR                  S5      nUR                  S5      nUS:w  a  X4S  nUR                  S5      (       a(  [        R                  " USS  5      nU R                  US9$ [        SSSS S	S S
9$ ! [         a    [        e[         a  n[	        SU 35      eS nAff = f! [         a    [        e[         a  n[	        SU SU 35      eS nAff = fNz#Error receiving chunk from stream: utf-8data:r      r   r7   Fr   r{   r   r   r   r   r   zError parsing chunk: z,
Received chunk: )r   __next__StopIterationr   RuntimeErrorrG   bytesdecodefind
startswithro   loadsr   r   rb   r   rM   str_liner   	data_jsons         rR   r   ModelResponseIterator.__next__  s)   	J**335E	VH%'' <<0 g.B;'/H""7++ JJx|4	((y(99, %"$! #  	  	J!DQCHII	J.  	  	V!6qc9LUGTUU	Vs5   B, B C C ,CCCD
4DD
c                 D    U R                   R                  5       U l        U $ r_   )r5   	__aiter__async_response_iteratorr   s    rR   r   ModelResponseIterator.__aiter__  s    '+'>'>'H'H'J$re   c           	      6  #     U R                   R                  5       I S h  vN n Un[        U[        5      (       a,  UR                  S5      nUR                  S5      nUS:w  a  X4S  nUR                  S5      (       a(  [        R                  " USS  5      nU R                  US9$ [        SSSS S	S S
9$  N! [         a    [        e[         a  n[	        SU 35      eS nAff = f! [         a    [        e[         a  n[	        SU SU 35      eS nAff = f7fr   )r  	__anext__StopAsyncIterationr   r   rG   r   r   r   r   ro   r   r   r   r   s         rR   r  ModelResponseIterator.__anext__  s2    	J66@@BBE	VH%'' <<0 g.B;'/H""7++ JJx|4	((y(99, %"$! % C! 	%$$ 	J!DQCHII	J. " 	%$$ 	V!6qc9LUGTUU	Vsb   DB8 B6B8 B C' 'D(C' 5D6B8 8C$CC$$D'D DDDc           	          Un[        U[        5      (       a,  UR                  S5      nUR                  S5      nUS:w  a  X#S nUR	                  S5      (       a(  [
        R                  " USS 5      nU R                  US9$ [        SSSSS	SS
9$ )z
Convert a string chunk to a GenericStreamingChunk

Note: This is used for Anthropic pass through streaming logging

We can move __anext__, and __next__ to use this function since it's common logic.
Did not migrate them to minmize changes made in 1 PR.
r   r   r   Nr   r   r7   Fr   r   )	rG   r   r   r   r   ro   r   r   r   )rb   r   r   r   r   s        rR   "convert_str_chunk_to_generic_chunk8ModelResponseIterator.convert_str_chunk_to_generic_chunk  s     eU##||G,HMM'*E{#F+w''

8AB<0I$$9$55(!  re   )r  r   r)   r   r5   r   N)F)r   r   r   r   r   r   ra   r   r   r   r   r   r   r   r   rH   r   r   r   r   r   r   r  r  r   r   re   rR   rI   rI     s    QV#/3#@H#D (%*4+;%<	*6K$ K+@ KB#+,G#H	sH899	::VDVB @U re   rI   )8__doc__r   ro   typingr   r   r   r   r   r   rA   r>   litellm.litellm_core_utilslitellm.typeslitellm.types.utilsr	   'litellm.litellm_core_utils.core_helpersr
   &litellm.llms.custom_httpx.http_handlerr   r   r   litellm.types.llms.anthropicr   r   r   r   r   r   r   litellm.types.llms.openair   r   r   litellm.utilsr   r   r   baser   common_utilsr   r   transformationr!   rH   r   r   r   r   r   HeadersrS   rZ   r\   rI   r   re   rR   <module>r     s     > >   !     E 
   6 S S  D +0/%&0/0/ 0/ 	0/
 0/ 0/ eE5==0120/ 0/ 30/f6/[!6/6/ 6/ 	6/
 6/ 6/ eE5==0126/ 6/ 36/rfg fR	| |re   