o
    
۾ilA                     @   s   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 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)consume_space)random_uuidc                       s   e Zd Zdef fddZdedeedB edB 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defddZdefddZdefddZdedefddZdededefddZ  ZS ) HunyuanA13BToolParser	tokenizerc                    s|   t  | g | _d| _d| _g | _g | _g | _t	dtj
| _t	d| _t	d| _t	d| _d| _dg g d| _d S )	NFz#<tool_calls>([\s\S]*?)</tool_calls>z"name"\s*:\s*"([^"]+)"z4"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*\{\s*\}zL"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*(\{(?:[^{}]|(?:\{[^{}]*\}))*\})z<tool_calls>)current_tool_indextool_ids
sent_tools)super__init__prev_tool_callscurrent_tool_idcurrent_tool_name_sentstreamed_argscurrent_tools_sentprev_tool_call_arrrecompileDOTALLanswer_tool_calls_patterntool_name_regtool_empty_arg_regtool_non_empty_arg_reg
bot_stringstreaming_state)selfr   	__class__ ^/home/ubuntu/.local/lib/python3.10/site-packages/vllm/tool_parsers/hunyuan_a13b_tool_parser.pyr   "   s,   zHunyuanA13BToolParser.__init__model_outputreturnNc              	      s   | j |D ]G}| \ dd tjd|tjdD }t fdd|D }|sM|d  }|d }zt	| ||fW   S  t
yL   Y qw q|d fS )Nc                 S   s   g | ]
}|  | fqS r*   )startend).0mr*   r*   r+   
<listcomp>Q   s    zAHunyuanA13BToolParser.preprocess_model_output.<locals>.<listcomp>z<think>(.*?)</think>)flagsc                 3   s$    | ]\}}|ko |k V  qd S Nr*   )r0   t_startt_endr/   r.   r*   r+   	<genexpr>W   s    
z@HunyuanA13BToolParser.preprocess_model_output.<locals>.<genexpr>   )r!   finditerspanr   r    anygroupstripjsonloads	Exception)r'   r,   matchthink_regionsin_thinkcontenttool_calls_contentr*   r7   r+   preprocess_model_outputJ   s*   
z-HunyuanA13BToolParser.preprocess_model_outputrequestc           
   
   C   s6  z|  |\}}|s|r|ddd}tdg |dW S t|}t|ts4td tdg |p0|dW S g }t	|D ]8\}}t|t
rKd|vsKd|vrLq:td	t  d
t|d t|d t
ret|d n|d dd}	||	 q:|r}t| dkrd}tt|dk||dW S  ty   tdg |d Y S w )zB
        Extract tool calls from a complete model output.
        u	   助手： r9   F)tools_called
tool_callsrE   zTool calls data is not an arrayname	argumentscall_function)rL   rM   )idtyperO   r   N)rG   replacer   r?   r@   
isinstancelistloggerdebug	enumeratedictr
   r   r	   dumpsappendlenr>   rA   )
r'   r,   rH   rE   potential_tool_callstool_calls_datarK   idxcall	tool_callr*   r*   r+   extract_tool_callsd   s\   





z(HunyuanA13BToolParser.extract_tool_callsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc                 C   s   t d|}||d | jrt |t| j |}|r'|t|ks'|| dkr,t|dS | ||d  | |}	|	r>|	S t| j	|}
t|
}|dkrPdS | 
| | jd }| |||
}|re|S | |||}|rp|S dS )z8
        Extract tool calls for streaming mode.
        r   N[)rE   r   )r   
startswithr%   r[   r   _try_parse_json_tools_handle_test_compatibilityrT   r"   r:   _ensure_state_arraysr&   _handle_tool_name_streaming_handle_tool_args_streaming)r'   rb   rc   rd   re   rf   rg   rH   	start_idx
test_deltaname_matches
tool_countcurrent_idx
name_delta
args_deltar*   r*   r+   extract_tool_calls_streaming   s:   




z2HunyuanA13BToolParser.extract_tool_calls_streamingc                 C   s>   zt |}t|tr|| _W d S W d S  t jy   Y d S w r4   )r?   r@   rS   rT   r   JSONDecodeError)r'   rc   parsed_toolsr*   r*   r+   rj      s   

z+HunyuanA13BToolParser._try_parse_json_toolsc                 C   s   t | jdkrkt | jdkrk| jd du rk| j|}|rk|d}dt  }ttdd|t|dj	ddd	gd
}dg| _d| _
d| jd< t | jd dkr]| jd dddd n	d| jd d d< d| _|S d S )Nr   r9   Fzchatcmpl-tool-rO   rL   Texclude_noneindexrQ   rP   rO   rK   r   r   rI   	sent_namesent_arguments_prefixsent_argumentsr   )r[   r   r"   searchr=   r   r   r   r   
model_dumpr   r&   rZ   r   )r'   rc   
name_matchfunction_nametool_iddeltar*   r*   r+   rk      sD   


z0HunyuanA13BToolParser._handle_test_compatibilityrr   c                 C   sx   t | jd |k r| jd dddd t | jd |k s	t | jd |k r:| jd d  t | jd |k s'd S d S )Nr   FrI   r   r   )r[   r&   rZ   )r'   rr   r*   r*   r+   rl     s   
z*HunyuanA13BToolParser._ensure_state_arraysrs   c                 C   s   |dks
||d k rq|d }||k rq| j d | d sq|| j d< || _|}|| d}d| dt  }|| j d |< tt|d	|t|d
jdddgd}d| j d | d< d| _t	| j
|kro| j
d t	| j
|ksb|S d S )Nr   r9   r   r   r   rN   _r   rO   ry   Trz   r|   r~   rI   )r&   r   r=   r   r   r   r   r   r   r[   r   rZ   )r'   rs   rr   rq   next_idx	tool_namer   r   r*   r*   r+   rm     s:   

z1HunyuanA13BToolParser._handle_tool_name_streamingc                 C   s"  |dkr||k r| j |}|r| dkrt|D ]h}||kr| jd | d sd| jd | d< d| jd | d< t| j|krQ| jd t| j|ksD| j|  d7  < tt	|t
ddjdd	d
gd}||d k r| jd  d7  < | jd | _|  S qt| j|}|t|k r|| d}||d k}	|	s|d||  }
|
dkr|
d }|||  | dd  }| jd | d }| jd | d s"|dr"d| jd | d< d| jd | d< t| j|kr| jd t| j|ks| j|  d7  < tt	|t
ddjdd	d
gd}|S ||rn|t|d  }|rn|| jd | d< t| j|krR| jd t| j|ksD| j|  |7  < tt	|t
|djdd	d
gd}|S |dr||kr||d k r| jd  d7  < | jd | _d S )Nr   r   r   Tz{}r   rI   )rM   rz   )r}   rO   r~   r9   r   z},{r   z"arguments":{})r#   r   r.   ranger&   r[   r   rZ   r   r   r   r   r   rT   r$   r:   r=   findsplitr>   ri   endswith)r'   rc   rs   rr   empty_args_matchir   args_matches	args_textis_last_toolnext_tool_posargs_end_pos	sent_args	args_diffr*   r*   r+   rn   :  s   



z1HunyuanA13BToolParser._handle_tool_args_streaming)__name__
__module____qualname__r   r   strtuplerG   r   r   ra   r   intr   rv   rj   rk   rl   rm   rn   __classcell__r*   r*   r(   r+   r   !   s\    (

F	
3'
"r   )r?   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.tool_parsers.utilsr   
vllm.utilsr   r   rU   r   r*   r*   r*   r+   <module>   s    