
    .`iWf                     N   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlZd dlZd dlm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"  ee#          Z$e	e
z   Z% G d de          Z& G d de          Z'dede(fdZ) G d de"          Z*dS )    N)Sequence)Enumauto)choices)ascii_lettersdigits)Any)Field)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)MistralTokenizer)
ToolParserc                       e Zd ZdZ e            Z e            Z e            Z e            Z e            Z	 e            Z
 e            Z e            Z e            ZdS )StreamingStatez6Enum for tracking the current streaming parsing state.N)__name__
__module____qualname____doc__r   WAITING_FOR_TOOL_STARTWAITING_FOR_TOOL_KEYPARSING_NAMEPARSING_NAME_COMPLETEDWAITING_FOR_ARGUMENTS_STARTPARSING_ARGUMENTSPARSING_ARGUMENTS_COMPLETEDTOOL_COMPLETEALL_TOOLS_COMPLETE     y/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/mistral_tool_parser.pyr   r   &   s        @@!TVV  466L!TVV"&$&&"&$&&DFFMr&   r   c                   j    e Zd ZU  ed           Zeed<   ed             Zedede	fd            Z
dS )MistralToolCallc                  4    t                                           S )N)r)   generate_random_idr%   r&   r'   <lambda>zMistralToolCall.<lambda>7   s    O,N,N,P,P r&   )default_factoryidc                  T    d                     t          t          d                    S )N 	   )k)joinr   ALPHANUMERICr%   r&   r'   r+   z"MistralToolCall.generate_random_id9   s#     www|q111222r&   returnc                 P    |                                  ot          |           dk    S )Nr1   )isalnumlen)r.   s    r'   is_valid_idzMistralToolCall.is_valid_id?   s    zz||,B1,r&   N)r   r   r   r
   r.   str__annotations__staticmethodr+   boolr9   r%   r&   r'   r)   r)   6   s~         e$P$PQQQBQQQ3 3 \3
 - - - - - \- - -r&   r)   model_tokenizerr5   c                 D    t          | t                    o
| j        dk     S )N   )
isinstancer   version)r>   s    r'   _is_pre_v11_tokeniserrC   D   s(    ?$455W/:QUW:W r&   c                   l    e Zd ZdZdef fdZdedef 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dedee         dedz  fdZdedee         fdZej        d             Zdedee         dedz  fdZ	 	 	 	 	 	 ddededededededeeef         fdZ xZS )MistralToolParsera#  
    Tool call parser for Mistral 7B Instruct v0.3, intended for use with
    - [`mistral_common`](https://github.com/mistralai/mistral-common/)
    - the examples/tool_chat_template_mistral.jinja template.

    Used when --enable-auto-tool-choice --tool-call-parser mistral are all set
    	tokenizerc                    t                                          |           t          | j        t                    st
                              d           g | _        d| _        t          j
        | _        d | _        d | _        d| _        t          | j                  r+t!          j        |                                           | _        d| _        | j                            | j                  | _        t/          j        dt.          j                  | _        t          | j                  | _        | j        t9          d          d S )Nz<Non-Mistral tokenizer detected when using a Mistral model...Fz[TOOL_CALLS]z\[{.*}\]zJMistral Tool Parser could not locate the tool call token in the tokenizer!)super__init__rA   r>   r   loggerinfoprev_tool_call_arrcurrent_tool_idr   r   streaming_statecurrent_tool_namecurrent_tool_mistral_idstarting_new_toolrC   ijson
parse_coro%update_stream_state_pre_v11_tokenizer	bot_tokenvocabgetbot_token_idrecompileDOTALLtool_call_regex_is_pre_v11RuntimeError)selfrF   	__class__s     r'   rJ   zMistralToolParser.__init__S   s$   ###$.0@AA 	XKKVWWW 9;$&/=/T .237$!& !566 	#.::<< DO ( JNN4>::!z+ryAA01EFF$!   %$r&   requestr5   c                     t                                          |          }t          | j        t                    s|j        r|j        dk    rd|_        |S )NnoneF)rI   adjust_requestrA   r>   r   toolstool_choiceskip_special_tokens)r`   rb   ra   s     r'   re   z MistralToolParser.adjust_requests   sY    ''((114/1ABB
	0
	0 #v-- +0G'r&   model_outputc                    | j         |vrt          dg |          S |                    | j                   }|d         }|dd         }| j        sNg }|D ]H}d|vr|                    d          }|d|         ||d         }
}	|                    |	|
d           Int          |          dk    rt          d| d	          |d                                         }	 t          j
        |          }d
 |D             }n# t          j        $ r 	 | j                            |          d         }t          j
        |          }nJ# t          t          j        f$ r1 t                              d           t          dg |          cY cY S w xY wY nw xY wd |D             }t          d|t          |          dk    r|nd          S )a  
        Extract the tool calls from a complete model response.

        Content and tool calls formatting depends on the Mistral's tokenizer version
        used to train the model:

        - < v11: `content[BOT] [{tool_call1},{tool_call2}]`
        - >= v11: `content[BOT]tool_name1{args_call1}[BOT]tool_name2{args_call2}`

        with [BOT] the tool call token.

        Note:
            For tokenizer versions >= v11, tool calls with arguments wrongly formatted
            are still returned as tool calls. This is to allow the model to know it
            tried to make a tool call. It reduces chance of another failure and
            prevents that the context is filled with tool calls wrongly placed in
            assistant message contents.
        F)tools_called
