o
    i5                     @   s   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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 d dl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)MistralTokenizer)
ToolParser)extract_intermediate_diffc                       s   e Zd Zdef 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dede
e de
e de
e dededB fddZ  ZS )JambaToolParser	tokenizerc                    s   t  | t| jtrtdd| _g | _d| _g | _	d| _
d| _t| j
 d| j tj| _| js8td| j| j
| _| j| j| _| jd u sR| jd u rVtdd S )	Nz>Detected a MistralTokenizer tokenizer when using a Jamba modelFz<tool_calls>z</tool_calls>z(.*?)zUThe model tokenizer must be passed to the ToolParser constructor during construction.zPJamba Tool parser could not locate tool calls start/end tokens in the tokenizer!)super__init__
isinstancemodel_tokenizerr   
ValueErrorcurrent_tool_name_sentprev_tool_call_arrcurrent_tool_idstreamed_args_for_tooltool_calls_start_tokentool_calls_end_tokenrecompileDOTALLtool_calls_regexvocabgettool_calls_start_token_idtool_calls_end_token_idRuntimeError)selfr   	__class__ Y/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/tool_parsers/jamba_tool_parser.pyr   !   s6   

zJambaToolParser.__init__requestreturnc                    s&   t  |}|jr|jdkrd|_|S )NnoneF)r   adjust_requesttoolstool_choiceskip_special_tokens)r(   r-   r)   r+   r,   r0   G   s   zJambaToolParser.adjust_requestmodel_outputc                 C   s   | j |vrtdg |dS z5| j|d }t|}dd |D }|d || j  }td|t|dkr=|dkr=|dW S d dW S  tyV   t	
d tdg |d Y S w )	NF)tools_called
tool_callscontentr   c              
   S   s2   g | ]}t d t|d tj|d ddddqS )functionname	argumentsFensure_ascii)r9   r:   )typer8   )r   r
   jsondumps).0function_callr+   r+   r,   
<listcomp>a   s    z6JambaToolParser.extract_tool_calls.<locals>.<listcomp>T z,Error in extracting tool call from response.)r   r	   r"   findallr>   loadsfindlen	Exceptionlogger	exception)r(   r4   r-   function_callsraw_function_callsr6   r7   r+   r+   r,   extract_tool_callsP   s0   



z"JambaToolParser.extract_tool_callsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                 C   s  | j |vr
t|dS | j|v rt|dkrd S | jrtjntjtj @ }z|| j d | j	d }	zt
|	|}
W n t
jjjyO   td Y W d S w t|
dkr[|
| j ni }t|
dkrfW d S t|
dkrt|
| jd kr| jdkr|d}|rtj|dd| j| j d	}tt| jt|d
jdddgd}| j| j  |7  < nd }nd }t|
d | _d| _| jd	 td| j |W S | js|d}|rtt| jdt t|djdddgd}d| _nd }n| j| j d}|d}|dd}|s|sd }n|s|rtd d }n|ra|satj|dd}td|| |d ||t|  }td| tt| jt|d
jdddgd}| j| j  |7  < nE|r|rtj|dd}tj|dd}td|| t||}td| tt| jt|d
jdddgd}| j| j  |7  < nd }|
| _|W S  t y   t!d td Y d S w )N)r7      r   r   z(not enough tokens to parse into JSON yetr:   Fr;    )r:   T)exclude_none)indexr8   )r6   zstarting on new tool %dr9   r8   )r9   )rW   r=   idr8   '"z<INVARIANT - impossible to have arguments reset mid-argumentszfinding %s in %sz&First tokens in arguments received: %sz!Searching for diff between 
%s
%szgot arguments diff: %sz+Error trying to handle streaming tool call.z=Skipping chunk as a result of tool streaming extraction error)"r   r   r%   rG   r   r   ALLSTRsplitr   partial_json_parserrE   core
exceptionsMalformedJSONrI   debugr   r$   r>   r?   replacer   r   r   
model_dumpappendr   r   errorrW   r   rH   rJ   )r(   rN   rO   rP   rQ   rR   rS   r-   flagsparsable_arrtool_call_arrcurrent_tool_calldiffdeltafunction_nameprev_argumentscur_argumentsnew_textcur_arguments_jsonarguments_deltacur_args_jsonprev_args_jsonargument_diffr+   r+   r,   extract_tool_calls_streaming|   s  











z,JambaToolParser.extract_tool_calls_streaming)__name__
__module____qualname__r   r   r   r0   strr	   rM   r   intr   rv   __classcell__r+   r+   r)   r,   r       s6    &	
,	r   ) r>   collections.abcr   r^   regexr    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.tokenizers.mistralr   vllm.tool_parsersr   vllm.tool_parsers.utilsr   rw   rI   r   r+   r+   r+   r,   <module>   s    