o
    i#                     @   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 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)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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dededefddZ  ZS )Internlm2ToolParser	tokenizerc                    s   t  | d| _d S )Nr   )super__init__position)selfr   	__class__ ]/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/tool_parsers/internlm2_tool_parser.pyr   !   s   
zInternlm2ToolParser.__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   r   %   s   z"Internlm2ToolParser.adjust_requestc                 C   s(   d|v r	| dS d|v r| dS d S )N
parameters	arguments)get)r   objr   r   r   get_arguments.   s
   

z!Internlm2ToolParser.get_argumentsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                 C   s  d|vrt || _t|dS | jdkrtddS | j}d||d  vr%d S ||d  }	|	d\}
}t |
dkrE| jt |
 | _t|
dS | }|d d }| jrXtjntjtj	 @ }z|}zt
||}W n t
jjjy}   td Y W d S w | js|d}|r| jd	 | _tt| jd
t t|djdddgd}d| _| jd nd }n| | j| j }| |}|s|sd }nx|s|rtd d }nl|r|stj|dd}|d ||t |  }tt| jt|djdddgd}| j| j  |7  < n5|r=|r=tj|dd}tj|dd}t||}tt| jt|djdddgd}| j| j  |7  < | ||d< |g| _|W S  ty_   t d td Y d S w )Nz<|action_start|>)contentr    <|action_start|><|plugin|><|action_end|>z(not enough tokens to parse into JSON yetname   function)r0   T)exclude_none)indextypeidr2   )
tool_callsz<INVARIANT - impossible to have arguments reset mid-argumentsFensure_ascii)r"   )r4   r2   r"   z+Error trying to handle streaming tool call.z=Skipping chunk as a result of tool streaming extraction error)!lenr   r   current_tool_idsplitstripcurrent_tool_name_sentr   ALLSTRpartial_json_parserloadscore
exceptionsMalformedJSONloggerdebugr#   r   r   r   
model_dumpstreamed_args_for_toolappendr%   prev_tool_call_arrerrorjsondumpsr4   r   	Exception	exception)r   r&   r'   r(   r)   r*   r+   r   last_pos	new_deltatextactionflagsparsable_arrtool_call_arrfunction_namedeltaprev_argumentscur_argumentscur_arguments_jsonarguments_deltacur_args_jsonprev_args_jsonargument_diffr   r   r   extract_tool_calls_streaming5   s   












z0Internlm2ToolParser.extract_tool_calls_streamingmodel_outputc           
   	   C   s   |}|j }d|v rh|d\}}|d d }||dd  }t|}|d tj|d|di dd	}}|rF|d
d |D vrMtdg |d t	t
||ddg}	td|	t|dkrd|dS d dS tdg |dS )Nr.   r/   r   {r0   r!   r"   Fr8   c                 S   s   g | ]}|j jqS r   )r2   r0   ).0tr   r   r   
<listcomp>   s    z:Internlm2ToolParser.extract_tool_calls.<locals>.<listcomp>)tools_calledr7   r,   )r0   r"   )r2   T)r   r<   r=   findrM   rB   rN   r#   r	   r   r
   r:   )
r   rb   r   rS   r   rT   action_dictr0   r!   r7   r   r   r   extract_tool_calls   s:   
z&Internlm2ToolParser.extract_tool_calls)__name__
__module____qualname__r   r   r   r   r%   strr   intr   ra   r	   rj   __classcell__r   r   r   r   r       s:    		
 r   )rM   collections.abcr   rA    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   rk   rF   r   r   r   r   r   <module>   s    