o
    )i                     @   s   d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	m
Z
mZmZmZ d dlmZmZmZ d dlmZ d dlmZ erDd dlmZ eeZG d	d
 d
eZG dd deZG dd deZG dd deZdS )    N)ABCabstractmethod)TYPE_CHECKINGUnion)AuthorMessageRoleStreamStateTextContent)get_encoding#get_streamable_parser_for_assistantrender_for_completion)Tool)RequestOutput)ClientSessionc                   @   sX   e Zd ZedddZedee fddZedefddZ	edee
 fd	d
ZdS )ConversationContextreturnNc                 C      d S N selfoutputr   r   d/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/entrypoints/context.pyappend_output      z!ConversationContext.append_outputc                    s   d S r   r   r   r   r   r   	call_tool   s   zConversationContext.call_toolc                 C   r   r   r   r   r   r   r   need_builtin_tool_call   r   z*ConversationContext.need_builtin_tool_callc                 C   r   r   r   r   r   r   r   r   #   r   z)ConversationContext.render_for_completionr   N)__name__
__module____qualname__r   r   listr   r   boolr   intr   r   r   r   r   r      s    r   c                   @   sP   e Zd Zdd ZdddZdefddZdee fd	d
Z	dee
 fddZdS )SimpleContextc                 C   s
   d | _ d S r   last_outputr   r   r   r   __init__*      
zSimpleContext.__init__r   Nc                 C   s
   || _ d S r   r'   r   r   r   r   r   -   r*   zSimpleContext.append_outputc                 C   s   dS )NFr   r   r   r   r   r   0   s   z$SimpleContext.need_builtin_tool_callc                    s
   t dNzShould not be called.NotImplementedErrorr   r   r   r   r   3   s   zSimpleContext.call_toolc                 C   s   t dr+   r,   r   r   r   r   r   6   s   z#SimpleContext.render_for_completionr   )r    r!   r"   r)   r   r$   r   r#   r   r   r%   r   r   r   r   r   r&   (   s    
r&   c                   @   s   e Zd Zdedeeef fddZdddZe	defd	d
Z
defddZdee fddZdee fddZdedef dedee fddZdedef dedee fddZdS )HarmonyContextmessagestool_sessionsc                 C   s:   || _ || _t | _t|| _d| _d| _d| _d| _	d S Nr   )
	_messagesr0   r   parserlenZnum_init_messagesZnum_prompt_tokensZnum_cached_tokensZnum_output_tokensZnum_reasoning_tokens)r   r/   r0   r   r   r   r)   <   s   

zHarmonyContext.__init__r   Nc                 C   sR   t |tr|jd j}t | _|D ]}| j| q| jj}n|}| j	| d S r1   )

isinstancer   outputs	token_idsr   r3   processr/   r2   extend)r   r   Zoutput_token_idsZtoken_idZoutput_msgsr   r   r   r   L   s   

zHarmonyContext.append_outputc                 C   s   | j S r   )r2   r   r   r   r   r/   X   s   zHarmonyContext.messagesc                 C   s,   | j d }|j}|d uo|dp|dS )Nbrowser.python)r/   	recipient
startswithr   last_msgr=   r   r   r   r   \   s
   
z%HarmonyContext.need_builtin_tool_callc                    sp   | j sg S | j d }|j}|d ur4|dr#| | jd |I d H S |dr4| | jd |I d H S td)Nr:   r;   Zbrowserr<   zNo tool call found)r/   r=   r>   call_search_toolr0   call_python_tool
ValueErrorr?   r   r   r   r   b   s   






zHarmonyContext.call_toolc                 C   s
   t | jS r   )r   r/   r   r   r   r   r   p   r*   z$HarmonyContext.render_for_completiontool_sessionr   r@   c           	         s   t |tr|| I d H S |jdd }t|jd j}|	||I d H }|jd j}t
|d}ttj|jd}t||gtjdgS )N.   r   textrolename)authorcontentr=   )r5   r   
get_resultr=   splitjsonloadsrM   rH   r   r
   r   r   TOOLr   	ASSISTANT)	r   rD   r@   Z	tool_nameargsresult
result_strrM   rL   r   r   r   rA   s   s   

zHarmonyContext.call_search_toolc                    sz   t |tr|| I d H S d|jd ji}|d|I d H }|jd j}t|d}ttj	dd}t
||g|jtjdgS )Ncoder   r<   rG   rI   )rL   rM   channelr=   )r5   r   rN   rM   rH   r   r
   r   r   rR   r   rX   rS   )r   rD   r@   paramrU   rV   rM   rL   r   r   r   rB      s   

zHarmonyContext.call_python_toolr   )r    r!   r"   r#   dictstrr   r)   r   propertyr/   r$   r   r   r   r%   r   r   rA   rB   r   r   r   r   r.   :   s4    



r.   c                       sj   e Zd Z fddZedefddZdddZdefd	d
Z	defddZ
dee f fddZ  ZS )StreamingHarmonyContextc                    s2   t  j|i | d | _t | _t | _d | _d S r   )superr)   r(   r   r3   r   encodinglast_tok)r   rT   kwargs	__class__r   r   r)      s
   
z StreamingHarmonyContext.__init__r   c                 C   s   | j jS r   )r3   r/   r   r   r   r   r/      s   z StreamingHarmonyContext.messagesNc                 C   s   t |tr|jd jd }| j| || _d S t|dks"J d|d }|jj	t
jkr5|jd u r5d|_| j|}|D ]}| j| q=|d | _d S )Nr   rF   z&Tool output should be a single messageZ	assistantr:   )r5   r   r6   r7   r3   r8   r`   r4   rL   rJ   r   rR   r=   r_   render)r   r   tokmsgtoksr   r   r   r      s   

z%StreamingHarmonyContext.append_outputc                 C   s   | j jtjkS r   )r3   stater	   ZEXPECT_STARTr   r   r   r   is_expecting_start   s   z*StreamingHarmonyContext.is_expecting_startc                 C   s   | j | j v S r   )r`   r_   Z!stop_tokens_for_assistant_actionsr   r   r   r   is_assistant_action_turn   s   z0StreamingHarmonyContext.is_assistant_action_turnc                    sb   t   }d}g }|| | jkr"|||  |d8 }|| | jkst|D ]}| j| q&|S )Nr:   rF   )r^   r   r`   appendreversedr3   r8   )r   Zrendered_tokensZlast_nZ
to_processre   rb   r   r   r      s   
z-StreamingHarmonyContext.render_for_completionr   )r    r!   r"   r)   r\   r#   r/   r   r$   ri   rj   r%   r   __classcell__r   r   rb   r   r]      s    
r]   )rP   loggingabcr   r   typingr   r   Zopenai_harmonyr   r   r   r	   r
   Zvllm.entrypoints.harmony_utilsr   r   r   Zvllm.entrypoints.toolr   Zvllm.outputsr   Z
mcp.clientr   	getLoggerr    loggerr   r&   r.   r]   r   r   r   r   <module>   s   
^