
    jՆ                     N   d 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
mZmZ ddlZddlZddlZddlZddl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mZmZmZm Z m!Z! ddl"m#Z#m$Z$m%Z% dd	lm&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d
dl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 erddl5m6Z6 ddl7m8Z8 de	e   de9de:de9de9de;de	ee<ejz                  f      de>de
eej~                  f   fdZ@de	e   de9de:de9de9de;de	ee<ejz                  f      de>de
eej~                  f   fdZA G d de/      ZB G d d       ZCy)!zE
Calling + translation logic for anthropic's `/v1/messages` endpoint
    N)	TYPE_CHECKINGAnyCallableDictListOptionalTupleUnioncast)RESPONSE_FORMAT_TOOL_NAME)map_finish_reason)AsyncHTTPHandlerHTTPHandler_get_httpx_clientget_async_httpx_client)ContentBlockDeltaContentBlockStartContentBlockStopMessageBlockDeltaMessageStartBlock
UsageDelta)#ChatCompletionRedactedThinkingBlockChatCompletionThinkingBlockChatCompletionToolCallChunk)DeltaGenericStreamingChunkLlmProvidersModelResponseModelResponseStreamStreamingChoicesUsage_generate_id   )BaseLLM   )AnthropicErrorprocess_anthropic_headers   )AnthropicConfigCustomStreamWrapper)
BaseConfigclientapi_baseheadersdatamodelmessagestimeout	json_modereturnc	                   K   | t         j                  } 	 | j                  |||d|       d {   }	t        |	j                         d|	      }|j!                  |d
|d|i       ||	j"                  fS 7 E# t        j                  $ rs}
t        |
dd       }t        |
dd       }||rt        |dd       }t        |
j                  j                  |
j                  j                          d {  7  |      d }
~
wt        $ r>}
t         j                  D ]  }t        |
|      s|
 t        dt        |
            d }
~
ww xY ww)NTr/   r0   streamr3   r/   responsestatus_codemessager/     r;   r<   Fstreaming_responsesync_streamr4    complete_input_dictinputapi_keyoriginal_responseadditional_args)litellmmodule_level_aclientposthttpxHTTPStatusErrorgetattrr&   r9   r;   aread	ExceptionLITELLM_EXCEPTION_TYPES
isinstancestrModelResponseIteratoraiter_lines	post_callr/   )r-   r.   r/   r0   r1   r2   logging_objr3   r4   r9   eerror_headerserror_response	exceptioncompletion_streams                  |/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/chat/handler.py	make_callr^   B   sW     ~-->gDw % 
 
& .#//1 +.5	   h....C
    	
9d3 J5 ^#NItDM

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

  > 88I!Y' 9 c!f==	>sW   EA7 A5A7 AE5A7 7E
A"C8,C/-C88ED=$D==EEc	                    | t         j                  } 	 | j                  |||d|      }	|	j                  dk7  r3t        |	dd       }t        |	j                  |	j                         |      t        |	j                         d|	      }|j!                  |d
dd|i       ||	j"                  fS # t        j                  $ rj}
t        |
dd       }t        |
dd       }||rt        |dd       }t        |
j                  j                  |
j                  j                         |      d }
~
wt        $ r>}
t         j                  D ]  }t        |
|      s|
 t        dt        |
            d }
~
ww xY w)NTr7   r/   r9   r:   r=   r>      r?   rB   zfirst stream response receivedrC   rD   )rI   module_level_clientrK   rL   rM   rN   r&   r9   r;   readrP   rQ   rR   rS   rT   
iter_linesrV   r/   )r-   r.   r/   r0   r1   r2   rW   r3   r4   r9   rX   rY   rZ   r[   response_headersr\   s                   r]   make_sync_callre   u   s    ~,,>;;gDw  
& s""8Y= ,,MMO$
 	
 .#..0di
 :.5	   h....I    	
9d3 J5 ^#NItDM

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

  > 88I!Y' 9 c!f==	>s*   B- -E/ A%D%%E/1E*E**E/c                   R    e Zd Zd fdZdddi fdededededed	ed
