o
    -iJ(                     @   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	 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mZmZmZ eeZG dd deZdS )    N)Sequence)Allow)make_tool_call_id)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParser)consume_spacefind_common_prefixis_complete_jsonpartial_json_loadsc                       sv   e Zd ZdZdef fddZde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 )GraniteToolParserz
    Tool call parser for the granite 3.0 models. Intended
    for use with the examples/tool_chat_template_granite.jinja
    template.

    Used when --enable-auto-tool-choice --tool-call-parser granite
    are all set
    	tokenizerc                    s   t  | d| _d| _d S )Nz<|tool_call|>z<tool_call>)super__init__	bot_token
bot_string)selfr   	__class__ b/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/tool_parsers/granite_tool_parser.pyr   /   s   
zGraniteToolParser.__init__model_outputrequestreturnc              
   C   s   |  | j| j }|r|d dkrtdg |dS z*t|}t|t	s1t
dt| tdt| dd |D }td	|d dW S  t
yf } ztd
| tdg |dW  Y d }~S d }~ww )Nr   [F)tools_called
tool_callscontentzExpected dict or list, got zExtracted %d tool callsc              
   S   s2   g | ]}t d t|d tj|d ddddqS )functionname	argumentsFensure_ascii)r&   r'   )typer%   )r   r
   jsondumps).0function_callr   r   r   
<listcomp>K   s    z8GraniteToolParser.extract_tool_calls.<locals>.<listcomp>Tz.Error in extracting tool call from response %s)stripremoveprefixr   r   lstripr	   r+   loads
isinstancelist	Exceptionr*   loggerdebuglenerror)r   r   r   strippedraw_function_callsr#   er   r   r   extract_tool_calls6   s>   

z$GraniteToolParser.extract_tool_callsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc              
   C   s  t d|}||d  | jrt |t| j |}||d  | jr-t |t| j |}|r;|t|ks;|| dkr@t|dS | jrFtjntjtj	 @ }	zRd }
d }z2t
||d  |	\}}t|tu rh|}
nt|dW W S dgt| }t||||  sd|d< W n tjjjy   td Y W d S w |
sW d S |
| j }d }t|
| jd kr| jdkr|d	}|rtj|dd
}t| j| j }||d  }td| tt| jt|djdddgd}| j| j  |7  < t|
d | _d| _| jd td| j |W S | js1|d}|r0tt| jdt t|djdddgd}d| _nj|d	}|rt| j| j }tj|dd
}| j| j d	}d }|| j r`||d  }n|rztj|dd
}||krzt||}||d  }|d urtt| jt|djdddgd}| j| j  |7  < |
| _|W S  t y } zt!d| td W Y d }~d S d }~ww )Nr   r!   )r$   TFz(not enough tokens to parse into JSON yet   r'   r(   zgot arguments diff: %s)r'   )exclude_none)indexr%   )r#    zstarting on new tool %dr&   r%   )r&   )rH   r*   idr%   z.Error trying to handle streaming tool call: %sz=Skipping chunk as a result of tool streaming extraction error)"r   
startswithr   r9   r   r   current_tool_name_sentr   ALLSTRr   r*   r5   r   partial_json_parsercore
exceptionsMalformedJSONr7   r8   current_tool_idgetr+   r,   streamed_args_for_toolr   r   
model_dumpappendr   prev_tool_call_arrr   r6   r:   )r   r?   r@   rA   rB   rC   rD   r   	start_idxflagstool_call_arris_completer#   end_idxcurrent_tool_calldeltacur_argumentscur_args_jsonsentargument_difffunction_nameprev_argumentsprev_args_jsonprefixr=   r   r   r   extract_tool_calls_streaminge   s   













z.GraniteToolParser.extract_tool_calls_streaming)__name__
__module____qualname____doc__r   r   strr   r	   r>   r   intr   rh   __classcell__r   r   r   r   r   %   s6    	
/	r   )r+   collections.abcr   rO    partial_json_parser.core.optionsr   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   vllm.tool_parsers.utilsr   r   r   r   ri   r7   r   r   r   r   r   <module>   s    