o
    i/                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlZd dlm	Z	 d dl
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 d d	lmZ eeZG d
d deZdS )    N)Sequence)Any)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParser)random_uuidc                       s  e Zd ZdZdZdZdZdZdZeeeegZ	de
f fdd	Zd
edef fddZededeedB eeef dB f fddZdedeeef d
edeeef fddZdedededee dee dee d
ededB fddZded
edefdd Z  ZS )!Step3ToolParserz
    Tool parser for a model that uses a specific XML-like format for tool calls.
    This version uses a robust, stateful, cursor-based streaming parser and
    consolidates tool arguments into a single message.
    u   <｜tool_calls_begin｜>u   <｜tool_calls_end｜>u   <｜tool_call_begin｜>u   <｜tool_call_end｜>u   <｜tool_sep｜>	tokenizerc                    s"   t  | d| _d| _d| _d S )Nr   F)super__init__positiontool_block_startedtool_block_finished)selfr   	__class__ Y/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/tool_parsers/step3_tool_parser.pyr   .   s   
zStep3ToolParser.__init__requestreturnc                    s&   t  |}|jr|jdkrd|_|S )NnoneF)r   adjust_requesttoolstool_choiceskip_special_tokens)r   r   r   r   r   r   5   s   zStep3ToolParser.adjust_requestaction_textNc                 C   sP   t d| }|s
dS |d}i }t d| }|D ]
\}}| ||< q||fS )Nz<steptml:invoke name="([^"]+)">)NN   z=<steptml:parameter name="([^"]+)">([^<]*)</steptml:parameter>)researchgroupfindallstrip)r"   func_name_match	func_nameparamsparam_matchesnamevaluer   r   r   _parse_steptml_invoke;   s   
z%Step3ToolParser._parse_steptml_invoker*   r+   c              
   C   sR  |j pg D ]}|jj|kr|jjpi }|di }| D ]\}}t|ts'q||i }	|	d}
|
dkr=| ||< q|
dkr]t	
t t|||< W d    n1 sWw   Y  q|
dkr}t	
t t|||< W d    n1 sww   Y  q|
dkr| }|dv r|dkn|||< q|
d	kr| d	krd n|||< q |S q|S )
N
propertiestypestringintegernumberboolean)truefalser6   null)r   functionr-   
parametersgetitems
isinstancestrr(   
contextlibsuppress
ValueErrorintfloatlower)r   r*   r+   r   toolschemar0   keyr.   proptyp	lower_valr   r   r   _cast_argumentsM   sD   

zStep3ToolParser._cast_argumentsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc                 C   sP  	 | j t|kr
d S || j d  }| jrt|| _ t|dS | jsi|| jr5|  j t| j7  _ d| _q || j}	|	dkrU| j| rK|rKd S t|| _ t|dS |d |	 }
|  j t|
7  _ t|
dS t|t|	  }|	 }|  j |7  _ || j
r|  j t| j
7  _ d| _d| _q | jdko| j| j d}| jdks|r|| jr|  j t| j7  _ | jdkrd| _n|  jd7  _d| _t| j| jkr| ji  t| j| jksd| j| j d< q | j|rd S | jdkr| j| j dds|| j}|dkr|}n|d | }|dkr'| j|r'd S | |\}}|s3d S ||p8i d}| js_d| _| j| j | tt| jd	d
t  t|ddgdS | j| j | |dkr|  j |t| j 7  _ d| j| j d< | ||di |}|rtj|dd}tt| jt|ddgdS d S d S )NT)contentfinishedr   r#   F)r-   r:   r9   zchatcmpl-tool-)r-   )indexr1   idr9   )
tool_callsr:   ensure_ascii)	arguments)rU   r9   )r   lenr   r   r   
startswithTOOL_CALLS_BEGINfindr(   lstripTOOL_CALLS_ENDcurrent_tool_idprev_tool_call_arrr;   TOOL_CALL_BEGINcurrent_tool_name_sentappendTOOL_CALL_ENDr/   updater   r   r   rK   jsondumps)r   rL   rM   rN   rO   rP   rQ   r   unprocessed_text	start_posrR   offsettool_finishedend_tool_pos	tool_bodyfunction_namerZ   tool_call_arr
final_argsfinal_args_jsonr   r   r   extract_tool_calls_streamingp   s   









z,Step3ToolParser.extract_tool_calls_streamingmodel_outputc                 C   sB  | j |vrtdg |dS || j d\}}| j|vr!tdg |dS || jd\}}||  }g }|| j}	|	D ]P}
|
rC| j|
vrDq:|
| jdd }| j|vrSq:|| jd\}}| dkrcq:| |\}}|r|d ur| 	|||}t
j|dd}|tt||dd q:|rtd	||r|dS d dS tdg |dS )
NF)tools_calledrW   rR   r#   r   r9   rX   )r-   rZ   )r9   T)r]   r   splitr`   r(   rc   rf   TOOL_SEPr/   rK   rh   ri   re   r
   r	   )r   ru   r   pre_textrest
tool_block	post_textrR   rW   
call_partspartcall_content	type_partinvoke_partrp   params_dict
params_strr   r   r   extract_tool_calls   sV   



z"Step3ToolParser.extract_tool_calls)__name__
__module____qualname____doc__r]   r`   rc   rf   rx   SPECIAL_TOKENSr   r   r   r   staticmethodr>   tupledictr/   r   rK   r   rB   r   rt   r   r   __classcell__r   r   r   r   r       sd    


#	
 r   )r?   rh   collections.abcr   typingr   regexr$   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   r   r   r   r	   r
   vllm.loggerr   vllm.tokenizersr   &vllm.tool_parsers.abstract_tool_parserr   
vllm.utilsr   r   loggerr   r   r   r   r   <module>   s    