o
    iO                     @   s   d 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	 ddl
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mZ dd
lmZmZmZmZmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$ e%e&Z'de(de(fddZ)G dd deZ*dS )z&Anthropic Messages API serving handler    N)AsyncGenerator)Any)Request)EngineClient)AnthropicContentBlockAnthropicDeltaAnthropicErrorAnthropicMessagesRequestAnthropicMessagesResponseAnthropicStreamEventAnthropicUsage)ChatTemplateContentFormatOption)RequestLogger)"ChatCompletionNamedToolChoiceParamChatCompletionRequestChatCompletionResponseChatCompletionStreamResponseChatCompletionToolsParam)OpenAIServingChat)ErrorResponseStreamOptions)OpenAIServingModelsdataeventc                 C   s   d| d|  dS )Nzevent: z
data: z

 )r   r   r   r   X/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/entrypoints/anthropic/serving.pywrap_data_with_event-   s   r   c                       s   e Zd ZdZddddddddededed	edB d
edB dede	dede	dedB de	de	f fddZ
dedefddZ	d!dededB deedf eB eB fddZdedefddZdeedf deedf fdd Z  ZS )"AnthropicServingMessagesz+Handler for Anthropic Messages API requestsF N)return_tokens_as_token_idsreasoning_parserenable_auto_toolstool_parserenable_prompt_tokens_detailsenable_force_include_usageengine_clientmodelsresponse_rolerequest_loggerchat_templatechat_template_content_formatr   r    r!   r"   r#   r$   c       	            s6   t  j|||||||||	|
||d dddd| _d S )N)r%   r&   r'   r(   r)   r*   r   r    r!   r"   r#   r$   end_turn
max_tokenstool_use)stoplength
tool_calls)super__init__stop_reason_map)selfr%   r&   r'   r(   r)   r*   r   r    r!   r"   r#   r$   	__class__r   r   r2   4   s$   z!AnthropicServingMessages.__init__anthropic_requestreturnc              
   C   s  g }|j r2t|j tr|d|j d nd}|j D ]}|jdkr)|jr)||j7 }q|d|d |jD ]}d|ji}t|jtrH|j|d< ng }g }|jD ]}|jdkrc|jrc|d|jd qO|jdkr{|j	r{|d	d
|j	
ddid qO|jdkr|jpdtt  d|jpdt|jpi dd}	||	 qO|jdkr|jdkr|d|jpd|jrt|jndd qO|jrt|jnd}
|dd|
 d qO|r||d< |rt|dkr|d d dkr|d d |d< n||d< n|sq5|| q5t|j||j|j|j|j|j|jd}|jr(|j|_tddd|_|jdu r2d|_n*|jjdkr=d|_n|jjd krHd!|_n|jjdkr\t dd"|jjid#|_g }|j!du rf|S |j!D ]}|t" d|j|j#|j$d$d# qi|jdu rd|_||_!|S )%z1Convert Anthropic message format to OpenAI formatsystem)rolecontentr   textr:   r;   typer<   image	image_urlurlr   )r>   r@   r-   call_function)name	arguments)idr>   rC   tool_resultusertool)r:   tool_call_idr;   zTool result: r0      r   r>   )modelmessagesr,   max_completion_tokensr.   temperaturetop_ptop_kT)include_usagecontinuous_usage_statsNautoanyrequiredrD   )r>   rC   )rD   description
parameters)%r9   
isinstancestrappendr>   r<   rM   r:   r;   sourcegetrF   inttimerD   jsondumpsinputlenr   rL   r,   stop_sequencesrO   rP   rQ   streamr   validatestream_optionstool_choicer   model_validatetoolsr   rW   input_schema)r4   r7   openai_messagessystem_promptblockmsg
openai_msgcontent_partsr0   	tool_calltool_result_textreqrj   rI   r   r   r   $_convert_anthropic_to_openai_requestX   s   











