
    hх                     J   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, d
dl-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 erddl4m5Z5 ddl6m7Z7 de	e   de8de9de8de8de:de	ee;ejx                  f      de=de
eej|                  f   fdZ?de	e   de8de9de8de8de:de	ee;ejx                  f      de=de
eej|                  f   fdZ@ G d de.      ZA G d d       ZBy)!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   )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.   r/   streamr2   r.   responsestatus_codemessager.     r:   r;   Fstreaming_responsesync_streamr3    complete_input_dictinputapi_keyoriginal_responseadditional_args)litellmmodule_level_aclientposthttpxHTTPStatusErrorgetattrr%   r8   r:   aread	ExceptionLITELLM_EXCEPTION_TYPES
isinstancestrModelResponseIteratoraiter_lines	post_callr.   )r,   r-   r.   r/   r0   r1   logging_objr2   r3   r8   eerror_headerserror_response	exceptioncompletion_streams                  _/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/anthropic/chat/handler.py	make_callr]   A   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)NTr6   r.   r8   r9   r<   r=      r>   rA   zfirst stream response receivedrB   rC   )rH   module_level_clientrJ   rK   rL   rM   r%   r8   r:   readrO   rP   rQ   rR   rS   
iter_linesrU   r.   )r,   r-   r.   r/   r0   r1   rV   r2   r3   r8   rW   rX   rY   rZ   response_headersr[   s                   r\   make_sync_callrd   t   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 )AnthropicChatCompletionr4   Nc                 "    t         |           y N)super__init__)self	__class__s    r\   rj   z AnthropicChatCompletion.__init__   s        r0   r1   r-   custom_prompt_dictmodel_responseprint_verboser2   r,   r/   r3   c                    K   ddl m} d|d<   t        |||t        j                  |      |||||	       d {   \  }} |||d|t        |            }|S 7 w)Nr   r)   Tr7   	r,   r-   r.   r/   r0   r1   rV   r2   r3   	anthropicr[   r0   custom_llm_providerrV   _response_headers),litellm.litellm_core_utils.streaming_handlerr*   r]   jsondumpsr&   )rk   r0   r1   r-   rn   ro   rp   r2   r,   encodingrE   rV   r7   _is_function_callr/   r3   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.   rx   r2   rB   rC   r:   r<   r.   textr8   r;   r:   r.   r0   raw_responsero   rV   rE   request_datar1   r|   r}   rz   r3   )r   rH   r   	ANTHROPICrJ   rO   rU   rR   rM   hasattrr%   transform_response)rk   r0   r1   r-   rn   ro   rp   r2   rz   rE   rV   r7   r{   r/   r|   r3   r}   r   r~   r.   r,   async_handlerr8   rW   r:   rX   
error_textrY   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ru   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)   )ProviderConfigManagerr7   r3   Fis_vertex_request)rE   r.   r0   r1   r|   r}   )r0   providerz%Provider config not found for model: z and provider: )r0   r1   r|   r}   r.   )rB   r-   r.   )rD   rE   rG   z_is_function_call: Tz,makes async anthropic streaming POST request)r0   r1   r/   r-   rn   ro   rp   rz   rE   rV   r|   r7   r{   r3   r}   r~   r.   r2   r,   )r0   r1   r/   r-   rn   ro   rp   rz   rE   r   rV   r|   r7   r{   r}   r~   r.   r,   r3   r2   rr   rs   rt   r2   )params)r.   r/   r2   r:   r<   r.   r   r8   r   r   )rw   r*   litellm.utilsr   copydeepcopypopr(   validate_environmentget_provider_chat_configr   
ValueErrortransform_requestpre_callr   rQ   r   r   rd   rx   ry   r&   r   r   rJ   rO   rM   rR   r   r%   r   )!rk   r0   r1   r-   ru   rn   ro   rp   rz   rE   rV   r|   r2   r}   acompletionr~   r.   r,   r*   r   r7   r3   r   r{   configr/   r[   r8   rW   r:   rX   r   rY   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 rh    rk   s    r\   	embeddingz!AnthropicChatCompletion.embedding  s    rm   )r4   N)__name__
__module____qualname__rj   rR   listdictr   r   r
   floatrK   Timeoutr   r   boolr   r   r   r   __classcell__)rl   s   @r\   rf   rf      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rm   rf   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)rS   r@   r3   c                 z    || _         | j                   | _        g | _        d| _        || _        d| _        d| _        y )NF)r?   response_iteratorcontent_blocks
