
    .`i1                         d dl Z d dlm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  ee          Z G d	 d
e          ZdS )    N)Sequence)make_tool_call_id)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defdZde	de	f fdZ
d	ede	defd
Z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 )FunctionGemmaToolParserz
    Tool parser for Google's FunctionGemma model (google/functiongemma-270m-it).

    Handles the FunctionGemma function call format:
    <start_function_call>call:func_name{param:<escape>value<escape>}<end_function_call>
    	tokenizerc                     t                                          |           d| _        g | _        d| _        g | _        d| _        d| _        t          j	        dt          j
                  | _        t          j	        dt          j
                  | _        | j        rM| j                            | j        d          | _        | j                            | j        d          | _        ng | _        g | _        d| _        d S )	NF<start_function_call><end_function_call>za<start_function_call>call:(\w+)\{(.*?)\}<end_function_call>|<start_function_call>call:(\w+)\{(.*)z(\w+):<escape>(.*?)<escape>)add_special_tokens )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recompileDOTALLtool_call_regex	arg_regexmodel_tokenizerencodetool_call_start_token_idstool_call_end_token_idsbuffered_delta_text)selfr   	__class__s     /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/functiongemma_tool_parser.pyr   z FunctionGemmaToolParser.__init__$   s   ### -2#.0$&13# +B"(=   "z6I 
  

 *I
 

  		.-1-A-H-H*u .I . .D* ,0+?+F+F(U ,G , ,D(( .0D*+-D(#%       args_strreturnc                     i }|s|S | j                             |          }|D ]9\  }}	 t          j        |          }|||<    # t          j        $ r |||<   Y 6w xY w|S )z6Parse FunctionGemma argument string into a dictionary.)r$   findalljsonloadsJSONDecodeError)r*   r.   	argumentsmatcheskeyvalueparsed_values          r,   _parse_argumentsz(FunctionGemmaToolParser._parse_argumentsI   s    	 	.((22! 	' 	'JC'#z%00!-	#' ' ' '!&	#' s   AAArequestc                 |    t                                          |          }|j        r|j        dk    rd|_        |S )NnoneF)r   adjust_requesttoolstool_choiceskip_special_tokens)r*   r;   r+   s     r,   r>   z&FunctionGemmaToolParser.adjust_requestY   s>    ''((11= 	0W0F::*/G'r-   model_outputc                 
   | j         |vrt          dg |          S 	 | j                            |          }|st          dg |          S g }|D ]}|d         r|d         n|d         }|d         r|d         n|d         }|s5|                     |          }|                    t          dt          |t          j	        |d          	          
                     |rT|
                    | j                   }	|	dk    r|d |	                                         nd }
t          d||
r|
nd           S t          dg |          S # t          $ r/ t                              d           t          dg |          cY S w xY w)NF)tools_called
tool_callscontentr            functionensure_asciinamer5   )typerJ   Tz7Error extracting tool calls from FunctionGemma response)r   r	   r#   r1   r:   appendr   r
   r2   dumpsfindstrip	Exceptionlogger	exception)r*   rB   r;   r6   rE   match	func_namer.   r5   content_endrF   s              r,   extract_tool_callsz*FunctionGemmaToolParser.extract_tool_calls_   s!   
 %\99/"r<   1	*22<@@G 3!&2|    *,J   (-a>E!HHeAh	',Qx=588U1X   11(;;	!!'!-!*&*j&O&O&O" " "       
*//0JKK:E//L+.44666t  4!%)'.8GGD    0"r<     	 	 	VWWW/"r<     	s   -E	 C+E	 7E	 	6FF
delta_textc                 \   d}d}| j         |z   }|                    |          s|                    |          r	d| _         |S ||fD ]^}t          dt          |                    D ]>}|                    |d|                   r|| d         | _         |d|          c c S ?_d| _         |S )zCBuffer incoming delta text to handle multi-token special sequences.r   r   r   rH   N)r)   endswithrangelen)r*   r[   potential_startpotential_endcombinedtagis          r,   _buffer_delta_textz*FunctionGemmaToolParser._buffer_delta_text   s    1-+j8_-- 	1B1B=1Q1Q 	')D$O#]3 	) 	)C1c#hh'' ) )$$S!W-- )/7!D,#CaRC=((((())
 $& r-   previous_textcurrent_textprevious_token_idscurrent_token_idsdelta_token_idsNc           
      	   |                      |          }||z   }| j        |vr|rt          |          S d S 	 |                    | j                  }|                    | j                  }	|                    | j                  }
|                    | j                  }| j        |vrt          |          S ||
k    rs||	k    rm| xj        dz  c_        d| _        | j                            d           | j	                            i            t                              d| j                   d S ||	k    r|                    | j                  }||t          | j                  z   d          }|                    d          r|dd          }d|v r|                    d          d	         }d|v r|                    dd          d         nd}| j        sp|rnd
| _        |i d| j	        | j        <   t          t!          | j        dt#                      t%          |                              d
                    g          S | j        r|r|                     |          }|rt+          j        |d          }| j        | j                 }t          |          t          |          k    r|t          |          d          }|| j        | j        <   || j	        | j                 d<   t          t!          | j        t%          |                              d
                    g          S d S |	|k    r^| j        d	k    rP| j        t          | j	                  k     r2| j                            |          }i }| j        t          |          k     rG|| j                 }|d	         r2|d         }|                     |          }|| j	        | j                 d<   |rt+          j        |d          }| j        | j                 }t          |          t          |          k    rm|t          |          d          }|| j        | j        <   t          t!          | j        t%          |                              d
                    g          S d S |rt          |          S d S # t2          $ r t                              d           Y d S w xY w)N)rF   rH   Fr   zStarting new tool call %dzcall:   {r   TrM   rJ   )rN   )exclude_none)indexrO   idrJ   )rE   rK   r5   )r5   )ro   rJ   z'Error in streaming tool call extraction)re   r   r   countr   r   r   r   rP   r   rU   debugrfindr_   
startswithsplitr   r   r   
model_dumpr:   r2   rQ   r#   r1   rT   rV   )r*   rf   rg   r[   rh   ri   rj   r;   start_count	end_countprev_start_countprev_end_count
last_startpartial_call	func_partrX   	args_partcurrent_argscurrent_args_jsonprev_streameddiff	all_callsargsrW   r.   	args_jsons                             r,   extract_tool_calls_streamingz4FunctionGemmaToolParser.extract_tool_calls_streaming   s    ,,Z88
$z1%\99 8#J77774A	&,,T-GHHK$**4+CDDI,2243MNN*001IJJN)==#J7777 ---+	2I2I$$)$$.3++222666'..r2228$:NOOOt Y&&)//0JKK
+T%?!@!@@BB   **733 8& ,QRR 0Ii''$-OOC$8$8$;	:=:J:JIOOC33A66PR "  $: y :>D7(1-/M MD3D4HI $0$1.2.B-7+<+>+>1B1:2* 2* 2**4*$**G*G%& %& %&	,"$ $ $   6 &9 &+/+@+@+K+KL+ &48J$0u5" 5" 5" 1 150K$($81" $''8#9#9C<N<N#N#N+<S=O=O=Q=Q+RD ): %)$?(,(<%&
 )5 %)$;D<P$Q(3%& ,8,96:6J9J>B:2 :2 :22<*$*2O2O	-. -. -.4*	,& 	,& 	,& 	%& t >))'1,,1E+I I 2 2 !% 4 < <\ J JID+c)nn<< )$*> ? 8 %',QxH#'#8#8#B#BD !% !3D4HI +  $(Jt%$H$H$H	(,(C 0) y>>C,>,>>>#,S-?-?-A-A#BD ) !78LM $0$1.2.B1B6:2* 2* 2**4*$**G*G	%& %& %&,"	$ 	$ 	$ 	 t 8#J77774 	 	 	FGGG44	s4   B R1 :A7R1 3DR1 C)R1 8E"R1 R1 1$SS)__name__
__module____qualname____doc__r   r   strdictr:   r   r>   r	   rZ   re   r   intr   r   __classcell__)r+   s   @r,   r   r      su        #&- #& #& #& #& #& #&J      &; @U      ;; '; 
&	; ; ; ;zS S    (SS S 	S
 %SMS $C=S "#S 'S 
	S S S S S S S Sr-   r   )r2   collections.abcr   regexr    vllm.entrypoints.chat_utilsr   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   rU   r    r-   r,   <module>r      s3    $ $ $ $ $ $     9 9 9 9 9 9                     $ # # # # # ) ) ) ) ) ) = = = = = =	X		g g g g gj g g g g gr-   