o
    پi                  
   @   s  d dl Z d dlmZmZ d dlmZmZ d dlmZ zd dl	m
Z
 d dlmZ d dlmZ W n eyF Z ze Z
 ZZW Y dZ[ndZ[ww d dlmZmZ e eZd	efd
dZdedefddZ				dddZG dd deZG dd deZG dd deZdS )    N)ABCabstractmethod)AbstractAsyncContextManagerasynccontextmanager)Any)ClientSession)
sse_client)ListToolsResult)ToolDescriptionToolNamespaceConfig
server_urlc              
      s   t | d4 I d H F}t| 4 I d H '}| I d H }| I d H }||fW  d   I d H  W  d   I d H  S 1 I d H s@w   Y  W d   I d H  d S 1 I d H sVw   Y  d S )Nurl)r   r   
initialize
list_tools)r   streamssessioninitialize_responselist_tools_response r   ]/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/entrypoints/openai/tool_server.pylist_server_and_tools   s   pr   schemareturnc                 C   sv   d| v r| d= d| v r| d d u r| d= d| v r(dd | d D }|| d< | d= d| v r9dd	 | d   D | d< | S )
NtitledefaultanyOfc                 S   s    g | ]}|d  dkr|d  qS )typenullr   ).0	type_dictr   r   r   
<listcomp>)   s
    ztrim_schema.<locals>.<listcomp>r   
propertiesc                 S   s   i | ]	\}}|t |qS r   )trim_schema)r   kvr   r   r   
<dictcomp>1   s    ztrim_schema.<locals>.<dictcomp>)items)r   typesr   r   r   r#      s   

r#   list_tools_resultr	   c                 C   s.   | j D ]}t|j|_qdd | j D | _ | S )Nc                 S   s   g | ]}t |jd dr|qS )include_in_promptT)getattrannotationsr   toolr   r   r   r!   @   s    z2post_process_tools_description.<locals>.<listcomp>)toolsr#   inputSchema)r)   r.   r   r   r   post_process_tools_description7   s   
r1   c                   @   sJ   e Zd ZedefddZedefddZededee fddZ	d	S )

ToolServer	tool_namec                 C      d S Nr   selfr3   r   r   r   has_toolK      zToolServer.has_toolc                 C   r4   r5   r   r6   r   r   r   get_tool_descriptionO   r9   zToolServer.get_tool_descriptionr   c                 C   r4   r5   r   r6   r   r   r   get_tool_sessionS   s   zToolServer.get_tool_sessionN)
__name__
__module____qualname__r   strr8   r:   r   r   r;   r   r   r   r   r2   I   s    r2   c                   @   sP   e Zd Zdd ZdefddZdefddZdefd	d
ZedefddZ	dS )MCPToolServerc                 C   s
   i | _ d S r5   harmony_tool_descriptions)r7   r   r   r   __init__Y      
zMCPToolServer.__init__r   c                    s   | d}i | _i | _|D ]@}d| d}t|I d H \}}t|}t|jj|jdd |j	D d}|| j|j< |j| jvrF|| j|j< qt
d|j| qd S )N,zhttp://z/ssec                 S   s"   g | ]}t j|j|j|jd qS ))namedescription
parameters)r
   newrF   rG   r0   r-   r   r   r   r!   i   s    z1MCPToolServer.add_tool_server.<locals>.<listcomp>)rF   rG   r/   z9Tool %s already exists. Ignoring duplicate tool server %s)splitrB   urlsr   r1   r   
serverInforF   instructionsr/   loggerwarning)r7   r   	tool_urlsr   r   r   tool_from_mcpr   r   r   add_tool_server\   s0   
zMCPToolServer.add_tool_serverr3   c                 C   
   || j v S r5   rA   r6   r   r   r   r8   |   rD   zMCPToolServer.has_toolc                 C   s   | j |S r5   )rB   getr6   r   r   r   r:      s   z"MCPToolServer.get_tool_descriptionc              
   C  s   | j |}|rSt|d4 I d H 4}t| 4 I d H }| I d H  |V  W d   I d H  n1 I d H s6w   Y  W d   I d H  d S 1 I d H sLw   Y  d S td| d S )Nr   zTool %s not found)rK   rT   r   r   r   rN   rO   )r7   r3   r   r   r   r   r   r   r;      s   XzMCPToolServer.get_tool_sessionN)
r<   r=   r>   rC   r?   rR   r8   r:   r   r;   r   r   r   r   r@   W   s     r@   c                   @   sB   e Zd Zdd ZdefddZdefddZedefdd	Zd
S )DemoToolServerc                 C   sN   ddl m}m}m} i | _| }|jr|| jd< | }|jr%|| jd< d S d S )Nr   )HarmonyBrowserToolHarmonyPythonToolToolbrowserpython)sglang.srt.entrypoints.toolrV   rW   rX   r/   enabled)r7   rV   rW   rX   browser_toolpython_toolr   r   r   rC      s   
zDemoToolServer.__init__r3   c                 C   rS   r5   r/   r6   r   r   r   r8      rD   zDemoToolServer.has_toolc                 C   s<   || j vrd S |dkrt S |dkrt S td| )NrY   rZ   zUnknown tool )r/   r   rY   rZ   
ValueErrorr6   r   r   r   r:      s   
z#DemoToolServer.get_tool_descriptionc                 C  s   | j | V  d S r5   r_   r6   r   r   r   r;      s   zDemoToolServer.get_tool_sessionN)	r<   r=   r>   rC   r?   r8   r:   r   r;   r   r   r   r   rU      s    
rU   )r)   r	   r   r	   )loggingabcr   r   
contextlibr   r   typingr   mcpr   mcp.client.sser   	mcp.typesr	   ImportErroreopenai_harmonyr
   r   	getLoggerr<   rN   r?   r   dictr#   r1   r2   r@   rU   r   r   r   r   <module>   s0   


8