o
    i                     @  s   d dl mZ d dlZd dl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mZ d d	lmZ d d
lmZmZ d dlmZmZ d dlmZ eeZG dd dZdS )    )annotationsN)CallableMapping)Any)ToolAnnotations)ValidationError)settings)NotFoundError	ToolError)DuplicateBehavior)Tool
ToolResult)ToolTransformConfigapply_transformations_to_tools)
get_loggerc                   @  s   e Zd ZdZ			d=d>d	d
Zd?ddZd@ddZdAddZd?ddZ						dBdCd&d'Z	dDd)d*Z
dEd/d0ZdFd2d3ZdGd4d5ZdHd6d7ZdId;d<ZdS )JToolManagerzManages FastMCP tools.Nduplicate_behaviorDuplicateBehavior | Nonemask_error_detailsbool | Nonetransformations(Mapping[str, ToolTransformConfig] | Nonec                 C  s\   i | _ |ptj| _t|pi | _|d u rd}|tjvr)td| ddtj || _	d S )NwarnzInvalid duplicate_behavior: z. Must be one of: z, )
_toolsr   r   dictr   r   __args__
ValueErrorjoinr   )selfr   r   r    r   `/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/tools/tool_manager.py__init__   s   


zToolManager.__init__returndict[str, Tool]c                   s   t | j| jd}|S )z?Return this manager's local tools with transformations applied.)toolsr   )r   r   r   )r   transformed_toolsr   r   r    _load_tools4   s   zToolManager._load_toolskeystrboolc                   s   |   I dH }||v S )zCheck if a tool exists.N)	get_toolsr   r'   r$   r   r   r    has_tool<   s   zToolManager.has_toolr   c                   s0   |   I dH }||v r|| S td|d)zGet tool by key.NTool 
 not found)r*   r	   r+   r   r   r    get_toolA   s
   zToolManager.get_toolc                   s   |   I dH S )zI
        Gets the complete, unfiltered inventory of local tools.
        N)r&   )r   r   r   r    r*   H   s   zToolManager.get_toolsfnCallable[..., Any]name
str | Nonedescriptiontagsset[str] | Noner   ToolAnnotations | None
serializerCallable[[Any], str] | Noneexclude_argslist[str] | Nonec           	   	   C  s8   t jrtjdtdd tj|||||||d}| |S )zAdd a tool to the server.zcToolManager.add_tool_from_fn() is deprecated. Use Tool.from_function() and call add_tool() instead.   )
stacklevel)r2   r4   r5   r   r:   r8   )r   deprecation_warningswarningsr   DeprecationWarningr   from_functionadd_tool)	r   r0   r2   r4   r5   r   r8   r:   toolr   r   r    add_tool_from_fnN   s    
	zToolManager.add_tool_from_fnrC   c                 C  s   | j |j}|rB| jdkrtd|j  || j |j< |S | jdkr,|| j |j< |S | jdkr9td|j | jdkr@|S |S || j |j< |S )z Register a tool with the server.r   zTool already exists: replaceerrorignore)r   getr'   r   loggerwarningr   )r   rC   existingr   r   r    rB   k   s    
	


zToolManager.add_tool	tool_nametransformationr   Nonec                 C  s   || j |< dS )zAdd a tool transformation.Nr   )r   rL   rM   r   r   r    add_tool_transformation|   s   z#ToolManager.add_tool_transformationToolTransformConfig | Nonec                 C  s   | j |S )zGet a tool transformation.)r   rH   r   rL   r   r   r    get_tool_transformation   s   z#ToolManager.get_tool_transformationc                 C  s   || j v r| j |= dS dS )zRemove a tool transformation.NrO   rR   r   r   r    remove_tool_transformation   s   
z&ToolManager.remove_tool_transformationc                 C  s&   || j v r| j |= dS td|d)zRemove a tool from the server.

        Args:
            key: The key of the tool to remove

        Raises:
            NotFoundError: If the tool is not found
        r-   r.   N)r   r	   )r   r'   r   r   r    remove_tool   s   
	zToolManager.remove_tool	argumentsdict[str, Any]r   c              
     s   |  |I dH }z	||I dH W S  ty+ } ztd|d|  |d}~w ty@ } z
td| |d}~w tyi } ztd| | jrZtd||td|d| |d}~ww )zr
        Internal API for servers: Finds and calls a tool, respecting the
        filtered protocol path.
        NzError validating tool z: zError calling tool )r/   runr   rI   	exceptionr
   	Exceptionr   )r   r'   rV   rC   er   r   r    	call_tool   s&   zToolManager.call_tool)NNN)r   r   r   r   r   r   )r"   r#   )r'   r(   r"   r)   )r'   r(   r"   r   )NNNNNN)r0   r1   r2   r3   r4   r3   r5   r6   r   r7   r8   r9   r:   r;   r"   r   )rC   r   r"   r   )rL   r(   rM   r   r"   rN   )rL   r(   r"   rQ   )rL   r(   r"   rN   )r'   r(   r"   rN   )r'   r(   rV   rW   r"   r   )__name__
__module____qualname____doc__r!   r&   r,   r/   r*   rD   rB   rP   rS   rT   rU   r\   r   r   r   r    r      s.    



	




r   )
__future__r   r?   collections.abcr   r   typingr   	mcp.typesr   pydanticr   fastmcpr   fastmcp.exceptionsr	   r
   fastmcp.settingsr   fastmcp.tools.toolr   r   fastmcp.tools.tool_transformr   r   fastmcp.utilities.loggingr   r]   rI   r   r   r   r   r    <module>   s    