e	e
ej                  f   dee   dedefdZdi dfdededededed	ed
e	e
ej                  f   dededededddee   de	edf   fdZddi dfdedededededed	eded
e	e
ej                  f   defdZd Z xZS )AnthropicChatCompletionr5   Nc                 "    t         |           y N)super__init__)self	__class__s    r]   rk   z AnthropicChatCompletion.__init__   s        r1   r2   r.   custom_prompt_dictmodel_responseprint_verboser3   r-   r0   r4   c                    K   ddl m} d|d<   t        |||t        j                  |      |||||	       d {   \  }} |||d|t        |            }|S 7 w)Nr   r*   Tr8   	r-   r.   r/   r0   r1   r2   rW   r3   r4   	anthropicr\   r1   custom_llm_providerrW   _response_headers),litellm.litellm_core_utils.streaming_handlerr+   r^   jsondumpsr'   )rl   r1   r2   r.   ro   rp   rq   r3   r-   encodingrF   rW   r8   _is_function_callr0   r4   optional_paramslitellm_params	logger_fnr/   r+   r\   streamwrappers                          r]   acompletion_stream_functionz3AnthropicChatCompletion.acompletion_stream_function   s{     , 	UX+4D!#
,
 
&
"7 ,/ +#7@
 %
&
s   6AA Ar}   r~   provider_configr,   r+   c                 "  K   |xs$ t        t        j                  j                        }	 |j	                  ||||       d {   }|j                  ||||
|	||||||      S 7  # t
        $ r}|
j                  ||	t        |      d|i       t        |dd      }t        |dd       }t        |dt        |            }t        |d	d       }||rt        |dd       }|rt        |d      rt        |d|      }t        |||
      d }~ww xY ww)N)llm_provider)r/   ry   r3   rC   rD   r;   r=   r/   textr9   r<   r;   r/   r1   raw_responserp   rW   rF   request_datar2   r}   r~   r{   r4   )r   rI   r   	ANTHROPICrK   rP   rV   rS   rN   hasattrr&   transform_response)rl   r1   r2   r.   ro   rp   rq   r3   r{   rF   rW   r8   r|   r0   r}   r4   r~   r   r   r/   r-   async_handlerr9   rX   r;   rY   
error_textrZ   s                               r]   acompletion_functionz,AnthropicChatCompletion.acompletion_function   sN    .  
"8 --77#
	*//'g 0  H2 11!)#+) 2 
 	
3  	!!"%a&!6 =	 "  "!]C8K#Ay$7M FCF3J$Q
D9N$ '	4 H'.&"A$^VZH
 "'% !	s;   )DA' A%A' 	D%A' '	D0BDDDrv   c                 X   ddl m} ddlm} t	        j
                  |      }|j                  dd       }|j                  dd      }|j                  dd      }d}t	        j
                  |      }t               j                  |	|||i |d|i|      }|j                  |t        |      	      }|t        d
| d|       |j                  |||||      }|
j                  ||	|||d        |d|        |du rs|du rJ |d       ||d<   | j                  |||||||||	|
|||||||||t        |t               r|      S d       S | j#                  |||||||||	||
|||||||||      S |du rE||d<   t%        |||t'        j(                  |      |||
||	      \  }} |||d|
t+        |            S |t        |t,              st/        d|i      }n|}	 |j1                  ||t'        j(                  |      |      }|j=                  ||||
|	||||||       S # t2        $ r|}t5        |dd      }t5        |dd       }t5        |dt7        |            }t5        |dd       } || rt5        | dd       }| rt9        | d      rt5        | d|      }t;        |||      d }~ww xY w)!Nr   r*   )ProviderConfigManagerr8   r4   Fis_vertex_request)rF   r/   r1   r2   r}   r~   )r1   providerz%Provider config not found for model: z and provider: )r1   r2   r}   r~   r/   )rC   r.   r/   )rE   rF   rH   z_is_function_call: Tz,makes async anthropic streaming POST request)r1   r2   r0   r.   ro   rp   rq   r{   rF   rW   r}   r8   r|   r4   r~   r   r/   r3   r-   )r1   r2   r0   r.   ro   rp   rq   r{   rF   r   rW   r}   r8   r|   r~   r   r/   r-   r4   r3   rs   rt   ru   r3   )params)r/   r0   r3   r;   r=   r/   r   r9   r   r   )rx   r+   litellm.utilsr   copydeepcopypopr)   validate_environmentget_provider_chat_configr   
ValueErrortransform_requestpre_callr   rR   r   r   re   ry   rz   r'   r   r   rK   rP   rN   rS   r   r&   r   )!rl   r1   r2   r.   rv   ro   rp   rq   r{   rF   rW   r}   r3   r~   acompletionr   r/   r-   r+   r   r8   r4   r   r|   configr0   r\   r9   rX   r;   rY   r   rZ   s!                                    r]   
completionz"AnthropicChatCompletion.completion#  s   ( 	U7--8 $$Xt4)--k5A	"1"5"56I5"Q!==*!#88WW0CEVW) 9 
 '??!"56 @ 
 >7woNaMbc  ''+) ( 
 	'+$" 	 	
 	+,=+>?@$$LM!'X77%%'9#1"/%# +$3!&7'#1'## "-*VEU2V ) 8  , "- 8  4 00%%'9#1"/%#$* +$3!&7#1'#!'#) 1  2 $!'X-;!%#D)% +#'
.*!7 +&7(3 +&?&H  >FK)H. )73F $F%{{  '!ZZ- '	  +  H* ((!)#+) ) 
 	
 ! ")!]C"@K$+Ay$$?M!(FCF!;J%,Q
D%AN$,(/	4(P%'.&*I%,^VZ%P
( *$/ - s    (H$ $	J)-A7J$$J)c                      y ri    rl   s    r]   	embeddingz!AnthropicChatCompletion.embedding  s    rn   )r5   N)__name__
__module____qualname__rk   rS   listdictr   r   r
   floatrL   Timeoutr   r   boolr   r   r   r   __classcell__)rm   s   @r]   rg   rg      s   ( ),, , 	,
 !, &,  , uemm+,, )*, ,  !,B -1+A