z=AnthropicServingMessages._convert_anthropic_to_openai_requestrequestraw_requestc                    s   t tjrt d|  | |}t tjr"t d|  | ||I dH }t|t	r2|S t|t
r<| |S | |S )z
        Messages API similar to Anthropic's API.

        See https://docs.anthropic.com/en/api/messages
        for the API specification. This API mimics the Anthropic messages API.
        zReceived messages request %szConvert to OpenAI request %sN)loggerisEnabledForloggingDEBUGdebugmodel_dump_jsonru   create_chat_completionrY   r   r   messages_full_convertermessage_stream_converter)r4   rv   rw   chat_req	generatorr   r   r   create_messages   s   




z(AnthropicServingMessages.create_messagesr   c                 C   s   t |jg |jt|jj|jjdd}|jd jdkrd|_	n|jd jdkr*d|_	n|jd jdkr5d	|_	t
d
|jd jjrE|jd jjnddg}|jd jjD ]}t
d	|j|jjt|jjd}||g7 }qQ||_|S )Ninput_tokensoutput_tokensrF   r;   rL   usager   r.   r+   r/   r,   r0   r-   r<   r   r=   r>   rF   rD   rb   )r
   rF   rL   r   r   prompt_tokenscompletion_tokenschoicesfinish_reasonstop_reasonr   messager;   r0   rC   rD   r`   loadsrE   )r4   r   resultr;   rr   anthropic_tool_callr   r   r   r      s@   		z0AnthropicServingMessages.messages_full_converterc                 C  s  zd}d }d}d}|2 z3 d H W }| dr|dd   d}|dkr?tdd	}|jddd
}	t|	dV  dV  qt|}
|rntdt|
j	g |
j
t|
jrV|
jjnddddd}d}|jdd}	t|	dV  qt|
jdkr|rt|dd}|jdd}	t|	dV  | j|pd}tdt|dt|
jr|
jjnd|
jr|
jjnddd}|jdd}	t|	dV  q|
jd jd ur|
jd j}q|
jd jjd ur|st|dtdddd}|jdd}	t|	dV  d}|
jd jjdkrqt|dtd|
jd jjdd}|jdd}	t|	dV  qt|
jd jjdkr|
jd jjd }|j	d urp|rKt|dd}|jdd}	t|	dV  d}|d7 }t|dtd |j	|jrZ|jjnd i d!d}|jdd}	t|	dV  d}nt|dtd"|jr}|jjnd d#d}|jdd}	t|	dV  qqtd$td%d&dd'}|jdd}	t|	d$V  dV  q6 W d S  ty } z'td( td$td%t |dd'}|jdd}	t|	d$V  dV  W Y d }~d S d }~ww ))NTr   Fzdata:   
z[DONE]message_stop)r>   )exclude_unsetexclude_nonezdata: [DONE]

message_startr   r   )r>   r   )r   content_block_stop)indexr>   r.   message_delta)r   )r>   deltar   content_block_startr<   r   r=   )r   r>   content_blockcontent_block_delta
text_delta)r   r>   r   rK   r-   r   input_json_delta)r>   partial_jsonerrorinternal_errorzInvalid data format received)r>   r   z"Error in message stream converter.)!
startswithstriprstripr   r}   r   r   model_validate_jsonr
   rF   rL   r   r   r   rc   r   r3   r]   r   r   r   r   r;   r   r0   rC   rD   rE   r   	Exceptionrx   	exceptionrZ   )r4   r   
first_itemr   content_block_indexcontent_block_starteditemdata_strstop_messager   origin_chunkchunk
stop_chunkr   rr   error_responseer   r   r   r   '  sF  



0  
z1AnthropicServingMessages.message_stream_converter)N)__name__
__module____qualname____doc__r   r   rZ   r   r   boolr2   r	   r   ru   r   r   r
   r   r   r   r   r   __classcell__r   r   r5   r   r   1   sr    	
$
 

*

r   )+r   r`   rz   r_   collections.abcr   typingr   fastapir   vllm.engine.protocolr   #vllm.entrypoints.anthropic.protocolr   r   r   r	   r
   r   r   vllm.entrypoints.chat_utilsr   vllm.entrypoints.loggerr   0vllm.entrypoints.openai.chat_completion.protocolr   r   r   r   r   /vllm.entrypoints.openai.chat_completion.servingr   'vllm.entrypoints.openai.engine.protocolr   r   &vllm.entrypoints.openai.models.servingr   	getLoggerr   rx   rZ   r   r   r   r   r   r   <module>   s$   $	
