o
    i~R                     @  s  U d dl mZ d dlZd dl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mZ d dlZd dlZd dlmZmZmZmZmZ d dlmZ d dlmZm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' d dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 e	rd dl1m2Z2m3Z3 e'e4Z5ededZ6eG dd dee6 Z7G dd dZ8eege9f Z:de;d< d7ddZ<G dd dZ=G d d! d!e#ZG d"d# d#eZ>d8d'd(Z?eG d)d* d*Z@	d9d:d.d/ZA	d9d;d2d3ZB	d9d<d5d6ZCdS )=    )annotationsN)Callable)	dataclass)TYPE_CHECKING	AnnotatedAnyGenericLiteral	TypeAliasget_type_hints)CallToolResultContentBlockIconTextContentToolAnnotations)Tool)FieldPydanticSchemaGenerationError)TypeVar)get_context)FastMCPComponent)compress_schema)
get_logger)AudioFileImageNotSetNotSetTfind_kwarg_by_typeget_cached_typeadapterreplace_type)ArgTransformTransformedToolT)defaultc                   @  s   e Zd ZU dZded< dS )_WrappedResultz,Generic wrapper for non-object return types.r#   resultN)__name__
__module____qualname____doc____annotations__ r,   r,   X/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/tools/tool.pyr%   0   s   
 r%   c                   @  s   e Zd ZdS )_UnserializableTypeN)r'   r(   r)   r,   r,   r,   r-   r.   7   s    r.   r
   ToolResultSerializerTypedatar   returnstrc                 C  s   t j| td S )N)fallback)pydantic_coreto_jsonr2   decode)r0   r,   r,   r-   default_serializer>   s   r7   c                   @  s(   e Zd Z			dddd	ZdddZdS )
ToolResultNcontentlist[ContentBlock] | Any | Nonestructured_contentdict[str, Any] | Any | Nonemetadict[str, Any] | Nonec              
   C  s   |d u r|d u rt d|d u r|}t|d| _|| _|d urQztj|d}W n tjy= } z	td|   d }~ww t	|t
sQt dt|j d|d|| _d S )Nz5Either content or structured_content must be provided)r&   )valuezCould not serialize structured content. If this is unexpected, set your tool's output_schema to None to disable automatic serialization: z/structured_content must be a dict or None. Got z: zA. Tools should wrap non-dict values based on their output_schema.)
ValueError_convert_to_contentr9   r=   r4   to_jsonable_pythonPydanticSerializationErrorloggererror
isinstancedicttyper'   r;   )selfr9   r;   r=   er,   r,   r-   __init__C   s6   


zToolResult.__init__r1   Olist[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResultc                 C  s:   | j d urt| j| j| j dS | jd u r| jS | j| jfS )N)structuredContentr9   _meta)r=   r   r;   r9   )rI   r,   r,   r-   to_mcp_resultc   s   

