
    gl                        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	 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 ddlmZmZmZmZmZmZmZ ddlmZm Z  dd	lm!Z! dd
l"m#Z#m$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, dee   de-de.de-de-de/dee	e0e
jb                  f      de2deee
jf                  f   fdZ4dee   de-de.de-de-de/dee	e0e
jb                  f      de2deee
jf                  f   fdZ5 G d de'      Z6 G d d      Z7y) 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	                   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%   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                  X/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/anthropic/chat/handler.py	make_callrS   +   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)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    ~,,>;;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                   N    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ee   de	ee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 )AnthropicChatCompletionr*   Nc                 "    t         |           y N)super__init__)self	__class__s    rR   r`   z AnthropicChatCompletion.__init__   s        r&   r'   r#   custom_prompt_dictmodel_responseprint_verboser(   r"   r%   r)   c                    K   d|d<   t        |||t        j                  |      |||||	       d {   \  }}t        ||d|t	        |            }|S 7 "w)NTr-   	r"   r#   r$   r%   r&   r'   rL   r(   r)   	anthropicrQ   r&   custom_llm_providerrL   _response_headers)rS   jsondumpsr   r   )ra   r&   r'   r#   rd   re   rf   r(   r"   encodingr;   rL   r-   _is_function_callr%   r)   optional_paramslitellm_params	logger_fnr$   rQ   streamwrappers                         rR   acompletion_stream_functionz3AnthropicChatCompletion.acompletion_stream_function   sw     , X+4D!#
,
 
&
"7 ,/ +#7@
 %
&
s   0AA#Arq   rr   c                 2  K   |xs$ t        t        j                  j                        }	 |j	                  ||||       d {   }t               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$   rm   r(   r8   r9   r0   r2   r$   textr.   r1   r0   r$   r&   raw_responsere   rL   r;   request_datar'   rq   rr   ro   r)   )r   r>   r	   	ANTHROPICr@   rE   rK   rH   rC   hasattrr   r!   transform_response)ra   r&   r'   r#   rd   re   rf   r(   ro   r;   rL   r-   rp   r%   rq   r)   rr   rs   r$   r"   async_handlerr.   rM   r0   rN   
error_textrO   s                              rR   acompletion_functionz,AnthropicChatCompletion.acompletion_function   sQ    ,  
"8 --77#
	*//'g 0  H2  33!)#+) 4 
 	
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8BDDDrk   c                 0   t        j                  |      }|j                  dd       }|j                  dd      }|j                  dd      }d}t        j                  |      }t               j	                  |	|||i |d|i      }t        j                  |t        |            }|j                  |||||      }|
j                  ||	|||d	        |d
|        |du rr|du rJ |d       ||d<   | j                  |||||||||	|
|||||||||t        |t              r|      S d       S | j                  |||||||||	|
|||||||||      S |du rH||d<   t        |||t        j                   |      |||
||	      \  }}t#        ||d|
t%        |            S |t        |t&              st'        |      }n|}	 |j)                  ||t        j                   |      |      }t               j5                  ||||
|	||||||      S # t*        $ r|}t-        |dd      }t-        |dd       }t-        |dt/        |            }t-        |dd       }||rt-        |dd       }|rt1        |d      rt-        |d|      }t3        |||      d }~ww xY w)Nr-   r)   Fis_vertex_request)r;   r$   r&   r'   rq   )r&   provider)r&   r'   rq   rr   r$   )r8   r#   r$   )r:   r;   r=   z_is_function_call: Tz,makes async anthropic streaming POST request)r&   r'   r%   r#   rd   re   rf   ro   r;   rL   rq   r-   rp   r)   rr   rs   r$   r(   r"   )r&   r'   r%   r#   rd   re   rf   ro   r;   rL   rq   r-   rp   rr   rs   r$   r"   r)   r(   rh   ri   rj   )r(   )r$   r%   r(   r0   r2   r$   rx   r.   ry   rz   )copydeepcopypopr!   validate_environmentr   get_provider_chat_configr	   transform_requestpre_callru   rG   r   r   rZ   rm   rn   r   r   r   r@   rE   rC   rH   r~   r   r   )ra   r&   r'   r#   rk   rd   re   rf   ro   r;   rL   rq   r(   rr   acompletionrs   r$   r"   r-   r)   r   rp   configr%   rQ   r.   rM   r0   rN   r   rO   s                                  rR   
completionz"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'## "-*VEU2V ) 8  , "- 8  4 00%%'9#1"/%# +$3!&7#1'#!'#' 1  0 $!'X-;!%#D)% +#'
.*!7 +&7(3 +&?&H  >FK)H(9F#F%{{  '!ZZ- '	  +  H*  33!)#+) 4 
 	
 ! ")!]C"@K$+Ay$$?M!(FCF!;J%,Q
D%AN$,(/	4(P%'.&*I%,^VZ%P
( *$/ - s   (H 	JA7JJc                      y r^    ra   s    rR   	embeddingz!AnthropicChatCompletion.embedding  s    rc   )r*   N)__name__
__module____qualname__r`   rH   listdictr   r   r   floatrA   Timeoutr   r   boolru   r   r   r   r   __classcell__)rb   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rc   r\   c            	           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fd	Zd
ede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)rI   r6   r)   c                 ^    || _         | j                   | _        g | _        d| _        || _        y )N)r5   response_iteratorcontent_blocks
tool_indexr)   )ra   r5   r6   r)   s       rR   r`   zModelResponseIterator.__init__  s0     #5!%!8!879"rc   r*   c                     d}t        | j                        dk(  ry| 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
        r7   r   Fdeltatype
text_deltainput_json_deltapartial_jsonT)lenr   get)ra   argsblocks      rR   check_empty_tool_call_argsz0ModelResponseIterator.check_empty_tool_call_args  s     t""#q(q!'*62lB((EW~f%);;g**>2>> ) t9>rc   anthropic_usage_chunkc           	      H   t        |j                  dd      |j                  dd      |j                  dd      |j                  dd      z         }|j                  d      }|t        |t              r||d<   |j                  d      }|t        |t              r||d<   |S )Ninput_tokensr   output_tokens)prompt_tokenscompletion_tokenstotal_tokenscache_creation_input_tokenscache_read_input_tokens)r   r   rG   int)ra   r   usage_blockr   r   s        rR   _handle_usagez#ModelResponseIterator._handle_usage  s     8/33NAF377K.22>1E#'';<
 '<&?&?)'
# '2z'8
 :UK56"7";";<U"V".:#S4
 6MK12rc   chunkc                    	 |j                  dd      xs d}d}d }d}d}d }t        |j                  dd            }|dk(  r\	 t        d$i |}	| j                  j	                  |	       d|	d   v r
