o
    h/                      @   sn  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 d dl
mZmZ ddlmZ ddl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 ddlmZmZmZ ddlm Z  errd dl!mZ" ddl#m$Z$ ddl%m&Z& eG dd dZ'eddge e( f Z)	 G dd deZ*e	e)e*df Z+	 		ddee,e-  dee,e-  dee* fddZ.G dd dZ/dS )    N)	dataclass)TYPE_CHECKINGAnyCallableOptionalUnion)NotRequired	TypedDict   )_debug)AgentsExceptionModelBehaviorError	UserError)logger)RunContextWrapper)ensure_strict_json_schema)FunctionToolTool)FunctionSpanDataget_current_spanmcp_tools_span)MaybeAwaitable)r   )	AgentBase   )	MCPServerc                   @   s2   e Zd ZU dZee ed< 	 ded< 	 eed< dS )ToolFilterContextz7Context information available to tool filter functions.run_contextr   agentserver_nameN)__name__
__module____qualname____doc__r   r   __annotations__str r%   r%   P/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/mcp/util.pyr      s   
 r   MCPToolc                   @   s4   e Zd ZU dZeee  ed< 	 eee  ed< dS )ToolFilterStaticzAStatic tool filter configuration using allowlists and blocklists.allowed_tool_namesblocked_tool_namesN)r   r    r!   r"   r   listr$   r#   r%   r%   r%   r&   r(   2   s   
 r(   r)   r*   returnc                 C   s<   | du r
|du r
dS i }| dur| |d< |dur||d< |S )a  Create a static tool filter from allowlist and blocklist parameters.

    This is a convenience function for creating a ToolFilterStatic.

    Args:
        allowed_tool_names: Optional list of tool names to allow (whitelist).
        blocked_tool_names: Optional list of tool names to exclude (blacklist).

    Returns:
        A ToolFilterStatic if any filtering is specified, None otherwise.
    Nr)   r*   r%   )r)   r*   filter_dictr%   r%   r&   create_static_tool_filterB   s   r.   c                   @   s   e Zd ZdZeded dedee dddee	 f
d	d
Z
edddedee dddee	 f
ddZedddddedefddZedddddee dedef
ddZdS )MCPUtilz>Set of utilities for interop between MCP and Agents SDK tools.serversr   convert_schemas_to_strictr   r   r   r,   c           
         st   g }t  }|D ]/}| ||||I dH }dd |D }	t|	|@ dkr-td|	|@  ||	 || q|S )z2Get all function tools from a list of MCP servers.Nc                 S   s   h | ]}|j qS r%   name.0toolr%   r%   r&   	<setcomp>o       z1MCPUtil.get_all_function_tools.<locals>.<setcomp>r   z/Duplicate tool names found across MCP servers: )setget_function_toolslenr   updateextend)
clsr0   r1   r   r   tools
tool_namesserverserver_toolsserver_tool_namesr%   r%   r&   get_all_function_tools`   s"   	

zMCPUtil.get_all_function_toolsrA   c                    sh   t jd}||I dH }dd |D |j_W d   n1 s$w   Y   fdd|D S )z0Get all function tools from a single MCP server.)rA   Nc                 S   s   g | ]}|j qS r%   r2   r4   r%   r%   r&   
<listcomp>   r8   z.MCPUtil.get_function_tools.<locals>.<listcomp>c                    s   g | ]	}  |qS r%   )to_function_toolr4   r>   r1   rA   r%   r&   rE      s    )r   r3   
list_tools	span_dataresult)r>   rA   r1   r   r   spanr?   r%   rG   r&   r:   z   s   
zMCPUtil.get_function_toolsr6   r'   c              
   C   s   t | j||}|jd}}d|vri |d< |r;zt|}d}W n ty: } ztd|  W Y d}~nd}~ww t|j	|j
pBd|||dS )z3Convert an MCP tool to an Agents SDK function tool.F
propertiesTz,Error converting MCP schema to strict mode: N )r3   descriptionparams_json_schemaon_invoke_toolstrict_json_schema)	functoolspartialinvoke_mcp_toolinputSchemar   	Exceptionr   infor   r3   rN   )r>   r6   rA   r1   invoke_funcschema	is_stricter%   r%   r&   rF      s&   zMCPUtil.to_function_toolcontext
input_jsonc              
      s  z|r	t |ni }W n1 ty= } z%tjr!td|j  ntd|j d|  td|j d| |d}~ww tjrKtd|j  ntd|j d|  z|	|j|I dH }W n$ ty } zt
d|j d|  td|j d| |d}~ww tjrtd|j d ntd|j d	|  |jr|jrt |j}n&t|jd
kr|jd  }nt|jd
krdd |jD }	t |	}nd}t }
|
rt|
jtr||
j_d|ji|
j_|S td|
  |S )z5Invoke an MCP tool and return the result as a string.zInvalid JSON input for tool z: NzInvoking MCP tool z with input zError invoking MCP tool z	MCP tool z completed.z
 returned r   r   c                 S   s   g | ]}|j d dqS )json)mode)
model_dump)r5   itemr%   r%   r&   rE      s    z+MCPUtil.invoke_mcp_tool.<locals>.<listcomp>z[]rA   z>Current span is not a FunctionSpanData, skipping tool output: )r^   loadsrV   r   DONT_LOG_TOOL_DATAr   debugr3   r   	call_toolerrorr   use_structured_contentstructuredContentdumpsr;   contentmodel_dump_jsonr   
isinstancerI   r   outputmcp_datawarning)r>   rA   r6   r\   r]   	json_datar[   rJ   tool_outputtool_resultscurrent_spanr%   r%   r&   rT      s\   	zMCPUtil.invoke_mcp_toolN)r   r    r!   r"   classmethodr+   boolr   r   r   rD   r:   r   rF   r$   rT   r%   r%   r%   r&   r/   ]   s`    r/   )NN)0rR   r^   dataclassesr   typingr   r   r   r   r   typing_extensionsr   r	   rM   r   
exceptionsr   r   r   r   r   r   strict_schemar   r6   r   r   tracingr   r   r   util._typesr   	mcp.typesr'   r   r   rA   r   r   ru   ToolFilterCallabler(   
ToolFilterr+   r$   r.   r/   r%   r%   r%   r&   <module>   sD    


