o
    i1                     @   s   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
 d
eZdS )    N)Sequence)make_tool_call_id)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParserc                       s   e Zd ZdZdef fddZdedefddZd	e	de	f fd
dZ
ded	e	defddZdedefddZdedededee dee dee d	e	dedB fddZ  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                    s   t  | d| _g | _d| _g | _d| _d| _t	dtj
| _t	dtj
| _| jr@| jj| jdd| _| jj| jd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__ a/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/tool_parsers/functiongemma_tool_parser.pyr   $   s2   

z FunctionGemmaToolParser.__init__args_strreturnc              	   C   s\   i }|s|S | j |}|D ]\}}zt|}|||< W q tjy+   |||< Y qw |S )z6Parse FunctionGemma argument string into a dictionary.)r!   findalljsonloadsJSONDecodeError)r'   r,   	argumentsmatcheskeyvalueparsed_valuer*   r*   r+   _parse_argumentsI   s   
z(FunctionGemmaToolParser._parse_argumentsrequestc                    s&   t  |}|jr|jdkrd|_|S )NnoneF)r   adjust_requesttoolstool_choiceskip_special_tokens)r'   r8   r(   r*   r+   r:   Y   s   z&FunctionGemmaToolParser.adjust_requestmodel_outputc                 C   s0  | j |vrtdg |dS zv| j|}|stdg |dW S g }|D ]4}|d r+|d n|d }|d r7|d n|d }|s>q!| |}|tdt|tj	|ddd	d
 q!|r{|
| j }	|	dkrj|d |	  nd }
td||
rv|
dW S d dW S tdg |dW S  ty   td tdg |d Y S w )NF)tools_called
tool_callscontentr            functionensure_asciinamer2   )typerE   Tz7Error extracting tool calls from FunctionGemma response)r   r   r    r.   r7   appendr
   r	   r/   dumpsfindstrip	Exceptionlogger	exception)r'   r>   r8   r3   r@   match	func_namer,   r2   content_endrA   r*   r*   r+   extract_tool_calls_   s\   




z*FunctionGemmaToolParser.extract_tool_calls
delta_textc                 C   s   d}d}| j | }||s||rd| _ |S ||fD ](}tdt|D ]}||d| rC|| d | _ |d|      S q%qd| _ |S )zCBuffer incoming delta text to handle multi-token special sequences.r   r   r   rC   N)r&   endswithrangelen)r'   rV   potential_startpotential_endcombinedtagir*   r*   r+   _buffer_delta_text   s   
z*FunctionGemmaToolParser._buffer_delta_textprevious_textcurrent_textprevious_token_idscurrent_token_idsdelta_token_idsNc                 C   s`  |  |}|| }| j|vr|rt|dS d S z|| j}|| j}	|| j}
|| j}| j|vr<t|dW S ||
krd||	krd|  jd7  _d| _| jd | j	i  t
d| j W d S ||	kr|| j}||t| j d  }|dr|dd  }d|v r|dd	 }d|v r|ddd nd}| js|rd
| _|i d| j	| j< tt| jdt t|djd
ddgdW S | jr|r| |}|rtj|dd}| j| j }t|t|kr|t|d  }|| j| j< || j	| j d< tt| jt|djd
ddgdW S W d S |	|kr| jd	kr| jt| j	k r| j|}i }| jt|k rW|| j }|d	 rW|d }| |}|| j	| j d< |rtj|dd}| j| j }t|t|kr|t|d  }|| j| j< tt| jt|djd
ddgdW S W d S |rt|dW S W d S  ty   t
d Y d S w )N)rA   rC   Fr   zStarting new tool call %dzcall:   {r   TrH   rE   )rI   )exclude_none)indexrJ   idrE   )r@   rF   r2   )r2   )rh   rE   z'Error in streaming tool call extraction)r_   r   r   countr   r   r   r   rK   r   rP   debugrfindrY   
startswithsplitr   r   r   
model_dumpr7   r/   rL   r    r.   rO   rQ   )r'   r`   ra   rV   rb   rc   rd   r8   start_count	end_countprev_start_countprev_end_count
last_startpartial_call	func_partrS   	args_partcurrent_argscurrent_args_jsonprev_streameddiff	all_callsargsrR   r,   	args_jsonr*   r*   r+   extract_tool_calls_streaming   s   

















z4FunctionGemmaToolParser.extract_tool_calls_streaming)__name__
__module____qualname____doc__r   r   strdictr7   r   r:   r   rU   r_   r   intr   r   __classcell__r*   r*   r(   r+   r      s<    %
=	r   )r/   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   rP   r   r*   r*   r*   r+   <module>   s    