A
 A
 	A

 !A
 &A
  A
 uemm+,A
 A
 A
  !A
" #A
$ &%A
* )*+A
, 
}33	4-A
d %{
{
 {
 	{

 !{
 !{
 &{
  {
 {
 uemm+,{
 {
zrn   rg   c            
       z   e Zd Z	 ddedee   fdZdefdZdeee	f   de
fdZdedeeee   eeeef      eeef   f   fd	Zd
eeeef      dee   fdZdedeeef   deee   eeef   f   fdZdedefdZdedefdZdedee   deeee   f   fdZdedeeee
   f   fdZd Zd Zd Zd Z dedefdZ!y)rT   rA   r4   c                     || _         | j                   | _        g | _        d| _        || _        t               | _        d| _        d| _        y )NF)	r@   response_iteratorcontent_blocks
tool_indexr4   r"   response_idis_response_format_toolconverted_response_format_tool)rl   r@   rA   r4   s       r]   rk   zModelResponseIterator.__init__  sL     #5!%!8!879"'> .3$49+rn   r5   c                 $   d}t        | j                        dk(  ry| j                  d   d   d   dk(  s| j                  d   d   d   dk(  ry| j                  D ]&  }|d   d   dk(  s||d   j                  d	d      z  }( t        |      dk(  ry
y)zN
        Check if the tool call block so far has been an empty string
        rB   r   Fdeltatype
text_deltathinking_deltainput_json_deltapartial_jsonT)lenr   get)rl   argsblocks      r]   check_empty_tool_call_argsz0ModelResponseIterator.check_empty_tool_call_args  s     t""#q( "7+F3|C""1%g.v6:JJ((EW~f%);;g**>2>> ) t9>rn   anthropic_usage_chunkc                 T    t               j                  t        t        |      d       S )N)usage_objectreasoning_content)r)   calculate_usager   r   )rl   r   s     r]   _handle_usagez#ModelResponseIterator._handle_usage  s*     00d$9:d 1 
 	
rn   chunkc                    d}d}i }t        di |}g }| j                  j                  |       d|d   v r	|d   d   }nd|d   v rddd|d   d   d| j                  d}n]d	|d   v r|d   d	   |d	<   nJd
|d   v sd|d   v r<t	        d
|d   j                  d
      xs d|d   j                  d            g}||d<   ||||fS )zC
        Helper function to handle the content block delta
        rB   Nr   r   r   functionname	argumentsidr   r   indexcitationthinking	signature)r   r   r   thinking_blocksr   )r   r   appendr   r   r   )rl   r   r   tool_useprovider_specific_fieldscontent_blockr   s          r]   _content_block_delta_helperz1ModelResponseIterator._content_block_delta_helper  s1    :>#% )2E2  	 	""=1]7++ )&1D}W55" !.w!7!G H =113@3I*3U$Z0-00mG44 ,#*7377