zToolResult.to_mcp_result)NNN)r9   r:   r;   r<   r=   r>   )r1   rL   )r'   r(   r)   rK   rO   r,   r,   r,   r-   r8   B   s     r8   c                      s   e Zd ZU dZded< dZded< dZded< dZd	ed
< d? fddZd? fddZ	ddd@ddZ
edddddddedddfdAd,d-ZdBd1d2Zedeedeededddd3dCd=d>Z  ZS )Dr   z Internal tool registration info.zOAnnotated[dict[str, Any], Field(description='JSON schema for tool parameters')]
parametersNzRAnnotated[dict[str, Any] | None, Field(description='JSON schema for tool output')]output_schemaz]Annotated[ToolAnnotations | None, Field(description='Additional annotations about the tool')]r   zlAnnotated[ToolResultSerializerType | None, Field(description='Optional custom serializer for tool results')]
serializerr1   Nonec                   4   t    z
t }|  W d S  ty   Y d S w N)superenabler   _queue_tool_list_changedRuntimeErrorrI   context	__class__r,   r-   rW         
zTool.enablec                   rT   rU   )rV   disabler   rX   rY   rZ   r\   r,   r-   r_      r^   zTool.disableinclude_fastmcp_metara   bool | None	overridesr   MCPToolc                K  s   d}| j r	| j }n| jr| jj r| jj }t|d| j|d||d| j|d| j|d| j|d| j|d| j|d	| j	|d
dS )z(Convert the FastMCP tool to an MCP tool.NnametitledescriptioninputSchemaoutputSchemaiconsr   rN   r`   )re   rf   rg   rh   ri   rj   r   rN   )
rf   r   rd   getre   rg   rP   rQ   rj   get_meta)rI   ra   rc   rf   r,   r,   r-   to_mcp_tool   s"   
zTool.to_mcp_toolfnCallable[..., Any]re   
str | Nonerf   rg   rj   list[Icon] | Nonetagsset[str] | NoneToolAnnotations | Noneexclude_argslist[str] | None0dict[str, Any] | Literal[False] | NotSetT | NoneToolResultSerializerType | Noner=   r>   enabledFunctionToolc                 C  s"   t j| |||||||||	|
|dS )Create a Tool from a function.rn   re   rf   rg   rj   rr   r   ru   rQ   rR   r=   ry   )rz   from_functionr|   r,   r,   r-   r}      s   zTool.from_function	argumentsdict[str, Any]r8   c                   s
   t d)a"  
        Run the tool with arguments.

        This method is not implemented in the base Tool class and must be
        implemented by subclasses.

        `run()` can EITHER return a list of ContentBlocks, or a tuple of
        (list of ContentBlocks, dict of structured output).
        zSubclasses must implement run())NotImplementedError)rI   r~   r,   r,   r-   run   s   
zTool.run)re   rf   rg   rr   r   rQ   rR   r=   transform_argsry   transform_fntoolstr | NotSetT | None ToolAnnotations | NotSetT | Nonedict[str, Any] | NotSetT | Noner   dict[str, ArgTransform] | Noner   Callable[..., Any] | Noner"   c                C  s.   ddl m} |j|||||
||||||	|dS )Nr   )r"   )r   r   re   rf   r   rg   rr   r   rQ   rR   r=   ry   )fastmcp.tools.tool_transformr"   	from_tool)clsr   re   rf   rg   rr   r   rQ   rR   r=   r   ry   r   r"   r,   r,   r-   r      s   zTool.from_tool)r1   rS   )ra   rb   rc   r   r1   rd   rn   ro   re   rp   rf   rp   rg   rp   rj   rq   rr   rs   r   rt   ru   rv   rQ   rw   rR   rx   r=   r>   ry   rb   r1   rz   r~   r   r1   r8   )r   r   re   rp   rf   r   rg   r   rr   rs   r   r   rQ   rw   rR   rx   r=   r   r   r   ry   rb   r   r   r1   r"   )r'   r(   r)   r*   r+   rQ   r   rR   rW   r_   rm   staticmethodr   r}   r   classmethodr   __classcell__r,   r,   r\   r-   r   s   sP   
 



r   c                   @  sF   e Zd ZU ded< edddddddedddfd ddZd!ddZdS )"rz   ro   rn   Nre   rp   rf   rg   rj   rq   rr   rs   r   rt   ru   rv   rQ   rw   rR   rx   r=   r>   ry   rb   r1   c                 C  s   t j||d}|du r|jdkrtdt|	tr|j}n|	du r0tjj	r-t
jdtdd d}n|	}|durFt|trFt|sFtd	|| |j|pM|j||pR|j||j|||p[t |
||dure|dS d
dS )r{   )ru   Nz<lambda>z,You must provide a name for lambda functionsFzJPassing output_schema=False is deprecated. Use output_schema=None instead.   )
stacklevelzROutput schemas must represent object types due to MCP spec limitations. Received: T)rn   re   rf   rg   rj   rP   rQ   r   rr   rR   r=   ry   )ParsedFunctionr}   re   r@   rF   r   rQ   fastmcpsettingsdeprecation_warningswarningswarnDeprecationWarningrG   _is_object_schemarn   rg   input_schemaset)r   rn   re   rf   rg   rj   rr   r   ru   rQ   rR   r=   ry   	parsed_fnfinal_output_schemar,   r,   r-   r}     sF   

zFunctionTool.from_functionr~   r   r8   c           	        s6  ddl m} | }t| j|d}|r||vrt ||< t| j}||}t	|r1|I dH }t
|tr8|S t|| jd}| jdu rt
|ttB tB tB s_t
|ttB rdtdd |D rdt|dS zt|}t
|trvt||d	W S W n
 tjy   Y nw t|dS | jd
}t||rd|id	S |d	S )zRun the tool with arguments.r   Context
kwarg_typeNrR   c                 s      | ]}t |tV  qd S rU   rF   r   .0itemr,   r,   r-   	<genexpr>X      z#FunctionTool.run.<locals>.<genexpr>)r9   )r9   r;   x-fastmcp-wrap-resultr&   )fastmcp.server.contextr   copyr   rn   r   r   validate_pythoninspectisawaitablerF   r8   rA   rR   rQ   r   r   r   r   listtupleanyr4   rB   rG   rC   rk   )	rI   r~   r   context_kwargtype_adapterr&   unstructured_resultr;   wrap_resultr,   r,   r-   r   ?  sN   











zFunctionTool.runr   r   )r'   r(   r)   r+   r   r   r}   r   r,   r,   r,   r-   rz      s    
 =rz   schemar   boolc                 C  s.   |  ddkr	dS d| v rdS d| v od| v S )z1Check if a JSON schema represents an object type.rH   objectT
propertiesz$refz$defs)rk   )r   r,   r,   r-   r   r  s
   r   c                   @  sL   e Zd ZU ded< ded< ded< ded< d	ed
< e			ddddZdS )r   ro   rn   r2   re   rp   rg   r   r   r>   rQ   NTru   rv   validater   wrap_non_object_output_schemar1   c                 C  s  ddl m} |rSt|}|j D ]}|jtjjkrt	d|jtjj
kr*t	dq|rS|D ]#}||jvr>t	d| d|j| }|jtjjkrRt	d| dq/t|dd p\|jj}	t|}
t|sj|j}t|trr|j}g }t||d	}|r|| |r|| t|}| }t||d
d}d }t|}|j}t|trzt|d
d}|d|}W n	 t y   Y nw |tj!d t"dfvr6t#|t$%t&t't(t)t*j+j,t*j+j-t*j+j.t*j+j/t*j+j0f	t1}z/t|}|jdd}|r
t2|s
t3| }t|}|jdd}d
|d< n|}t|d
d}W n" t4y5 } zdt|vr+t56d| W Y d }~nd }~ww | ||	|
||p?d dS )Nr   r   z/Functions with *args are not supported as toolsz2Functions with **kwargs are not supported as toolszParameter 'z-' in exclude_args does not exist in function.z,' in exclude_args must have a default value.r'   r   T)prune_paramsprune_titles)include_extrasr1   .serialization)moder   )r   r.   z#Unable to generate schema for type )rn   re   rg   r   rQ   )7r   r   r   	signaturerP   valueskind	ParameterVAR_POSITIONALr@   VAR_KEYWORDr$   emptygetattrr]   r'   getdoc	isroutine__call__rF   r   __func__r   appendextendr   json_schemar   return_annotationr2   r   rk   	Exception_emptyr   r    rG   fromkeysr   r   r   r8   mcptypesr   ImageContentAudioContentResourceLinkEmbeddedResourcer.   r   r%   r   rD   debug)r   rn   ru   r   r   r   sigparamarg_namefn_namefn_docr   r   input_type_adapterr   rQ   output_type
type_hintsclean_output_typer   base_schemawrapped_typewrapped_adapterrJ   r,   r,   r-   r}     s   












zParsedFunction.from_function)NTT)
rn   ro   ru   rv   r   r   r   r   r1   r   )r'   r(   r)   r+   r   r}   r,   r,   r,   r-   r     s   
 r   r&   rR   rx   c              
   C  sV   |d ur'z|| W S  t y& } ztjd|dd W Y d }~t| S d }~ww t| S )Nz!Error serializing tool result: %sT)exc_info)r   rD   warningr7   )r&   rR   rJ   r,   r,   r-   _serialize_with_fallback  s   
r   r   r   c                 C  sl   t | tr| S t | tr|  S t | tr|  S t | tr"|  S t | tr-t	d| dS t	dt
| |dS )NtextrH   r   )rF   r   r   to_image_contentr   to_audio_contentr   to_resource_contentr2   r   r   )r   rR   r,   r,   r-    _convert_to_single_content_block  s   




r   list[ContentBlock]c                   st   | du rg S t | ttB st|  gS tdd | D r| S tdd | D r0 fdd| D S tdt|  dgS )	z2Convert a result to a sequence of content objects.Nc                 s  r   rU   r   r   r,   r,   r-   r   >  r   z&_convert_to_content.<locals>.<genexpr>c                 s  s&    | ]}t |ttB tB tB V  qd S rU   )rF   r   r   r   r   r   r,   r,   r-   r   C  s   $ c                   s$   g | ]}t |tst| n|qS r,   )rF   r   r   r   r   r,   r-   
<listcomp>D  s    z'_convert_to_content.<locals>.<listcomp>r   r   )rF   r   r   r   allr   r   r   )r&   rR   r,   r   r-   rA   1  s   
rA   )r0   r   r1   r2   )r   r   r1   r   rU   )r&   r   rR   rx   r1   r2   )r   r   rR   rx   r1   r   )r&   r   rR   rx   r1   r   )D
__future__r   r   r   collections.abcr   dataclassesr   typingr   r   r   r   r	   r
   r   	mcp.typesr   r4   r   r   r   r   r   r   rd   pydanticr   r   typing_extensionsr   r   fastmcp.server.dependenciesr   fastmcp.utilities.componentsr   fastmcp.utilities.json_schemar   fastmcp.utilities.loggingr   fastmcp.utilities.typesr   r   r   r   r   r   r   r    r   r!   r"   r'   rD   r#   r%   r.   r2   r/   r+   r7   r8   rz   r   r   r   r   rA   r,   r,   r,   r-   <module>   sR    $
(
1 
t 