o
    i                      @   s   d dl 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 eeZG dd	 d	eZdS )
    N)Sequence)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParserc                       sr   e Zd Zdef fddZdedede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  ZS )Ernie45ToolParser	tokenizerc                    s   t  | d| _g | _d| _g | _d| _d| _d| _d| _	d| _
| j	| _d| _td	tj| _| js7td
| j| j| _| j| j| _| j| j| _| j| j	| _| j| j
| _| j| j| _| j| j| jg| _d| _dS )zc
        Ernie thinking model format:
        abc
</think>


<tool_call>
def
</tool_call>

        Fz</think>z
<response>z</response>z<tool_call>z</tool_call>z<0x0A>z.<tool_call>\s*(?P<json>\{.*?\})\s*</tool_call>zUThe model tokenizer must be passed to the ToolParser constructor during construction. N)super__init__current_tool_name_sentprev_tool_call_arrcurrent_tool_idstreamed_args_for_toolthink_end_tokenresponse_start_tokenresponse_end_tokentool_call_start_tokentool_call_end_tokentool_calls_start_tokennewline_tokenrecompileDOTALLtool_call_regexmodel_tokenizer
ValueErrorvocabgetthink_end_token_idresponse_start_token_idresponse_end_token_idtool_call_start_token_idtool_call_end_token_idnewline_token_idparser_token_ids_buffer)selfr   	__class__ [/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/tool_parsers/ernie45_tool_parser.pyr      s<   
zErnie45ToolParser.__init__model_outputrequestreturnc           	   
   C   s   | j |vrtdg |dS zJ| j|}g }|D ]#}t|}tj|di dd}|t	dt
|dd|dd	 q|d || j  d
}td||rR|dW S d dW S  tyk   td tdg |d Y S w )NF)tools_called
tool_callscontent	arguments)ensure_asciifunctionnamer   r<   r9   )typer;   
Tz,Error in extracting tool call from response.)r   r   r!   findalljsonloadsdumpsr%   appendr	   r   findrstrip	Exceptionlogger	exception)	r.   r3   r4   tool_call_json_listr7   tool_call_jsontool_call_dictargs_strr8   r1   r1   r2   extract_tool_callsH   sN   





z$Ernie45ToolParser.extract_tool_callsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc              
      s    j |7  _  j }| j}	|	dkrd _  jdkrd} jdkr3t fdd|D r3|d}|}
 j|v ra|
d}
|
 j}|
|t	 j d  }
|

 j}|dkr`|
d | }
n j|v rr|

 j}|
d | }
t	|dkr|d  jv rt	|dkr|d  jkr|
d}
t|
r|
dS d dS td| | j}|dkrP jdkrd _g  _g  _t	 j jkrш ji  t	 j jkst	 j jkr jd t	 j jksو |d |t	 j  |}t	|jdkrtd	 d S |jd }|jjt|jjd
 j j< |jj j j< t|jt j|j |j!t"|jj|jjd
dgd}  jd7  _||t	 j d   _ |S ||	d   _ |d |	 #d}
t|
rh|
dS d dS )Nr   r   r   c                 3   s    | ]}| j kV  qd S )N)r+   ).0token_idr.   r1   r2   	<genexpr>   s    

zAErnie45ToolParser.extract_tool_calls_streaming.<locals>.<genexpr>r?   )r8   zcur_text = %sz!Failed to extract any tool calls.r=   )indexidr>   r;   )r8   r7      )$r-   rE   r   r   allstripr'   lstripr   lenrfindr   r(   r,   r+   r   rH   debugr   r   r   rD   rN   r7   warningr;   r<   rA   rB   r9   r8   r   rZ   r>   r   rF   )r.   rO   rP   rQ   rR   rS   rT   r4   cur_text	start_idxr8   response_start_idxresponse_end_idxend_idxextracted_tool_calls	tool_calldeltar1   rW   r2   extract_tool_calls_streamingv   s   











z.Ernie45ToolParser.extract_tool_calls_streaming)__name__
__module____qualname__r   r   strr   r   rN   r   intr   rk   __classcell__r1   r1   r/   r2   r      s4    *
.	r   )rA   collections.abcr   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   rl   rH   r   r1   r1   r1   r2   <module>   s    