CIr+G488EO ;J$%67X0HHHrn   r   c                 |    d}|D ]4  }t        t        t           |j                  d            }|d}|0||z  }6 |S )z.
        Handle the reasoning content
        Nr   rB   )r   r   rS   r   )rl   r   r   r   thinking_contents        r]   _handle_reasoning_contentz/ModelResponseIterator._handle_reasoning_contentC  sT     !$E#HSM599Z3HI ($&!+!%55! % ! rn   content_block_startr   c                 <    t        d|d   d         g}||d<   ||fS )z6
        Handle the redacted thinking content
        redacted_thinkingr   r0   )r   r0   r   )r   )rl   r   r   r   s       r]   !_handle_redacted_thinking_contentz7ModelResponseIterator._handle_redacted_thinking_contentU  s>     0((9&A
 7F !23 888rn   c                     ddl m}m} |j                  di       j                  d      dk(  r
 |di |}|S  |di |}|S )Nr   )ContentBlockStartTextContentBlockStartToolUser   r   r   r   )litellm.types.llms.anthropicr   r   r   )rl   r   r   r   r   s        r]   get_content_block_startz-ModelResponseIterator.get_content_block_startg  sS    	

 99_b)--f5C":"CU"C #" #8"@%"@""rn   c                    	 |j                  dd      xs d}d}d }d}d }i }d }d }	d}
|dk(  r/	 | j                  |      \  }}}	}|	r|| j                  |	      }nh|dk(  r	 | j                  |      }g | _        |d   d   d	k(  r
|d   d	   }n4|d   d   d
k(  r6| xj
                  dz  c_        |d   d   d|d   d   dd| j
                  d}n|d   d   dk(  r| j                  ||      \  }	}n|dk(  r9t        d#i | | j                         }|rd dd dd| j
                  d}d| _	        n|dk(  r| j                  |      \  }}ny|dk(  r,	 t        d#i |}d|d   v ra| j                  |d   d         }nH|dk(  rC	 |j                  di       xs i }|j                  dd       xs t        |      }t        |d      | j                  ||      \  }}t!        t#        |
t%        |||gnd |r|nd |	r|	nd |      |       g|| j&                  !      }|S # t(        j*                  $ r t-        d"|       w xY w)$Nr   rB   r   content_block_deltar   )r   r   r   r   r   r(   r   r   r   r   r   r   )r   r   content_block_stopz{}Fmessage_deltamessage_startusager<   r   errorr=   )r<   r;   )r   r   )content
tool_callsr   r   r   )r   r   finish_reason)choicesr   r   z"Failed to decode JSON from chunk: r   )r   r   r   r   r   r   r   r   r   r   _handle_message_deltar   r   rS   r&   _handle_json_mode_chunkr   r    r   r   ry   JSONDecodeErrorr   )rl   r   
type_chunkr   r   r   r   r   r   r   r   r   is_emptymessage_start_block_error_dictr<   returned_chunks                    r]   chunk_parserz"ModelResponseIterator.chunk_parsert  s6   T	K62.4"JD>BHM%)E79$/3   E22 4454A#,"(,(F(F(7 )G )% 44
 '+&B&B&B&O#&(#&7?6I.?GD(9&AZOOOq(O1/B4H *$7$H$P)+% "& H (8@DWW
 >>,?1I ? '0
 33 )5)::<" *$()-% "& H 05,.'+'A'A%'H$u.& '8&@%&@#1)<< ...A).LW.U / E w& $ii4:%//)T:Hc%j$# # 
 "99th9WND(0$##$(5=5Izt $< !9%) 4C.? '4& ##+N0 "!## 	KA%IJJ	Ks   HH "H>r   r   c                 ,   | j                   r|||fS |j                  d      0|j                  di       j                  dd      }|t        k(  | _        | j                  r2t	        j
                  |g      }||j                  xs d}d}d| _        ||fS )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

        Tool streaming follows Anthropic's fine-grained streaming pattern:
        - content_block_start: Contains complete tool info (id, name, empty arguments)
        - content_block_delta: Contains argument deltas (partial_json)
        - content_block_stop: Signals end of tool

        Reference: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/fine-grained-tool-streaming

        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
        Nr   r   r   rB   )r   T)r4   r   r   r   r)   !_convert_tool_response_to_messager   r   )rl   r   r   	tool_namer<   s        r]   r   z-ModelResponseIterator._handle_json_mode_chunk  s    2 ~~!1>! <<) !Z488DI+48Q+QD( ''%GG$:G ","6:3X~rn   c                     t        di |}t        |d   j                  dd      xs d      }| j                  rd}| j	                  |d         }||fS )z
        Handle message_delta event for finish_reason and usage.

        Args:
            chunk: The message_delta chunk

        Returns:
            Tuple of (finish_reason, usage)
        r   stop_reasonstop)r   r   r   r   )r   r   r   r   r   )rl   r   r   r   r   s        r]   r   z+ModelResponseIterator._handle_message_delta;  sh     *2E2)'044]FKUv

 .."M""w9O"Pe##rn   c                     | S ri   r   r   s    r]   __iter__zModelResponseIterator.__iter__Q  s    rn   c                    	 | j                   j                         }	 |}t        |t              r,|j                  d      }|j                  d      }|dk7  r||d  }|j                  d      r*t        j                  |dd        }| j                  |      S t        dddd d	d 
      S # t        $ r t        t        $ r}t	        d|       d }~ww xY w# t        $ r t        t        $ r}t	        d| d|       d }~ww xY wNz#Error receiving chunk from stream: utf-8data:r      r   rB   Fr   )r   is_finishedr   r   r   r   zError parsing chunk: z,
