o
    id                     @   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 eeZG d	d
 d
eZdS )    N)Sequence)Any)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParserc                       s   e Zd ZdZdef fddZdefddZ fdd	Zd
d Z	dede
dB fddZdededefddZdedefddZdede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 )&DeepSeekV32ToolParseru7  
    example tool call content:
    <｜DSML｜function_calls>
    <｜DSML｜invoke name="get_weather">
    <｜DSML｜parameter name="location" string="true">杭州</｜DSML｜parameter>
    <｜DSML｜parameter name="date" string="true">2024-01-16</｜DSML｜parameter>
    </｜DSML｜invoke>
    <｜DSML｜invoke name="get_weather">
    <｜DSML｜parameter name="location" string="true">北京</｜DSML｜parameter>
    <｜DSML｜parameter name="date" string="true">2024-01-16</｜DSML｜parameter>
    </｜DSML｜invoke>
    </｜DSML｜function_calls>
    	tokenizerc                    s  t  | g | _d| _d| j | _d| _d| _d| _d| _d| _	d| _
d	| _d | _g | _d	| _d
| _d
| _d
| _d	| _d | _d | _d| _d
| _d	| _d	| _d	| _d	| _i | _d | _|   tdtj | _!tdtj | _"tdtj | _#| j$s}t%dt&'d| j(j) d S )Nu
   ｜DSML｜<u   <｜DSML｜function_calls>u   </｜DSML｜function_calls>u   <｜DSML｜invoke name=u   </｜DSML｜invoke>u   <｜DSML｜parameter name=u   </｜DSML｜parameter>Fr    u:   <｜DSML｜function_calls>(.*?)</｜DSML｜function_calls>u>   <｜DSML｜invoke\s+name="([^"]+)"\s*>(.*?)</｜DSML｜invoke>u^   <｜DSML｜parameter\s+name="([^"]+)"\s+string="(?:true|false)"\s*>(.*?)</｜DSML｜parameter>zUThe model tokenizer must be passed to the ToolParser constructor during construction.z)vLLM Successfully import tool parser %s !)*super__init__prev_tool_call_arr
dsml_tokendsml_start_checktool_call_start_tokentool_call_end_tokeninvoke_start_prefixinvoke_end_tokenparameter_prefixparameter_end_tokencurrent_tool_name_sentcurrent_tool_idstreamed_args_for_toolis_tool_call_startedfailed_countcurrent_tool_indexinvoke_indexheader_sentcurrent_function_namecurrent_param_namecurrent_param_valueparam_countin_paramin_functionjson_startedjson_closedaccumulated_paramsstreaming_request_reset_streaming_staterecompileDOTALLtool_call_complete_regexinvoke_complete_regexparameter_complete_regexmodel_tokenizer
ValueErrorloggerdebug	__class____name__)selfr   r:    _/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/tool_parsers/deepseekv32_tool_parser.pyr   .   s\   zDeepSeekV32ToolParser.__init__returnc                 C   s   dt  jdd  S )zGenerate a unique tool call ID.call_N   )uuiduuid4hexr<   r>   r>   r?   _generate_tool_call_idm   s   z,DeepSeekV32ToolParser._generate_tool_call_idc                    s&   t  |}|jr|jdkrd|_|S )NnoneF)r   adjust_requesttoolstool_choiceskip_special_tokens)r<   requestr=   r>   r?   rI   q   s   z$DeepSeekV32ToolParser.adjust_requestc                 C   sh   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _i | _d| _| j  dS )zReset all streaming state.r   FNr   )r"   r#   r    r$   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r   clearrF   r>   r>   r?   r/   }   s    z,DeepSeekV32ToolParser._reset_streaming_state
invoke_strNc                 C   s(   t  }| j|D ]\}}|||< q	|S )N)dictr5   findall)r<   rO   
param_dict
param_name	param_valr>   r>   r?   _parse_invoke_params   s   
z*DeepSeekV32ToolParser._parse_invoke_paramsmodel_outputrM   c           
      C   s   | j |vrtdg |dS zQg }| j|D ]$}| j|D ]\}}| |}|tdt|t	j
|dddd qq|sDtdg |dW S || j }|dkrT|d| nd}	td	||	dW S  tyr   td
 tdg |d Y S w )z>Extract tool calls from complete model output (non-streaming).F)tools_called
tool_callscontentfunctionensure_asciiname	arguments)typerZ   r   NTzError extracting tool calls)r   r   r3   rQ   r4   rU   appendr
   r	   jsondumpsfind	Exceptionr8   	exception)
r<   rV   rM   rX   tool_call_matchinvoke_nameinvoke_contentrR   first_tool_idxrY   r>   r>   r?   extract_tool_calls   sH   