tool_callscontentr      N{name	argumentsz7Only one BOT token should have been outputted, but got .c                 X    g | ]'}|d          t          j        |d         d          d(S )rq   rr   F)ensure_asciirp   )jsondumps.0	tool_calls     r'   
<listcomp>z8MistralToolParser.extract_tool_calls.<locals>.<listcomp>   sW        " !*& 1%)Z%k2& & &   r&   z0Error in extracting tool call from response: {e}c           
      f    g | ].}t          d t          |d         |d                             /S )functionrq   rr   rp   )typer}   )r)   r   rx   s     r'   r{   z8MistralToolParser.extract_tool_calls.<locals>.<listcomp>   s^     	5
 	5
 	5
  %"6*'4    	5
 	5
 	5
r&   T)rV   r   splitr^   findappendr8   
ValueErrorstriprv   loadsJSONDecodeErrorr]   findall
IndexErrorrK   	exception)r`   ri   rb   content_and_raw_tool_callsrm   raw_tool_callsrl   raw_tool_callend_name	tool_nameargsstringified_tool_callsmistral_tool_callss                r'   extract_tool_callsz$MistralToolParser.extract_tool_calls   s   2 >--/"r<    &2%7%7%G%G",Q/3ABB7  4	J!/ 
J 
Jm++(--c22!)8),!()),  	
 !!94"H"HIIII
J >""a'' /+/ / /   &4A%6%<%<%>%>"!Z(>??
*  &0  

) '   
$($8$@$@.% %%M "&M!:!:JJ"D$89   $$%WXXX 8%*#% 6       	 J<	5
 	5
 (	5
 	5
 	5
 ,)"7||a//GGT
 
 
 	
s7   C? ?F4EFAFF
FFFprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                    | j         |vrt          |          S 	 t          | j                  r|                     ||          S |                     ||          S # t          $ r t                              d           Y d S w xY w)N)rm   )r   r   z+Error trying to handle streaming tool call.)	rY   r   rC   r>   /_extract_tool_calls_streaming_pre_v11_tokenizer_extract_tool_calls_streaming	ExceptionrK   r   )r`   r   r   r   r   r   r   rb   s           r'   extract_tool_calls_streamingz.MistralToolParser.extract_tool_calls_streaming   s     $555  
3333	$T%9:: KK)$3 L   
 99)? :     	 	 	JKKK44	s   *A A $BBc                    d}| j         t          j        k    r| j        |v sJ |                    | j                  s`||                    | j                  d         z  }| j        d                    |                    | j                  dd                   z   }|                     |          }|sXt          |          dk    rE| j         t          j
        t          j        t          j        t          j        fv rt                      S dS t                      }|r||_        t          |          dk    r||_        |r| j        s
di ig| _        |S )z
        Extracts tool calls for Mistral models
        doing tool calls of the following format:
        `[TOOL_CALLS]add{"a": 3.5, "b": 4}`
        r0   r   rn   Nrr   )rO   r   r   rY   
startswithrV   r   r3   _generate_delta_tool_callr8   r!   r"   r#   r$   r   rm   rl   rM   )r`   r   r   additional_contentdelta_tool_callsdeltas         r'   r   z/MistralToolParser._extract_tool_calls_streaming  sm    #%>#HHH$7777((88 "j&6&6t~&F&Fq&II"!^bgg$$T^44QRR8/ / 
  99*EE! 	c*:&;&;q&@&@#0:,1	(   $~~% t 	/.EM  1$$/E  	:D$; 	:(3R'8&9D#r&   c           
         |dk    s|g S d }d }| j         t          j        t          j        fvrW|                    | j                  r=| xj        dz  c_        t          j        | _         |                    | j        dd          }| j         t          j        k    r| j        d| _        d|v rmt          
                                }|                    d          d         }| xj        |z  c_        |t          |          d          }t          j        | _         n| xj        |z  c_        g S | j         t          j        k    rd }| j        |v rNd}||                    | j                  d         z  }|t          |          d          }t          j        | _         n|}g }| j        s|rK|t          | j        d|t          | j        |                              d          	          gz  }d | _        |r||                     |          z  }|S g S )
