
    .`i5                         d dl 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 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mZmZ  ee          Z  G d de          Z!dS )    N)Sequence)Allow)PreTrainedTokenizerBase)make_tool_call_id)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)
ToolParser)find_common_prefixis_complete_jsonpartial_json_loadsc                        e Zd ZdZ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 xZS )Llama3JsonToolParserz
    Tool call parser for Llama 3.x and 4 models intended for use with the
    examples/tool_chat_template_llama.jinja template.

    Used when --enable-auto-tool-choice --tool-call-parser llama3_json or
    llama4_json are set.
    	tokenizerc                 @   t                                          |           g | _        d| _        d| _        g | _        d| _        |                    | j        d          d         | _        t          j
        d          | _        t          j                    | _        d S )NFz<|python_tag|>)add_special_tokensr   z\{)super__init__prev_tool_call_arrcurrent_tool_idcurrent_tool_name_sentstreamed_args_for_tool	bot_tokenencodebot_token_idrecompiletool_call_start_regexjsonJSONDecoderjson_decoder)selfr   	__class__s     w/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/llama_tool_parser.pyr   zLlama3JsonToolParser.__init__/   s    ### /1$&,1#  	# *%,,T^PU,VV

 &(Z%6%6" ,..    model_outputrequestreturnc                 .   | j         |v sd|v st          dg |          S d}g }	 | j                            |t          j                  D ]L}|                                }||k    r	 | j                            ||d                   \  }}||z   }|d         }	d|v r|d         n|d	         }
|	                    t          d
t          |	t          j        |
d                                         # t          $ r[}t          |                              d          }t"                              d|           t          dg |          cY d}~c S d}~wt&          $ r1 t"                              d           t          dg |          cY c S w xY wnW# t(          $ rJ t"                              d           t"                              d|           t          dg |          cY S w xY w|rt          d|d          S t          dg |          S )z
        Extract the tool calls from a complete model response.
        Only extracts JSON content and ignores any surrounding plain text.
        Supports both single JSON and multiple JSONs separated by semicolons.
        {F)tools_called
tool_callscontentr   )timeoutNname	arguments
parametersfunctionensure_ascii)r5   r6   )typer8   z'"zCouldn't extract tool call from JSON response. Required key '%s' not present. Returning output in content with empty tool calls.z^Error in extracting tool call from response. Returning output in content with empty tool callsz7Regex timeout occurred when matching tool call pattern.z3Regex timeout occurred when matching user input: %sT)r   r   r$   finditerenvs%VLLM_TOOL_PARSE_REGEX_TIMEOUT_SECONDSstartr'   
raw_decodeappendr   r   r%   dumpsKeyErrorstrstriplogger	exception	ExceptionTimeoutErrorwarningdebug)r(   r,   r-   	end_indexr2   matchstart_indexobjjson_end_indexr5   arguments_or_paramsemissing_keys                r*   extract_tool_callsz'Llama3JsonToolParser.extract_tool_callsC   s&    ,..#2E2E/"r<    	%'
=	3<<d&P =   4 4 $kkmm)++,*.*;*F*F$[\\2+ +'C !,n <I v;D,73,>,>K((CDU ( %% !+%1%)*.*$7e+" +" +"& & &	 	 	        "%a&&,,u"5"5K$$M $	   8%*r<           !   $$L   8%*r<       Y4j  	 	 	NNTUUULLE|   0"r<     	  	/!j$   
 ,2|
 
 
 	
sQ   AF *BC87F 8
FAEFF 9FF FF AG.-G.previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc           
      \
   |                     | j                  s%|                     d          st          |          S | j        rt          j        nt          j        t          j         z  }	 g }	g }
	 |                     | j                  rt          | j                  nd}|t          |          k     rt          ||d          |          \  }}|
	                    t          ||||z                                 ||t          d          z   z  }d|v rd|vs
J d            |d         |d<   |		                    |           |t          |          k     n:# t          j        j        j        $ r t                              d           Y d S w xY wt          |	          dk    r|	| j                 ni }t          |	          dk    rd S t          |	          dk    rYt          |	          | j        d	z   k    r=| j        dk    r|                    d          }|rt'          j        |d
          }t          | j        | j                           }||d          }t                              d|           t          t-          | j        t/          |                              d                    g          }| j        | j        xx         |z  cc<   nd }nd }t          |	          d	z
  | _        d
| _        | j        	                    d           t                              d| j                   |S | j        sy|                    d          }|r^t          t-          | j        dt3                      t/          |                              d                    g          }d| _        n-d }n)|                    d          }d }|rt          | j        | j                           }t'          j        |d
          }| j        | j                                     d          }d }|
| j                 r||d          }n8|r6t'          j        |d
          }||k    rt7          ||          }||d          }|at          t-          | j        t/          |                              d                    g          }| j        | j        xx         |z  cc<   |	| _        |S # t8          $ r8 t                              d           t                              d           Y d S w xY w)Nr0   )r3   r   z; r7   r6   z-model generated both parameters and argumentsz(not enough tokens to parse into JSON yet   Fr9   zgot arguments diff: %s)r6   T)exclude_none)indexr8   )r2    zstarting on new tool %dr5   r8   )r5   )r^   r;   idr8   z+Error trying to handle streaming tool call.z=Skipping chunk as a result of tool streaming extraction error)
startswithr   r	   r   r   ALLSTRlenr   rA   r   partial_json_parsercore
exceptionsMalformedJSONrF   rK   r   getr%   rB   r   r
   r   
model_dumpr   r   r   rH   rG   )r(   rU   rV   rW   rX   rY   rZ   r-   flagstool_call_arris_complete	start_idxrO   end_idxcurrent_tool_callcur_argumentscur_args_jsonsentargument_diffdeltafunction_nameprev_argumentsprev_args_jsonprefixs                           r*   extract_tool_calls_streamingz1Llama3JsonToolParser.extract_tool_calls_streaming   s    ##DN33	47C7N7Ns7S7S	4  
3333 "8T		ei59*>TR	MK
 $..t~>>C''' 
  #l"3"333%7YZZ8PRW%X%XNS'&&(i)gBU6U)VWW   3t99!44I $s***#555K  655 ,/|+<K(!((---  #l"3"333 '+6D   GHHHtt 8;=7I7IA7M7Md233SU  =!!Q&&t
 M""Q&&3}+=+=@TWX@X+X+X '1,,$5$9$9+$F$FM$ %(,
=u(U(U(U"4#>t?S#TUU(5dee(<%=}MMM , -*.*>->2?.& .& .&&0jdj&C&C	!" !" !"(	! 	! 	! 3D4HIII)IIII !% E'*='9'9A'=$.3++22266668LMMM 0 6 1 5 5f = =  !()&*&:%/#4#6#6):)6*" *" *"",*$*"?"?  	$  E 37D// EE
 !2 5 5k B B  t:4;OPQQD$(J}5$Q$Q$QM%)%<T=Q%R%V%V#& &N %)M"4#78 :(5dee(<' :)-NQV)W)W)W(N::%7%V%VF,2455MM$0 , -*.*>->2?.& .& .&&0jdj&C&C	!" !" !"(	! 	! 	! 3D4HIII)III '4D#L 	 	 	JKKKLLO   44	sE   .S) 3C%E S) 3FS) F8S) 
E,S) 7F1S) )>T+*T+)__name__
__module____qualname____doc__r   r   rD   r   r   rT   r   intr	   rz   __classcell__)r)   s   @r*   r   r   &   s        /"9 / / / / / /([
[
*?[
	%[
 [
 [
 [
zff f 	f
 %SMf $C=f "#f 'f 
	f f f f f f f fr+   r   )"r%   collections.abcr   re   regexr"    partial_json_parser.core.optionsr   transformersr   	vllm.envsr=   vllm.entrypoints.chat_utilsr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   r	   r
   r   r   r   vllm.loggerr   &vllm.tool_parsers.abstract_tool_parserr   vllm.tool_parsers.utilsr   r   r   r{   rF   r    r+   r*   <module>r      s    $ $ $ $ $ $         2 2 2 2 2 2 0 0 0 0 0 0       9 9 9 9 9 9                     $ # # # # #               
X		` ` ` ` `: ` ` ` ` `r+   