
    .`i$                         d dl Z 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
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ChatCompletionToolsParam)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParserc                   &    e Zd Zdef fdZdefdZd Zdedee	         dz  de
fd	Zd
edede
dedef
dZdedee	         dz  dedz  fdZdede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 )Qwen3CoderToolParser	tokenizerc                 z   t                                          |           d| _        g | _        d | _        g | _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        |                                  t          j        d	t          j                  | _        t          j        d
t          j                  | _        t          j        dt          j                  | _        t          j        dt          j                  | _        | j        st/          d          | j                            | j                  | _        | j                            | j                  | _        | j        | j        t9          d          t:                              d| j        j                    d S )NFz<tool_call>z</tool_call>z
<function=z</function>z<parameter=z</parameter>r   z<tool_call>(.*?)</tool_call>z.<tool_call>(.*?)</tool_call>|<tool_call>(.*?)$z*<function=(.*?)</function>|<function=(.*)$zB<parameter=(.*?)(?:</parameter>|(?=<parameter=)|(?=</function>)|$)zUThe model tokenizer must be passed to the ToolParser constructor during construction.zSQwen3 XML Tool parser could not locate tool call start/end tokens in the tokenizer!z)vLLM Successfully import tool parser %s !)!super__init__current_tool_name_sentprev_tool_call_arrcurrent_tool_idstreamed_args_for_tooltool_call_start_tokentool_call_end_tokentool_call_prefixfunction_end_tokenparameter_prefixparameter_end_tokenis_tool_call_startedfailed_count_reset_streaming_staterecompileDOTALLtool_call_complete_regextool_call_regextool_call_function_regextool_call_parameter_regexmodel_tokenizer
ValueErrorvocabgettool_call_start_token_idtool_call_end_token_idRuntimeErrorloggerinfo	__class____name__)selfr   r3   s     |/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/qwen3coder_tool_parser.pyr   zQwen3CoderToolParser.__init__!   s   ###,1#.0+/13# +8"(6 %1'4%2(6 */!!" 	##%%% )+
+RY)
 )
%  "z=ry 
  
 )+
929)
 )
% *,QI*
 *
&
 # 	3  
 )-
t7Q(R(R%&*jnnT5M&N&N#(0D4O4W+  
 	79P	
 	
 	
 	
 	
    returnc                 H    dt          j                    j        dd          S )zGenerate a unique tool call ID.call_N   )uuiduuid4hexr5   s    r6   _generate_tool_call_idz+Qwen3CoderToolParser._generate_tool_call_idY   s"    .tz||',...r7   c                     d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        i | _        d| _        dS )zReset all streaming state.r   FN )current_tool_indexr    header_sentr   current_function_namecurrent_param_namecurrent_param_valueparam_countin_paramin_functionaccumulated_textjson_startedjson_closedaccumulated_paramsstreaming_requestr?   s    r6   r"   z+Qwen3CoderToolParser._reset_streaming_state]   s    "#$)! #%)""&#%   "! "$!%r7   	func_nametoolsNc                    |i S |D ]}t          |d          r%t          |d          rt          |j        d          s8|j        dk    ru|j        j        |k    ret          |j        d          si c S |j        j        }t          |t                    rd|v r
|d         c S t          |t                    r|c S i c S t                              d|           i S )z.Extract argument configuration for a function.Ntypefunctionname
parameters
propertiesz+Tool '%s' is not defined in the tools list.)	hasattrrT   rS   rU   rV   
isinstancedictr1   debug)r5   rP   rQ   configparamss        r6   _get_arguments_configz*Qwen3CoderToolParser._get_arguments_configp   s	    =I 	 	F66** 
++070P0P {j((V_-AY-N-Nv== III3fd++ 0F0F!,////-- !MMMIIIBINNN	r7   param_value
param_nameparam_configc                    |                                 dk    rdS ||vr$|i k    rt                              d||           |S t          ||         t                    rJd||         v r@t          ||         d                                                                                    }nd}|dv r|S |                    d          sT|                    d          s?|                    d	          s*|                    d
          s|                    d          rF	 t          |          S # t          t          f$ r" t                              d|||           |cY S w xY w|                    d          s|                    d          rm	 t          |          }|t          |          z
  dk    r|nt          |          S # t          t          f$ r" t                              d|||           |cY S w xY w|dv r;|                                 }|dvrt                              d|||           |dk    S |dv s*|                    d          s|                    d          rV	 t          j        |          }|S # t          j        t          t          f$ r  t                              d|||           Y nw xY w	 t          j        |          }n:# t          t"          t          f$ r  t                              d|||           Y nw xY w|S )z8Convert parameter value based on its type in the schema.nullNzoParsed parameter '%s' is not defined in the tool parameters for tool '%s', directly returning the string value.rS   string)rd   strtextvarcharcharenumintuintlongshortunsignedz[Parsed value '%s' of parameter '%s' is not an integer in tool '%s', degenerating to string.numfloatr   zXParsed value '%s' of parameter '%s' is not a float in tool '%s', degenerating to string.)booleanboolbinary)truefalsezmParsed value '%s' of parameter '%s' is not a boolean (`true` or `false`) in tool '%s', degenerating to false.rt   )objectarrayarrrZ   listzvParsed value '%s' of parameter '%s' cannot be parsed with json.loads in tool '%s', will try other methods to parse it.z}Parsed value '%s' of parameter '%s' cannot be converted via Python `ast.literal_eval()` in tool '%s', degenerating to string.)lowerr1   r[   rY   rZ   re   strip
startswithrj   r+   	TypeErrorrp   jsonloadsJSONDecodeErrorastliteral_evalSyntaxError)r5   r_   r`   ra   rP   
param_typefloat_param_values          r6   _convert_param_valuez)Qwen3CoderToolParser._convert_param_value   s   
 &((4\))r!!$     |J/66	",z222\*5f=>>DDFFLLNNJJ!JMMM!!%((L	$$V,,L	 $$V,,L	 $$W--	L	
 $$Z00L	