Nr0   rn   ro   r   r}   rp   T)exclude_none)indexr~   r.   r}   )rO   r   r   r!   r   rV   rN   replacerP   r)   r+   r   r8   r#   r   r   
model_dumpr   )r`   r   delta_function_nametool_idnext_function_textdelta_argumentsrets          r'   r   z+MistralToolParser._generate_delta_tool_call@  s^   z1I"',(
 
 
 ##DN33
   A%  #1#>D #++DNBBBJ>#>>>%-)+& j  )<<>>&0&6&6s&;&;A&>#&&*==&&',?(@(@(B(BC
'5'G$$ &&*4&&	>#CCC!%~++"$:#3#3DN#C#CA#FF%/O0D0D0F0F%G"'5'C$$",C% . .!"2'"!2!%!7?" " "$*$*77  	 	 *.&! Jt556HIIIJ	r&   c              #     K   	 d V \  }}}|dk    r|dk    rt           j        | _        |dk    r|dk    r|dk    rt           j        | _        |dk    r|dk    r|| _        t           j        | _        |dk    r|dk    r|dk    rt           j        | _        |d	k    r|dk    rt           j        | _        |d	k    r|d
k    rt           j        | _        |dk    r|d
k    rt           j	        | _        |dk    r|dk    rt           j
        | _        )NTitem	start_mapmap_keyrq   z	item.namestringrr   zitem.argumentsend_mapr0   	end_array)r   r   rO   r   rP   r   r    r!   r"   r#   r$   )r`   prefixeventvalues       r'   rU   z7MistralToolParser.update_stream_state_pre_v11_tokenizerx  s<     	I%*UU"VUEE[$8$8'5'J$EY$6$65F??'5'B$$$():):).&'5'L$EY$6$65K;O;O'5'Q$)))e{.B.B'5'G$)))ey.@.@'5'Q$EY$6$6'5'C$|| 4 4'5'H$'	Ir&   c                 $
   | j         J d}g }t          | j        d          }d}| j        |v ro|                    | j                  s |                    | j                  d         }d                    |                    | j                  dd                   }t          |          dk    r| j	        }| j	        t          j        k    r|                     |d          \  }}nM| j	        t          j        k    r|                     |dd	          \  }}n| j	        t          j        k    r|                     |dd
          \  }}n| j	        t          j        k    r|                     |d          \  }}n| j	        t          j        k    r|                     |d          \  }}n| j	        t          j        t          j        fv r|                     |dd          \  }}nO| j	        t          j        k    r|                     |dd          \  }}n| j	        t          j        k    r|}d}n|}d}| j	        t          j        k    r-| j                             |                    d                     || j	        k    r|t          j        t          j        fv r| j	        t          j        t          j        t          j        fvrw|r/| j        | j        |_        d| _        |                    |           d}| xj        dz  c_        t4                                          | _        t          | j        d          }|j        t;                      |_        | j        d}| j        |j        _        d| _        | j	        t          j        k    rt          j        | _	        | j	        t          j        t          j        fv r| j	        t          j        k    rt          j        | _	        d}|j        j         ||j        _         n|j        xj         |z  c_         |t          j        k    r(|j        j         !                                |j        _         t          |          dk    |r/| j        | j        |_        d| _        |                    |           |r| j"        s
di ig| _"        |st          |          dk    r3tG                      }	|r||	_$        t          |          dk    r||	_%        |	S | j	        t          j        k    rtG                      S dS )z
        Extracts tool calls for Mistral models
        doing tool calls of the following format:
        `[TOOL_CALLS][{"name": "add", "arguments":{"a": 3.5, "b": 4}}`
        Nr}   )r   r~   Fr   r0   rn   )r   stop_after_opening_curly_braces)r   stop_after_colonr   )r   stop_after_commastop_after_closing_brackets)r   stop_after_closing_curly_braces)r   r   r   )r   r   r   zutf-8Trr   )&rT   r   rN   rY   r   rV   r   r3   r8   rO   r   r   _split_deltar   r   r    r!   r"   r   r#   r$   sendencoderQ   r.   r   r)   r+   r}   r   rP   rq   rr   lstriprM   r   rm   rl   )
