
    .`i{                         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ef fdZdefdZd ZdedefdZded	ede	fd
Z
de	dee         fdZdedee         de	fdZdededee         fdZdededz  dedz  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 ) MinimaxM2ToolParser	tokenizerc                    t                                          |           g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d | _
        g | _        d| _        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tI          d          | j%        &                    | j                  | _'        | j%        &                    | j                  | _(        | j'        | j(        tS          d          tT          +                    d| j,        j-                   d S )Nz<minimax:tool_call>z</minimax:tool_call>z<invoke name=z	</invoke>z<parameter name=z</parameter>Fr    z,<minimax:tool_call>(.*?)</minimax:tool_call>z<invoke name=(.*?)</invoke>z!<parameter name=(.*?)</parameter>zUThe model tokenizer must be passed to the ToolParser constructor during construction.zTMiniMax M2 Tool parser could not locate tool call start/end tokens in the tokenizer!z)vLLM Successfully import tool parser %s !).super__init__prev_tool_call_arr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accumulated_text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vocabgettool_call_start_token_idtool_call_end_token_idRuntimeErrorloggerdebug	__class____name__)selfr   r@   s     |/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/minimax_m2_tool_parser.pyr   zMinimaxM2ToolParser.__init__    s   ###.0 +@"(> (7 %0%7(6  -2#+/13#*/!!" ()!"!&15".2(*  !#!&%'"'!&(*?C 	##%%% )+
;RY)
 )
% &(Z*BI&
 &
" )+
0"))
 )
% # 	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rB   s    rC   _generate_tool_call_idz*MinimaxM2ToolParser._generate_tool_call_idf   s"    .tz||',...rD   c                 J   d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        i | _        d| _        | j                                         | 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/   r   clearr   rL   s    rC   r0   z*MinimaxM2ToolParser._reset_streaming_statej   s    "#$)! #%)""&#%   "! "$!%%%'''#))+++++rD   name_strc                     |                                 }|                    d          r|                    d          s*|                    d          r|                    d          r
|dd         S |S )z Extract name from quoted string."'   )strip
startswithendswith)rB   rP   s     rC   _extract_namez!MinimaxM2ToolParser._extract_name   s    >>##$$	"!!#&&	" ""3''	" !!#&&		" AbD>!rD   value
param_typec                 0    |                      ||g          S )zIConvert parameter value to the correct type (legacy single-type version).)_convert_param_value_with_types)rB   rZ   r[   s      rC   _convert_param_valuez(MinimaxM2ToolParser._convert_param_value   s    33EJ<HHHrD   schemac                    |dgS t          |t                    sdgS t                      }d|v rw|d         }t          |t                    r|                    |           nDt          |t
                    r/|D ],}t          |t                    r|                    |           -d|v rKt          |d         t
                    r/|d         r&|d         D ]}||                    d           t          |t                    r|                    d           Ft          |t                    r|                    d           qt          |t                    r|                    d           t          |t                    r|                    d           t          |t
                    r|                    d	           t          |t                    r|                    d
           dD ]V}||v rPt          ||         t
                    r5||         D ],}| 	                    |          }|
                    |           -W|sdgS t          |          S )a5  
        Extract all possible types from a JSON schema definition.
        Handles anyOf, oneOf, allOf, type arrays, and enum fields.

        Args:
            schema: The JSON schema definition for a parameter

        Returns:
            List of type strings (e.g., ["string", "integer", "null"])
        Nstringtypeenumnullbooleanintegernumberarrayobject)anyOfoneOfallOf)
isinstancedictsetstraddlistboolintfloat_extract_types_from_schemaupdate)	rB   r_   types
type_valuetrZ   choice_fieldchoice	extracteds	            rC   rv   z.MinimaxM2ToolParser._extract_types_from_schema   s}    >:&$'' 	:%% VJ*c** %		*%%%%J-- %# % %A!!S)) %		! V
6&>4 @ @VF^ ( (=IIf%%%%t,, (IIi((((s++ 	(IIi((((u-- (IIh''''s++ (IIh''''t,, (IIg&&&&t,, (IIh''' 8 	, 	,Lv%%*VL5I4*P*P%$\2 , ,F $ ? ? G GILL++++  	:E{{rD   param_typesc                    |                                 dv rdS d |D             }g d}|D ]}||vr|dv r|c S |dv r)	 t          |          c S # t          t          f$ r Y 8w xY w|dv rM	 t	          |          }|t          |          k    r|nt          |          c S # t          t          f$ r Y w xY w|dv r5|                                                                 }|d	v r d
S |dv r dS |dv r,	 t          j        |          c S # t          j        $ r Y w xY w	 t          j        |          S # t          j        $ r |cY S w xY w)a<  
        Convert parameter value to the correct type based on a list of possible types.
        Tries each type in order until one succeeds.

        Args:
            value: The string value to convert
            param_types: List of possible type strings

        Returns:
            The converted value
        )rd   nonenilNc                 6    g | ]}|                                 S  )lower).0rz   s     rC   
<listcomp>zGMinimaxM2ToolParser._convert_param_value_with_types.<locals>.<listcomp>   s     ;;;!AGGII;;;rD   )rf   rt   rg   ru   re   rs   ri   rh   ra   rp   text)ra   rp   r   )rf   rt   )rg   ru   )re   rs   )true1yesonT)false0nooffF)ri   rh   )	r   rt   r8   	TypeErrorru   rV   jsonloadsJSONDecodeError)rB   rZ   r~   normalized_typestype_priorityr[   val	lower_vals           rC   r]   z3MinimaxM2ToolParser._convert_param_value_with_types   s    ;;==3334 <;{;;;
 
 
 ( 	 	J!111666111u::%%%"I.   H222,,C"%S//33s3xx???"I.   H222!KKMM//11	 :::44"=== 55222:e,,,,,+   H 3	:e$$$# 	 	 	LLL	sG   AA$#A$,2B!!B54B56DDD#D7 7E
E
param_nameparam_configc                 z    ||vrdgS ||         }t          |t                    sdgS |                     |          S )a<  
        Get parameter types from parameter configuration.
        Handles anyOf, oneOf, allOf, and direct type definitions.

        Args:
            param_name: The name of the parameter
            param_config: The properties dict from the tool schema

        Returns:
            List of type strings
        ra   )rm   rn   rv   )rB   r   r   param_schemas       rC   _get_param_types_from_configz0MinimaxM2ToolParser._get_param_types_from_config  sO     \)):#J/,-- 	:..|<<<rD   
invoke_strtoolsNc           
         t          j        d|          }|sdS |                     |                    d                    }i }|ri|D ]f}t	          |d          rT|j        j        |k    rDt	          |j        d          r/|j        j        }t          |t                    rd|v r|d         } ngi }| j
                            |          D ]}	t          j        d|	t           j                  }
|
r|                     |
                    d                    }|
                    d                                          }|                    d	          r
|dd         }|                    d	          r
|dd
         }|                     ||          }|                     ||          ||<   t%          dt'          |t)          j        |d                              S )zParse a single <invoke> block.z^([^>]+)NrT   function
parameters
propertiesz^([^>]+)>(.*)   
rU   Fensure_asciiname	arguments)rb   r   )r1   searchrY   grouphasattrr   r   r   rm   rn   r6   findallr3   rV   rW   rX   r   r]   r   r
   r   dumps)rB   r   r   
name_matchfunction_namer   toolparams
param_dictmatchparam_matchr   param_valuer[   s                 rC   _parse_single_invokez(MinimaxM2ToolParser._parse_single_invoke.  s   
 Y{J77
 	4**:+;+;A+>+>??  
	 	 	D*--*m;;|<< < "]5F!&$// <LF4J4J'-l';E 
2:::FF 	 	E)$4eRYGGK !//0A0A!0D0DEE
)//2288::))$// 2"-abb/K''-- 3"-crc"2K ">>z<XX
 *.)M)M* *
:& !"*ZeDDD  
 
 
 	
rD   model_outputrequestc                    | j         |vrt          dg |          S 	 g }| j                            |          D ]U}| j                            |          D ]8}|                     ||r|j        nd          }|r|                    |           9V|st          dg |          S | j        	                                 |D ]3}| j                            |j
        j        |j
        j        d           4|                    | 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contentNr   r   TzError extracting tool calls)r   r	   r4   r   r5   r   r   appendr   rO   r   r   r   find	Exceptionr>   	exception)	rB   r   r   r   tool_call_matchinvoke_match	tool_callfirst_tool_idxr   s	            rC   extract_tool_callsz&MinimaxM2ToolParser.extract_tool_callsc  s    %\99/"r<   (	J $(#@#H#H#V#V 5 5$($>$F$F$W$W 5 5L $ 9 9$w&HgmmD! !I ! 5")))4445  3!&2|   
 #))+++'  	'.. ) 2 7%.%7%A     *..t/IJJN7E7I7Il?N?33tG/!j'     	 	 	:;;;/"r<     	s   BD0 #BD0 06E)(E)previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc           
      <   |r	| j         |v r|                                  || _        |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        rh| j        sa|                    | j                  }
|
| j        k    r<| xj        dz  c_        d| _        d| _        d| _        d| _        d| _        i | _        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        sY| j        |v rM|                    | j                  t	          | j                  z   }|                    d	|          }|dk    r|||         }|                     |          | _        |                                 | _         d| _        d| _        t	          | j                  | j        k    rY| j                            | j        i d
           t	          | j!                  | j        k    r| j!                            d           t          tE          | j        | j         tG          | j        d
          d          g          S dS | j        r| j        rx| j        sqd| _        | j        t	          | j!                  k     r| j!        | j        xx         dz  cc<   t          tE          | j        tG          d                    g          S | j        sd| _        | j        s| j        |v r|                    | j$                  }| j        |k    rd| _        |                    | j                  t	          | j                  z   }|                    | j        |          }|dk    r|||         }	 | %                    || j        r| j        j&        nd          }|rP| j        t	          | j                  k     r3|j'        j(        }tS          j*        |          | j        | j                 d<   n# tV          $ r Y nw xY wt          tE          | j        tG          d                    g          }| j        t	          | j!                  k     r| j!        | j        xx         dz  cc<   d| _        d| _        i | _        tX          -                    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         }#|#0                    d          r
|#dd         }#|#                    | j1                  }$|$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})te          |)d          rY|)j'        j3        | j        k    rDte          |)j'        d          r/|)j'        j4        }*tk          |*tl                    rd|*v r|*d         }( nl| 7                    | j/        |(          }+| 8                    |'|+          },tS          j9        |,d          }-| j        dk    rd| j/         d|- }.nd| j/         d|- }.| xj        dz  c_        | j        t	          | j!                  k     r| j!        | j        xx         |.z  cc<   t          tE          | j        tG          |.                    g          S dS )z/Extract tool calls from streaming model output.r   r   )r   NrT   FTrU   >r   r   )indexidr   rb   )r   {)r   )r   r   r   }z"[M2_STREAMING] Tool call completedr   r   r   r   rR   z": z, "):r   r0   r/   r<   lenr4   r   r   countr   r   r    r+   r-   r*   r   r"   r$   r(   r,   r.   r;   r   rstriprX   rV   r   r   r   rY   r%   rM   r   r   r   r   r   r   r   r   r   r   r   r   r>   r?   r)   r&   rW   r   r   r   r   rm   rn   r   r]   r   )/rB   r   r   r   r   r   r   r   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_endinvoke_contentparsed_toolargs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_idxr   r   r   r   r[   converted_valueserialized_valuejson_fragments/                                                  rC   extract_tool_calls_streamingz0MinimaxM2ToolParser.extract_tool_calls_streaming  s5     	- :j H H'')))%,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 	&,,T-BCCKT444''1,''#( #$ $)!#( #( *,'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 +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-/    t:;;t?VVV 7>>rBBB ()&*&=#'#7):)-)Cr*" *" *" &0  	$    4  I	 (9 $(!*S1L-M-MMM/0GHHHCOHHH#%"&"9%6%E%E%E       $ )$(! # ; (=(J(J$-OOD4I$J$J! #'888'+D$ $->>$2J#K#Kc0O O $L *3-|* *& *R//)2<@R3R)S!*.*C*C .#'#9!* 6 < <%)	+ +K  + 5t/F $ 7J J 0 0 (3';'E %)Jt$4$4 !% 78O P$/!"  ) ! ! ! D! *)&*&=):S)I)I)I  $  F .T5P1Q1QQQ3D4KLLLPSSLLL'+D$',D$.0D+LL!EFFF!M  4 LC2nnT%:C@@"99##C(((s401112 Mk$s<'8'888%%(888 ))9:	'#d.C*D*DD%kll3	)##(~~c22H%.yy%9N.2.@.@.P.PD+ #."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 &*%F%F 3\& &
 +/*N*N'+ + ,0:+%, , ,(  +q00 RD$; R R@P R R *M
 !Ud&= T TBR T T * ((A-((2S9T5U5UUU 78OPPP -PPP  , -*.*A->-W-W-W!" !" !"(       ts   A;X 
XX)rA   
__module____qualname__r   r   rp   rM   r0   rY   r   r^   rr   rv   r]   rn   r   r   r   r   r	   r   r   rt   r   r   __classcell__)r@   s   @rC   r   r      s@       D
- D
 D
 D
 D
 D
 D
L/ / / / /, , ,0
c 
c 
 
 
 
I# I3 I3 I I I I: :c : : : :xGG'+CyG	G G G GR==-1=	c= = = =.3
3
&*Tk3
	D3
 3
 3
 3
j44 '4 
&	4 4 4 4lnn n 	n
 %SMn $C=n "#n 'n 
	n n n n n n n nrD   r   )r   rI   collections.abcr   typingr   regexr1   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   rA   r>   r   r   rD   rC   <module>r     sJ     $ $ $ $ $ $                               $ # # # # # ) ) ) ) ) )      
X		h h h h h* h h h h hrD   