|	d   d   }nd	|	d   v rd d
d |	d   d	   d| j
                  d}nk|dk(  rj	 t        d$i |}
g | _        |
d   d   dk(  r
|
d   d   }n>|
d   d   dk(  r2| xj
                  dz  c_        |
d   d   d
|
d   d   dd| j
                  d}n|dk(  r2t        d$i | | j                         }|rd d
d dd| j
                  d}n|dk(  rG	 t        d$i |}t        |d   j                  dd      xs d      }| j                  |d         }d}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!        ||||||"      }|S # t"        j$                  $ r t'        d#|       w xY w)%Nr   r7   Findexr   content_block_deltarx   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   )rx   r   )rx   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   rm   JSONDecodeError
ValueError)ra   r   
type_chunkrx   r   r   r   r   r   r   r   is_emptyr   message_start_block_error_dictr1   returned_chunks                    rR   chunk_parserz"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9th9WND(2!'+N "!## 	KA%IJJ	Ks   H/H2 2"Irx   r   c                     | j                   du r-|+t        j                  |g      }||j                  xs 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

        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)ra   rx   r   r1   s       rR   r   z-ModelResponseIterator._handle_json_mode_chunkz  sO    $ >>T!h&:%GG$:G ","X~rc   c                     | S r^   r   r   s    rR   __iter__zModelResponseIterator.__iter__  s    rc   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   r7   Fr   rx   r   r   r   r   r   zError parsing chunk: z,
Received chunk: )r   __next__StopIterationr   RuntimeErrorrG   bytesdecodefind
startswithrm   loadsr   r   ra   r   rM   str_liner   	data_jsons         rR   r   z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' A8C C 'C>CCD+C<<Dc                 D    | j                   j                         | _        | S r^   )r5   	__aiter__async_response_iteratorr   s    rR   r   zModelResponseIterator.__aiter__  s    '+'>'>'H'H'J$rc   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   rG   r   r   r   r   rm   r   r   r   r   s         rR   r   zModelResponseIterator.__anext__  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        ddddd	d
      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   r7   Fr   r   )	rG   r   r   r   r   rm   r   r   r   )ra   r   r   r   r   s        rR   "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(!  rc   N)F)r   r   r   r   r   r`   r   r   r   r   r   r   r   r   rH   r   r   r   r   r   r   r   r   r   rc   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 rc   rI   )8__doc__r   rm   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   rc   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	| |rc   