Received chunk: )r   __next__StopIterationr   RuntimeErrorrR   bytesdecodefind
startswithry   loadsr   r   rl   r   rX   str_liner   	data_jsons         r]   r  zModelResponseIterator.__next__T  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' A8C C 'C>CCD+C<<Dc                 D    | j                   j                         | _        | S ri   )r@   	__aiter__async_response_iteratorr   s    r]   r  zModelResponseIterator.__aiter__v  s    '+'>'>'H'H'J$rn   c                 $  K   	 | j                   j                          d {   }	 |}t        |t              r,|j                  d      }|j                  d      }|dk7  r||d  }|j                  d      r*t        j                  |dd        }| j                  |      S t        dddd d	d 
      S 7 # t        $ r t        t        $ r}t	        d|       d }~ww xY w# t        $ r t        t        $ r}t	        d| d|       d }~ww xY wwr  )r  	__anext__StopAsyncIterationr   r  rR   r  r  r  r  ry   r  r   r   r  s         r]   r  zModelResponseIterator.__anext__z  s/    	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B3 B1B3 A8C  D C  0D1B3 3C
CCD D7DDDc                     |}t        |t              r,|j                  d      }|j                  d      }|dk7  r||d }|j	                  d      r*t        j                  |dd       }| j                  |      S t        | j                        S )a%  
        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   )r   )
rR   r  r  r  r  ry   r  r   r   r   )rl   r   r  r   r  s        r]   "convert_str_chunk_to_generic_chunkz8ModelResponseIterator.convert_str_chunk_to_generic_chunk  s     eU#||G,HMM'*E{#EF+w'

8AB<0I$$9$55&$*:*:;;rn   N)F)"r   r   r   r   r   rk   r   r
   r   r   r!   r   r	   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   rn   r]   rT   rT     s   QV:/3:@H: D .
5z9I3J 
u 

/I/I	,-U.0SSTUS#X	
/Ib!-/RRS
!
 
#!$9.9 #'sCx.9 
t78$sCx.H	I	9$#T #6G #UK$ UK+> UKn..#+,G#H.	sH899	:.`$4 $E#x:N4O $,VDVB< <@S <rn   rT   )D__doc__r   ry   typingr   r   r   r   r   r   r	   r
   r   rL   rI   litellm.litellm_core_utilslitellm.typeslitellm.types.utilslitellm.constantsr   'litellm.litellm_core_utils.core_helpersr   &litellm.llms.custom_httpx.http_handlerr   r   r   r   r   r   r   r   r   r   r   litellm.types.llms.openair   r   r   r   r   r   r   r   r    r!   r"   baser$   common_utilsr&   r'   transformationr)   rx   r+   )litellm.llms.base_llm.chat.transformationr,   rS   r   r   r   r   r   Headersr^   re   rg   rT   r   rn   r]   <module>r,     s    
 
 
   !   7 E   
	 	 	  D +P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tg tn	J< J<rn   