tool_indexr3   is_response_format_toolconverted_response_format_tool)rk   r?   r@   r3   s       r\   rj   zModelResponseIterator.__init__  sB     #5!%!8!879" .3$49+rm   r4   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
        rA   r   Fdeltatype
text_deltathinking_deltainput_json_deltapartial_jsonT)lenr   get)rk   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>rm   anthropic_usage_chunkc                 T    t               j                  t        t        |      d       S )N)usage_objectreasoning_content)r(   calculate_usager   r   )rk   r   s     r\   _handle_usagez#ModelResponseIterator._handle_usage
  s*     00d$9:d 1 
 	
rm   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
        rA   Nr   r   r   functionname	argumentsidr   r   indexcitationthinking	signature)r   r   r   thinking_blocksr   )r   r   appendr   r   r   )rk   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Hrm   r   c                 |    d}|D ]4  }t        t        t           |j                  d            }|d}|0||z  }6 |S )z.
        Handle the reasoning content
        Nr   rA   )r   r   rR   r   )rk   r   r   r   thinking_contents        r\   _handle_reasoning_contentz/ModelResponseIterator._handle_reasoning_content@  sT     !$E#HSM599Z3HI ($&!+!%55! % ! rm   content_block_startr   c                 <    t        d|d   d         g}||d<   ||fS )z6
        Handle the redacted thinking content
        redacted_thinkingr   r/   )r   r/   r   )r   )rk   r   r   r   s       r\   !_handle_redacted_thinking_contentz7ModelResponseIterator._handle_redacted_thinking_contentR  s>     0((9&A
 7F !23 888rm   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   )rk   r   r   r   r   s        r\   get_content_block_startz-ModelResponseIterator.get_content_block_startd  sS    	

 99_b)--f5C":"CU"C #" #8"@%"@""rm   c                    	 |j                  dd      xs d}d}d }d}d }i }d }d }	t        |j                  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|"      }|S # t(        j*                  $ r t-        d#|       w xY w)%Nr   rA   r   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   z"Failed to decode JSON from chunk: r   )r   intr   r   r   r   r   r   r   r   r   _handle_message_deltar   r   rR   r%   _handle_json_mode_chunkr   r    r   rx   JSONDecodeErrorr   )rk   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_parserq  s=   R	K62.4"JD>BHM%)E79$/3   		'1-.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& )N. "!## 	KA%IJJ	Ks   H'H* *"I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   rA   )r   T)r3   r   r   r   r(   !_convert_tool_response_to_messager   r   )rk   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~rm   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   )rk   r   r   r   r   s        r\   r   z+ModelResponseIterator._handle_message_delta6  sh     *2E2)'044]FKUv

 .."M""w9O"Pe##rm   c                     | S rh   r   r   s    r\   __iter__zModelResponseIterator.__iter__L  s    rm   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   rA   Fr   )r   is_finishedr   r   r   r   zError parsing chunk: z,
Received chunk: )r   __next__StopIterationr   RuntimeErrorrQ   bytesdecodefind
startswithrx   loadsr   r   rk   r   rW   str_liner   	data_jsons         r\   r
  zModelResponseIterator.__next__O  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 rh   )r?   	__aiter__async_response_iteratorr   s    r\   r  zModelResponseIterator.__aiter__q  s    '+'>'>'H'H'J$rm   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  rQ   r  r  r  r  rx   r  r   r   r  s         r\   r  zModelResponseIterator.__anext__u  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               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   )	rQ   r  r  r  r  rx   r  r   r   )rk   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&((rm   N)F)"r   r   r   r   r   rj   r   r
   r   r   r!   r   r	   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r   rm   r\   rS   rS     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 #SK$ SK+> SKj..#+,G#H.	sH899	:.`$4 $E#x:N4O $,VDVB) )@S )rm   rS   )C__doc__r   rx   typingr   r   r   r   r   r   r	   r
   r   rK   rH   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!   baser#   common_utilsr%   r&   transformationr(   rw   r*   )litellm.llms.base_llm.chat.transformationr+   rR   r   r   r   r   r   Headersr]   rd   rf   rS   r   rm   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	F) F)rm   