#;'''	* # # #D   #"""# ""5)) :	Z-B-B7-K-K :	#$)+$6$6! )3/@+A+AAQFF &%.//
 	* # # #<   #"""# 888%++--K"333     &(( 888((00 9((00 9"&*["9"9K&&,iD   LL5 $"!    
!.{;;Y7   4       sH   D) )0EE
5G   0G32G3$I: :9J65J6:K 4LLfunction_call_strc           
      P   |                     d          }|d |         }|                     ||          }||dz   d          }i }| j                            |          D ]}|                     d          }	|d |	         }
t	          ||	dz   d                    }|                    d          r
|dd          }|                    d          r
|d d         }|                     ||
||          ||
<   t          dt          |t          j        |d                    	          S )
N>   
rT   Fensure_asciirU   	arguments)rS   rT   )indexr^   r)   findallre   r|   endswithr   r   r   r~   dumps)r5   r   rQ   	end_indexfunction_namera   rV   
param_dict
match_textidxr`   r_   s               r6   _parse_xml_function_callz-Qwen3CoderToolParser._parse_xml_function_call   s\    &++C00	)*9*511-GG&y1}7

8@@LL 	 	J""3''C#DSD)Jjq344K%%d++ .)!""o##D)) /)#2#.%)%>%>Z}& &Jz"" !"djRW.X.X.X  
 
 
 	
r7   model_outputc                     | j                             |          }d |D             }t          |          dk    r|g}g }|D ]/}|                    | j                            |                     0d |D             }|S )Nc                 >    g | ]}|d          r|d          n|d         S r   r    .0matchs     r6   
<listcomp>z<Qwen3CoderToolParser._get_function_calls.<locals>.<listcomp>  :     
 
 
38a.E!HHeAh
 
 
r7   r   c                 >    g | ]}|d          r|d          n|d         S r   r   r   s     r6   r   z<Qwen3CoderToolParser._get_function_calls.<locals>.<listcomp>  r   r7   )r'   r   lenextendr(   )r5   r   matched_rangesraw_tool_callsraw_function_calls	tool_callfunction_callss          r6   _get_function_callsz(Qwen3CoderToolParser._get_function_calls  s    -55lCC
 
<J
 
 

 ~!##*^N' 	X 	XI%%d&C&K&KI&V&VWWWW
 
<N
 
 
 r7   requestc                      j         |vrt          dg |          S 	                      |          }t          |          dk    rt          dg |          S  fd|D             } j                                         |D ]5}|r1 j                            |j        j        |j        j	        d           6|
                     j                  }|
                     j                   }|dk    r|n|}|d |         }t          t          |          dk    ||r|nd           S # t          $ r/ t                              d           t          dg |          cY S w xY w)NF)tools_called
tool_callscontentr   c                 F    g | ]}                     |j                  S r   )r   rQ   )r   r   r   r5   s     r6   r   z;Qwen3CoderToolParser.extract_tool_calls.<locals>.<listcomp>5  s<       % --.?OO  r7   r   z,Error in extracting tool call from response.)r   r
   r   r   r   clearappendrT   rU   r   findr   	Exceptionr1   	exception)	r5   r   r   r   r   r   content_indexr   r   s	   ` `      r6   extract_tool_callsz'Qwen3CoderToolParser.extract_tool_calls#  s     44/"r<   '	!55lCCN>""a''3!&2|       )7  J #))+++'  	 +22$-$6$;)2);)E    )--d.HIIM##D$9::C-:a-?-?MMSM">M>2G/!*oo1%#*4     	 	 	KLLL/"r<     	s   9D( CD( (6E! E!previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc           
          |s                                   | _        |s|r j        |v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        r j        s|                     j	                  }
|
 j        k    ra xj        dz  c_        d _        d _        d _        d _        i  _        |                     j                  } j        |k    rd _        d S  j        s j        |v s	 j        |v rFd _         j        |v r4|d |                     j                           }|rt          |          S d S |                                                     j	                  r|                                dk    rd 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?           fd	 j        D                       }|s" j                             j        d
d           t          tA           j         j        tC           j        d          d          g          S d S  j        r j        sC j"        |vr:d _        t          tA           j        tC          d                    g          S  j        sd _         j        sM j#        |v rCd _        |                     j                  t           j                  z   }|                     j#        |          }|dk    r|||         }	  $                    | j        r j        j%        nd           }|r[tM           j                  D ]F\  }}|'                    d          |j(        j)        k    r|j(        j*        }| j        |         d<    nGn# tV          $ r Y nw xY wt          tA           j        tC          d                    g          }d _        d _        i  _        |S g }d}	 |                     j"        |          }|dk    rn-|                    |           |t           j"                  z  }O j,        sY j        t          |          k     r@t          |           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-        <    0                     j        pd j        r j        j%        nd           }( 1                    |' j-        |( j        pd          })te          j3        |)d          }* j        dk    rd j-         d|* }+nd j-         d|* }+ xj        dz  c_        t          tA           j        tC          |+                    g          S  j,        rI j/        |v r=|                     j/                  },|d |,         }- j4        s&d|-v r"|-                    d          }.|-|.dz   d          }- j4        s|-.                    d          r
|-dd          }- j4        |-z   }/|/ j         j-        <    0                     j        pd j        r j        j%        nd           }( 1                    |/ j-        pd|( j        pd          })te          j3        |)d          }*d _,        d _4        t          tA           j        tC          d                    g          S |}- j4        s&d|-v r"|-                    d          }.|-|.dz   d          }- j4        s|-.                    d          r
|-dd          }-|-r j4        r#te          j3         j4        d          dd         nd}0 xj4        |-z  c_4        te          j3         j4        d          dd         }1|1t          |0          d          }2|2r3t          tA           j        tC          |2                    g          S d S )Nr   rB   )r   r   FTr   r   c              3   T   K   | ]"}|                     d           j        k    V  #dS )rU   N)r-   rE   )r   toolr5   s     r6   	<genexpr>zDQwen3CoderToolParser.extract_tool_calls_streaming.<locals>.<genexpr>  sK       ( (  ((D,FF( ( ( ( ( (r7   z{}r   rT   )r   idrT   rS   )r   {)r   )r   rT   rU   r   }r   r   "z": z, ")5r"   rO   r/   r   r&   r   r   countr   r   r   r    rK   rM   rJ   rC   rD   rH   rL   rN   r.   r   rstripr   r{   r   r   r   rE   r@   r   anyr	   r   r   r   r   rQ   	enumerater-   rT   rU   r   r   rI   rF   r|   r   r^   r   r~   r   rG   )3r5   r   r   r   r   r   r   r   complete_calls
open_calls	tool_endstool_startscontent_beforetool_starts_counttool_start_positionsr   tool_start_idxtool_end_idx	tool_text
func_startfunc_endalready_addedfunc_content_endfunc_contentparsed_toolir   argsresultparam_starts	param_idxparam_start	remainingname_endvalue_start
value_textparam_end_idxnext_param_idxfunc_end_idxr_   ra   converted_valueserialized_valuejson_fragmentend_idxvalue_chunkgt_idx
full_valueprev_escapedfull_escapeddelta_escapeds3   `                                                  r6   extract_tool_calls_streamingz1Qwen3CoderToolParser.extract_tool_calls_streamingW  s     	-'')))%,D"  	  44#>o#U#U!$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 	$**4+CDDI4222''1,''#( #$ $)!#( *,' +001KLL*k9905D-t ( 	8 -@@-;;,0)-;;%/F***4+EFFF&N & D+NCCCCt !''))2243KLL "((**b00  4#J7777 )..t/IJJ"&7774 +-	3##D$>DDCbyy '',,,3t1222C	3 "c*>&?&???4-d.EF#(()A>RR2$^__5II$D4L0M0M!MMI
  *	$	11&^^D,ABBS)F F 
 %>>#z::r>>1::h;N1OD.+/+F+F+H+HD('+D$'+D$
 %( ( ( ( ($($;( ( ( % %M ) /66(,(B-1    ()&*&=#'#7):)-)Cr*" *" *" &0  	$    4  L	$ 	)>j)P)P$(!#%"&"9%6%E%E%E       $ )$(! # .(?9(L(L#' 
 '^^D,ABBS)F F 
 $->>$2I:#V#V #r))#,Z8H-H#IL&*&C&C(#5&D288!%	' ' ' * ,5T5L+M+M * *4#'88F#3#3{7K7P#P#P+6+?+IDNRD$;A$>{$K$)E $Q %    &%"&"9%6%E%E%E      $) #' *,' LC2nnT%:C@@"99##C(((s401112 M_$s<'8'888%%(888 ))9:	'#d.C*D*DD%kll3	)##(~~c22H.7		.BD+ #."81"<K!*;<<!8J!,,T22 4%/^
 %/OOD4L$M$MM$** *49N)O)O'1t7N'O'O)R//(B...<2O2O,:MM)R//,8MM  $79DD 14J (,t$**&0-&@&//55 ;*5crc*:K LW/0GH (,'A'A 6<"#5&D288!%	( ( +/*C*C' 3( 6<"	+ + ,0:+%, , ,(  +q00 RD$; R R@P R R *M
 !Ud&= T TBR T T * ((A-((+ -*.*A->-W-W-W!" !" !"(       } [+z99(ood.FGGG",XgX"6K  3 @{8J8J!,!1!1#!6!6&1&1*,,&?3 68N8Nt8T8T 6&1!""o "&!9K!GJGQD+D,CD $(#=#=28b1".44!	$ $L '+&?&?"/52$28b	' 'O (,z/PU'V'V'V$
 %*DM/1D, ()&*&=):.1*" *" *"  $	 	 	 	 #-K  3 @{8J8J!,!1!1#!6!6&1&1*,,&?3 68N8Nt8T8T 6&1!""o"   $7$DJt'?eTTT !"  "$ % 00K?00'+z 45( ( (B$(  )5S5F5F5H5H(I( 
#/$1.2.E1B6C2* 2* 2*%& %& %&,"	$ 	$ 	$ 	 ts   BV	 	
VV)r4   
__module____qualname__r   r   re   r@   r"   ry   r   rZ   r^   r   r   r   r   r   r   r
   r   r   rj   r   r   __classcell__)r3   s   @r6   r   r       s       6
- 6
 6
 6
 6
 6
 6
p/ / / / /& & &&%)*B%Cd%J	   0hh,/h?ChPSh	h h h hT
!$
-12J-Kd-R
	D
 
 
 
: S	    (22 '2 
&	2 2 2 2hxx x 	x
 %SMx $C=x "#x 'x 
	x x x x x x x xr7   r   )r   r~   r<   collections.abcr   typingr   regexr#   0vllm.entrypoints.openai.chat_completion.protocolr   r   'vllm.entrypoints.openai.engine.protocolr   r   r	   r
   r   r   vllm.loggerr   vllm.tokenizersr   &vllm.tool_parsers.abstract_tool_parserr   r4   r1   r   r   r7   r6   <module>r      s]   


   $ $ $ $ $ $                                 $ # # # # # ) ) ) ) ) )      
X		o o o o o: o o o o or7   