
    .`ia                         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
e          ZdS )    N)Sequence)Any)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParserc                        e Zd ZdZdef fdZdefdZd Zdede	dz  fd	Z
d
ededefdZdedefdZdedefdZdededefdZdedededee         dee         dee         dededz  fdZ x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                 J   t                                          |           g | _        d| _        d| j        z   | _        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=          j        dt<          j                   | _!        t=          j        dt<          j                   | _"        t=          j        dt<          j                   | _#        | j$        stK          d          tL          '                    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=   s     }/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/deepseekv32_tool_parser.pyr   zDeepSeekV32ToolParser.__init__.   s   ###.0  ,%(4?%:*F"(E (A %:%A(@  -2#+/13#*/!!" ()!"!&15".2(*  !#!&"'!&(*?C 	##%%% )+
I29)
 )
% &(ZMry&
 &
" )+
mI)
 )
%
 # 	3  
 	79P	
 	
 	
 	
 	
    returnc                 H    dt          j                    j        dd          S )zGenerate a unique tool call ID.call_N   )uuiduuid4hexr?   s    r@   _generate_tool_call_idz,DeepSeekV32ToolParser._generate_tool_call_idm   s"    .tz||',...rA   c                 
   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/   r0   r1   r   clearrI   s    r@   r2   z,DeepSeekV32ToolParser._reset_streaming_stateq   s    "#$)! #%)""&#%  ! "$!%%%'''''rA   
invoke_strNc                 l    t                      }| j                            |          D ]
\  }}|||<   |S )N)dictr8   findall)r?   rM   
param_dict
param_name	param_vals        r@   _parse_invoke_paramsz*DeepSeekV32ToolParser._parse_invoke_params   sC    VV
%)%B%J%J:%V%V 	/ 	/!J	%.Jz""rA   model_outputrequestc                    | j         |vrt          dg |          S 	 g }| j                            |          D ]~}| j                            |          D ]a\  }}|                     |          }|                    t          dt          |t          j
        |d                                         b|st          dg |          S |                    | j                   }|dk    r
|d|         nd}	t          d	||	          S # t          $ r/ t                              d
           t          dg |          cY S w xY w)z>Extract tool calls from complete model output (non-streaming).F)tools_called
tool_callscontentfunctionensure_asciiname	arguments)typer[   r   NTzError extracting tool calls)r   r	   r6   rP   r7   rT   appendr   r
   jsondumpsfind	Exceptionr;   	exception)
r?   rU   rV   rY   tool_call_matchinvoke_nameinvoke_contentrQ   first_tool_idxrZ   s
             r@   extract_tool_callsz(DeepSeekV32ToolParser.extract_tool_calls   s    %\99/"r<   %	J $(#@#H#H#V#V  373M3U3U#4 4  /K "&!:!:>!J!JJ%% !+%1%0*.*Ze*T*T*T& & &     	  3!&2|   
 *..t/IJJN7E7I7Il?N?33tG/!j'     	 	 	:;;;/"r<     	s   B.D
 =D
 
6EEname_strc                     |                                 }|                    d          r|                    d          s*|                    d          r|                    d          r
|dd         S |S )z Extract name from quoted string."'   )strip
startswithendswith)r?   rm   s     r@   _extract_namez#DeepSeekV32ToolParser._extract_name   s    >>##$$	"!!#&&	" ""3''	" !!#&&		" AbD>!rA   	input_strc                     |                     d          dz   }|                     d|          }|dk    r||k    r
|||         n|S )zExtract param namero   rq   r   )re   )r?   rw   startends       r@   _extract_param_namez)DeepSeekV32ToolParser._extract_param_name   sO    s##a'nnS%((',qyyS5[[ys##iOrA   value
param_typec                 R   |                                 dk    rdS |                                 }|dv r|S |dv r)	 t          |          S # t          t          f$ r |cY S w xY w|dv rM	 t	          |          }|t          |          k    r|nt          |          S # t          t          f$ r |cY S w xY w|dv r|                                 dv S |dv r,	 t          j        |          S # t
          j        $ r |cY S w xY w	 t          j        |          S # t
          j        $ r |cY S w xY w)	z,Convert parameter value to the correct type.nullN)stringstrtext)integerint)numberfloat)booleanbool)true1)objectarray)lowerr   r:   	TypeErrorr   rc   loadsJSONDecodeError)r?   r|   r}   vals       r@   _convert_param_valuez*DeepSeekV32ToolParser._convert_param_value   s   ;;==F""4%%''
222L---5zz!	*   ...Ell!SXXooss3s88;	*   ...;;==M11...z%((('   z%((('   sG   A	 	AA'2B B0/B0C& &C:9C:>D D&%D&previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc           
         |s|                                   || _        |s|rt          | j                            |                    }|dk    rdt          | j                  dk    rL|                    | j                  |                    | j                  z
  }	|	dk    rt          d          S n| j
        s|rt          d          S dS | j        rh| j        sa|                    | j                  }
|
| j        k    r<| xj        dz  c_        d| _        d| _        d| _        d| _        d| _        i | _        dS | j
        s| j        |v rFd| _
        | j        |v r4|d|                    | j                           }|rt          |          S dS |                                                    | j                  r|                                dk    rdS |                    d          rt          |dd	                   S |r(|                    d          rt          d|z             S t          |          S |                    | j                  }| j        |k    rdS g }d}	 |                    | j        |          }|d	k    rn-|                    |           |t          | j                  z  }O| j        t          |          k    rdS || j                 }|                    | j        |          }|d	k    r||d         }n|||t          | j                  z            }| j        s!| j        |v r|                    | j                  t          | j                  z   }|                    d
|          }|d	k    r|||         }|                     |          | _        |                                 | _        d| _        d| _        t          | j                  | j        k    r"| j                            | j        dd           t          tA          | j        | j        tC          | j        d          d          g          S dS | j        r*| j        rA| j        s:d| _        t          tA          | j        tC          d                    g          S | j        sd| _        | j        sf| j        |v r\|                    | j"                  }| j        |k    r4d| _        |                    | j                  t          | j                  z   }|                    | j        |          }|d	k    ry|||         }	 | #                    |          }|rF| j        t          | j                  k     r)tI          j%        |d          | j        | j                 d<   n# tL          $ r Y nw xY wt          tA          | j        tC          d                    g          }d| _        d| _        i | _        tN          (                    d           |S dS g }d}	 |                    | j"        |          }|d	k    rn-|                    |           |t          | j"                  z  }O| j)        s
| j        t          |          k     rt          |          | j        k    r|| j                 }|t          | j"                  z   }||d         }d
|v r|                    d
          }|d|         } | *                    |           | _+        ||z   dz   }!||!d         }"|",                    d          r
|"dd         }"|"                    | j-                  }#|#d	k    rm|"                    | j"                  }$|"                    | j                  }%|$d	k    r|%d	k    s|$|%k     r|$}#n$|%d	k    r|%}#n| j        |v rt          |"          }#ndS |#d	k    r|"d|#         }&|&                    d          r
|&dd	         }&|&| j        | j+        <   i }'| j        r| j        j.        rx| j        j.        D ]k}(t_          |(d          rY|(j0        j1        | j        k    rDt_          |(j0        d          r/|(j0        j2        })tg          |)th                    rd|)v r|)d         }' nld}*| j+        |'v rBtg          |'| j+                 th                    r"d|'| j+                 v r|'| j+                 d         }*| 5                    |&|*          }+tI          j%        |+d          },| j        dk    rd| j+         d|, }-nd| j+         d|, }-| xj        dz  c_        t          tA          | j        tC          |-                    g          S dS )z/Extract tool calls from streaming model output.r   r   )rZ   Nrq   FTr   rr   >z{}r^   r[   )indexidr[   ra   )rY   {)r`   )r   r[   r\   r`   }z"[M2_STREAMING] Tool call completed

parameters
propertiesr   ra   ro   z": z, ")6r2   r1   lenr6   rP   r   countr   r   r   r#   r/   r-   r   r%   r'   r+   r.   r0   r   r   r   rstripru   rs   r   re   rb   rv   r(   rJ   r!   r   r   r   rT   rc   rd   rf   r;   r<   r,   r{   r)   rt   r   toolshasattrr[   r_   r   
isinstancerO   r   ).r?   r   r   r   r   r   r   rV   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_endrj   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paramsr}   converted_valueserialized_valuejson_fragments.                                                 r@   extract_tool_calls_streamingz2DeepSeekV32ToolParser.extract_tool_calls_streaming   s     	-'')))%,D"  	 4!$199,GG" "
 "A%%#d.E*F*F*J*J!-!3!32" "$**4+CDD"EJ "Q+B7777 ' 2 4| 4'33334  	D$4 	&,,T-BCCKT444''1,''#( #$ $)!#( #( *,'t ( 	8,..,0)(J66%/A***4+@AAA&N & D+NCCCCt !''))2243KLL "((**b00  4&&s++ A'
3B3@@@@  B]%;%;C%@%@ B'j0@AAAA#J7777 +001IJJ"&9994 -/	1##D$<cBBCbyy"))#...3t/000C	1 "c*@&A&AAA41$2IJ%**4+@BRSSR$%5%6%67II$ >C8M4N4N#NNI
  (	'944&^^D,DEE,I I 
 %>>#z::r>>(1*X2E(F%151C1CDU1V1VD.+/+F+F+H+HD('+D$'+D$
 4233t7NNN/66(,(B-1    ()&*&=#'#7):)-)Cr*" *" *" &0  	$    4  	 	(9 	$(!#%"&"9%6%E%E%E       $ )$(! # 3 (=(J(J$-OOD4I$J$J! #'888'+D$ $->>$2J#K#Kc0O O $L *3-|* *& *R//)2<@R3R)S
!,0,E,En,U,UM, R1H3 $ 7L L 2 2 %)J}5$Q$Q$Q !% 78O P$/!"  ) ! ! ! D! *)&*&=):S)I)I)I  $  F (,D$',D$.0D+LL!EFFF!M  4 LC2nnT%:C@@"99##C(((s401112 Ml$s<'8'888%%(888 ))9:	'#d.C*D*DD%kll3	)##(~~c22H%.yy%9N.2.F.F~.V.VD+ #."81"<K!*;<<!8J!,,T22 4%/^
 %/OOD4L$M$MM$**)39N)O)O'1t7L'M'M)R//(B...<2O2O,:MM)R//,8MM  $4	AA03J (,t$**&0-&@&//55 ;*5crc*:K LW/0GH (*1 *d6L6R *(,(>(D * *$+D*$=$=!*(,(:d>X(X(X(/|(L(L )Y .2]-EF(264(@(@%L,8F,B,B7=l7K$)E &.
 3|CC *<8O+PRV W W D &,t7N*O O O)5d6M)Nv)VJ +/*C*C'+ + ,0:+%, , ,(  +q00 RD$; R R@P R R *M
 !Ud&= T TBR T T * ((A-((+ -*.*A->-W-W-W!" !" !"(       ts   AV, ,
V98V9)r>   
__module____qualname____doc__r   r   r   rJ   r2   rO   rT   r   r	   rl   rv   r{   r   r   r   r   r   r   __classcell__)r=   s   @r@   r   r      s        =
- =
 =
 =
 =
 =
 =
~/ / / / /( ( (*s td{    11 '1 
&	1 1 1 1f
c 
c 
 
 
 
PS PS P P P P# 3 3    B__ _ 	_
 %SM_ $C=_ "#_ '_ 
	_ _ _ _ _ _ _ _rA   r   )rc   rF   collections.abcr   typingr   regexr3   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>   r;   r    rA   r@   <module>r      sJ     $ $ $ $ $ $                               $ # # # # # ) ) ) ) ) )      
X		r r r r rJ r r r r rrA   