z(DeepSeekV32ToolParser.extract_tool_callsname_strc                 C   s@   |  }|dr|ds|dr|dr|dd S |S )z Extract name from quoted string."'   )strip
startswithendswith)r<   rl   r>   r>   r?   _extract_name   s   z#DeepSeekV32ToolParser._extract_name	input_strc                 C   s:   | dd }| d|}|dkr||kr||| S |S )zExtract param namerm   ro   r   )rd   )r<   ru   startendr>   r>   r?   _extract_param_name   s    z)DeepSeekV32ToolParser._extract_param_namevalue
param_typec              	   C   s  |  dkrdS |  }|dv r|S |dv r)zt|W S  ttfy(   | Y S w |dv rMzt|}|t|kr;|W S t|W S  ttfyL   | Y S w |dv rW|  dv S |dv rnzt|W S  tjym   | Y S w zt|W S  tjy   | Y S w )	z,Convert parameter value to the correct type.nullN)stringstrtext)integerint)numberfloat)booleanbool)true1)objectarray)lowerr   r7   	TypeErrorr   rb   loadsJSONDecodeError)r<   ry   rz   valr>   r>   r?   _convert_param_value   s>   
z*DeepSeekV32ToolParser._convert_param_valueprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc           .      C   s  |s	|    || _|sC|rAt| j|}|dkr7t| jdkr7|| j|| j }	|	dkr5t	ddS dS | j
sA|rAt	ddS dS | jro| jso|| j}
|
| jkro|  jd7  _d| _d| _d| _d| _d| _i | _dS | j
s| j|v rd| _
| j|v r|d|| j }|rt	|dS dS | | jr| dkrdS |drt	|dd	 dS |r|drt	d| dS t	|dS || j}| j|krdS g }d}	 || j|}|d	krn|| |t| j7 }q| jt|krdS || j }|| j|}|d	kr||d }n|||t| j  }| jsy| j|v rw|| jt| j }|d
|}|d	krw||| }| || _|  | _d| _d| _t| j| jkrd| j| jdd t	t | j| jt!| jddddgdS dS | jr| jr| jsd| _t	t | jt!dddgdS | jsd| _| js| j|v r|| j"}| j|krd| _|| jt| j }|| j|}|d	kr||| }z | #|}|r| jt| jk rt$j%|dd| j| j d< W n
 t&y   Y nw t	t | jt!dddgd}d| _d| _i | _t'(d |S dS g }d}	 || j"|}|d	kr0n|| |t| j"7 }q#| j)s| jt|k rt|| jkr|| j }|t| j" }||d }d
|v r|d
}|d| } | *| | _+|| d }!||!d }"|",dr|"dd }"|"| j-}#|#d	kr|"| j"}$|"| j}%|$d	kr|%d	ks|$|%k r|$}#n|%d	kr|%}#n| j|v rt|"}#ndS |#d	kr|"d|# }&|&dr|&dd	 }&|&| j| j+< i }'| jr*| jj.r*| jj.D ]-}(t/|(dr(|(j0j1| jkr(t/|(j0dr(|(j0j2})t3|)t4r&d|)v r&|)d }' nqd}*| j+|'v rJt3|'| j+ t4rJd|'| j+ v rJ|'| j+ d }*| 5|&|*}+t$j%|+dd},| jdkrgd| j+ d|, }-n	d| j+ d|, }-|  jd7  _t	t | jt!|-ddgdS dS )z/Extract tool calls from streaming model output.r   r   )rY   Nro   FTr   rp   >z{}r]   rZ   )indexidrZ   r`   )rX   {)r_   )r   rZ   r[   r_   }z"[M2_STREAMING] Tool call completed

parameters
propertiesr|   r`   rm   z": z, ")6r/   r.   lenr3   rQ   r   countr   r   r   r    r,   r*   r   r"   r$   r(   r+   r-   r   r   r   rstriprs   rq   r   rd   ra   rt   r%   rG   r   r   r   r   rU   rb   rc   re   r8   r9   r)   rx   r&   rr   r   rJ   hasattrrZ   r^   r   
isinstancerP   r   ).r<   r   r   r   r   r   r   rM   complete_calls
open_callsinvoke_endscontent_beforeinvoke_starts_countinvoke_start_positionsidxinvoke_start_idxinvoke_end_idx	tool_text
func_startfunc_endfunction_name_rawtotal_param_countinvoke_startinvoke_content_endri   invoke_paramsresultparam_starts	param_idxparam_start	remainingname_endparam_name_rawvalue_start
value_textparam_end_idxnext_param_idxfunc_end_idxparam_valueparam_configtoolparamsrz   converted_valueserialized_valuejson_fragmentr>   r>   r?   extract_tool_calls_streaming   s  
























	









	z2DeepSeekV32ToolParser.extract_tool_calls_streaming)r;   
__module____qualname____doc__r   r   r}   rG   rI   r/   rP   rU   r   r   rk   rt   rx   r   r   r   r   r   r   __classcell__r>   r>   r=   r?   r      sD    ?
3!	r   )rb   rC   collections.abcr   typingr   regexr0   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   r;   r8   r   r>   r>   r>   r?   <module>   s    