r`   r   r   rm   r   current_tool_callcurrent_tool_call_modifiedstreaming_state_before_parsedelta_to_be_parseddelta_messages
             r'   r   zAMistralToolParser._extract_tool_calls_streaming_pre_v11_tokenizer  s    ***02+8&Z,
 ,
 ,
 &+"//((88 >$**4>::1=!1!1$.!A!A!""!EFFJ *oo!!+/+?(#~'LLL151B1B)45 2C 2 2."JJ %)LLL 261B1B)%&45 2C 2 2."JJ %)DDD151B1B)%&01 2C 2 2."JJ
 %)SSS151B1B)45 2C 2 2."JJ %)III151B1B)45 2C 2 2."JJ %:5*   261B1B)4501 2C 2 2."JJ
 %)EEE151B1B)4501 2C 2 2."JJ
 %)JJJ$

%/"
#~'HHH$$%7%>%>w%G%GHHH
 .1EEE0"9>;WXY Y("5"0"9  . ?3?/3/K),7;4$++,=>>>-2*$$)$$/>/Q/Q/S/S,$1.#% % %! !)1->-@-@!*%1-1*262H!*/)-&#~'LLL'5'J$#0:(   '>+UUU+9+ND(-1*$-7?;M%.88%.88<NN88/>3SSS *2<CCEE &.8a *oo!!h & 	7+7'+'C!$/3,##$5666  	:D$; 	:(3R'8&9D# 	c*++a//(NNM 0(/%#$$q((+;(  #~'HHH#~~%tr&   rH   stop_after_quotesr   r   r   r   c                    d}t          |          D ]\  }	}
|
dv r"||
z  }|dz  }|dk    r|||	dz   d          fc S +|
dk    r"||
z  }|dz  }|dk    r|||	dz   d          fc S S|
dk    r"||
z  }|dz  }|dk    r|||	dz   d          fc S {|
dk    r"||
z  }|dz  }|dk    r|||	dz   d          fc S |
dk    r"||
z  }|dz  }|dk    r|||	dz   d          fc S |
d	k    r"||
z  }|dz  }|dk    r|||	dz   d          fc S ||
z  }|dfS )
Nr0   )"'rn   r   ro   }]:,)	enumerate)r`   r   r   r   r   r   r   r   r   ics              r'   r   zMistralToolParser._split_delta9  s     j))  	(  	(DAqJ"a'"!Q&!$)).
1q5770CDDDD *c"a'"/14/2a77.
1q5770CDDDD 8c"a'"/14/2a77.
1q5770CDDDD 8c"a'"+q0+.!33.
1q5770CDDDD 4c"a'" A% #q((.
1q5770CDDDD )c"a'" A% #q((.
1q5770CDDDD ) #a'"""B''r&   )rH   rH   rH   rH   rH   rH   )r   r   r   r   r   rJ   r   re   r:   r   r   r   intr   r   r   listr   r   rS   	coroutinerU   r   tupler   __classcell__)ra   s   @r'   rE   rE   J   sd        -      @&; @U      h
h
 'h
 
&	h
 h
 h
 h
T  	
 %SM $C= "# ' 
	   >33 "#3 
		3 3 3 3j6C 6D<O 6 6 6 6p _I I _I,hh "#h 
		h h h hZ "$/1/1+- "-( -(-( -( *-	-(
 *--( &)-( -( 
sCx-( -( -( -( -( -( -( -(r&   rE   )+rv   collections.abcr   enumr   r   randomr   r   r   r   typingr	   rS   regexrZ   pydanticr
   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   r   r   r   r   r   vllm.loggerr   vllm.tokenizersr   vllm.tokenizers.mistralr   &vllm.tool_parsers.abstract_tool_parserr   r   rK   r4   r   r)   r=   rC   rE   r%   r&   r'   <module>r      s0    $ $ $ $ $ $               ( ( ( ( ( ( ( (                                      $ # # # # # ) ) ) ) ) ) 4 4 4 4 4 4      
X		v%         T       - - - - -h - - -= T    \( \( \( \( \(
 \( \( \( \( \(r&   