
    iG                    *   U d dl mZ d dlZd dlmZ d dl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 d dlmZmZmZmZ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"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- 	 d dl.m/Z0 d dl1m2Z3 dZ4erd dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>  e'e?      Z@eegeAf   ZBdeCd<   d$dZD G d de      ZE G d de%      Z	 d%	 	 	 	 	 d&dZF	 d%	 	 	 	 	 d'dZGd ZHd(d!ZI	 d%	 	 	 	 	 d)d"ZJddgZKd*d#ZLy# e5$ r dZ4Y w xY w)+    )annotationsN)Callable)TYPE_CHECKING	AnnotatedAnyClassVar	TypeAliasoverload)validate_and_warn_tool_name)CallToolResultContentBlockIconTextContentToolAnnotationsToolExecution)Tool)	BaseModelFieldmodel_validator)SkipJsonSchema)	AuthCheck)
TaskConfigTaskMeta)FastMCPComponent)
get_logger)AudioFileImageNotSetNotSetT)	PrefabApp)	ComponentTF)Docket)	ExecutionFunctionTool)ArgTransformTransformedToolr	   ToolResultSerializerTypec                T    t        j                  | t              j                         S )N)fallback)pydantic_coreto_jsonstrdecode)datas    b/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/tools/tool.pydefault_serializerr2   @   s      4;;==    c                       e Zd ZU  ed      Zded<    edd      Zded	<    edd
      Zded<   	 	 	 d	 	 	 	 	 d fdZ	 	 ddZ	 xZ
S )
ToolResultz*List of content blocks for the tool result)descriptionlist[ContentBlock]contentNz4Structured content matching the tool's output schema)defaultr6   dict[str, Any] | Nonestructured_contentz)Runtime metadata about the tool executionmetac                   ||t        d      ||}t        |      }|t        rKt        |t              r|j                         }n*t        |t              rt	        |      j                         }	 t        j                  |      }t        |t              s%t        dt        |      j                   d|d      t        | A  |||	       y # t        j                  $ r}t        j                  d|         d }~ww xY w)
Nz5Either content or structured_content must be provided)resultview)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.)r8   r;   r<   )
ValueError_convert_to_content_HAS_PREFAB
isinstance
_PrefabAppr-   _PrefabComponentr,   to_jsonable_pythonPydanticSerializationErrorloggererrordicttype__name__super__init__)selfr8   r;   r<   converted_contente	__class__s         r1   rP   zToolResult.__init__O   s6    ?19TUU_(G0C70S) 0*=);)C)C)E& 24DE)39K)L)T)T)V&%2%E%E,&" 0$7  23<<=R@R?U VVV  	%:LSW 	 	
 !;;  `  ab  `c  d 	s   5C D&C??Dc                    | j                   ,t        | j                  | j                  | j                         S | j                  | j                  S | j                  | j                  fS )N)structuredContentr8   _meta)r<   r   r;   r8   rQ   s    r1   to_mcp_resultzToolResult.to_mcp_resulty   s_    
 99 !"&"9"9ii 
 ""*<<||T4444r3   )NNN)r8   zlist[ContentBlock] | Any | Noner;   zdict[str, Any] | Any | Noner<   r:   )returnzOlist[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResult)rN   
__module____qualname__r   r8   __annotations__r;   r<   rP   rY   __classcell__rT   s   @r1   r5   r5   D   s    "'@#G  16"X1-  #("M#D
  48:>&*	(
0(
 8(
 $	(
T5 	X5r3   r5   c                  .    e Zd ZU dZdZded<   ded<   dZded	<   dZd
ed<   dZded<   dZ	ded<   dZ
ded<   dZded<    ed      d&d       Z	 	 	 	 d'dZeddddddddedddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d(d       Zd)dZd*dZe	 d+	 	 	 	 	 d,d       Ze	 	 	 	 	 	 d-d       Z	 d+	 	 	 	 	 d.dZd/dZddd 	 	 	 	 	 	 	 	 	 	 	 d0d!Zedeedeededdd"
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d#       Zed2d$       Zd3 fd%Z xZS )4r   z Internal tool registration info.toolzClassVar[str]
KEY_PREFIXzOAnnotated[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   z]Annotated[ToolExecution | None, Field(description='Task execution configuration (SEP-1686)')]	executionzAnnotated[SkipJsonSchema[ToolResultSerializerType | None], Field(description='Deprecated. Return ToolResult from your tools for full control over serialization.')]
serializerzAnnotated[SkipJsonSchema[AuthCheck | list[AuthCheck] | None], Field(description='Authorization checks for this tool', exclude=True)]authzkAnnotated[float | None, Field(description='Execution timeout in seconds. If None, no timeout is applied.')]timeoutafter)modec                0    t        | j                         | S )z<Validate tool name according to MCP specification (SEP-986).)r   namerX   s    r1   _validate_tool_namezTool._validate_tool_name   s     	$DII.r3   c                   d}| j                   r| j                   }n8| j                  r,| j                  j                   r| j                  j                   }t        |j                  d| j                        |j                  d|      |j                  d| j
                        |j                  d| j                        |j                  d| j                        |j                  d| j                        |j                  d| j                        |j                  d	| j                        |j                  d
| j                               	      S )z(Convert the FastMCP tool to an MCP tool.Nrl   titler6   inputSchemaoutputSchemaiconsr   re   rW   )	rl   ro   r6   rp   rq   rr   r   re   rW   )ro   r   MCPToolgetrl   r6   rc   rd   rr   re   get_meta)rQ   	overridesro   s      r1   to_mcp_toolzTool.to_mcp_tool   s    
 ::JJE$"2"2"8"8$$**Evtyy1--/!mT5E5EF!mT__E"~t7I7IJ--4!mT5E5EFmmK@--
 	
r3   )rl   versionro   r6   rr   tagsr   exclude_argsrd   rf   r<   taskrh   rg   c               P    ddl m}  |j                  |||||||||	|
|||||      S )zCreate a Tool from a function.r   r%   )fnrl   rx   ro   r6   rr   ry   r   rz   rd   rf   r<   r{   rh   rg   )fastmcp.tools.function_toolr&   from_function)clsr}   rl   rx   ro   r6   rr   ry   r   rz   rd   rf   r<   r{   rh   rg   r&   s                    r1   r   zTool.from_function   sI    * 	=)|))##%'!
 	
r3   c                    K   t        d      w)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)rQ   	argumentss     r1   runzTool.run   s      ""CDDs   c                   t        |t              r|S t        r@t        |t              rt	        |      S t        |t
              rt	        t        |            S t        || j                        }| j                  Zt        |t        t        z  t        z  t        z        s)t        |t        t        z        rt        d |D              rt        |      S 	 t!        j"                  |      }| j                  )t        |t&              rt        ||      S t        |      S | j                  j)                  d      }t        ||r	d|i      S |      S # t         j$                  $ r t        |      cY S w xY w)zConvert a raw result to ToolResult.

        Handles ToolResult passthrough and converts raw values using the tool's
        attributes (serializer, output_schema) for proper conversion.
        r?   )rf   c              3  <   K   | ]  }t        |t                y wNrE   r   .0items     r1   	<genexpr>z&Tool.convert_result.<locals>.<genexpr>  s     M94
469   )r8   r8   r;   zx-fastmcp-wrap-resultr>   )rE   r5   rD   rF   _prefab_to_tool_resultrG   rC   rf   rd   r   r   r   r   listtupleanyr,   rH   rI   rL   rt   )rQ   	raw_valuer8   
structuredwrap_results        r1   convert_resultzTool.convert_result  sN    i,)Z0-i88)%56-ji.HII%iDOOL %y,"6">"EF9dUl3M9MM g..	/&99)DJ %*d+!'jQQg.. ((,,-DE9D*5
 	
JT
 	
 77 	/g..	/s   E E65E6c                   K   y wr    rQ   r   	task_metas      r1   _runz	Tool._run0  s     
    c                   K   y wr   r   r   s      r1   r   z	Tool._run7  s     
 &)r   c                   K   ddl m}  || d||       d{   }|r|S | j                  |       d{   S 7 !7 w)a-  Server entry point that handles task routing.

        This allows ANY Tool subclass to support background execution by setting
        task_config.mode to "supported" or "required". The server calls this
        method instead of run() directly.

        Args:
            arguments: Tool arguments
            task_meta: If provided, execute as background task and return
                CreateTaskResult. If None (default), execute synchronously and
                return ToolResult.

        Returns:
            ToolResult when task_meta is None.
            CreateTaskResult when task_meta is provided.

        Subclasses can override this to customize task routing behavior.
        For example, FastMCPProviderTool overrides to delegate to child
        middleware without submitting to Docket.
        r   )check_background_taskra   )	component	task_typer   r   N)fastmcp.server.tasks.routingr   r   )rQ   r   r   r   task_results        r1   r   z	Tool._run>  sO     2 	G1	
 
 XXi(((
 )s   >:><>>c                    | j                   j                         sy|j                  | j                  | j                  g       y)z8Register this tool with docket for background execution.N)names)task_configsupports_tasksregisterr   key)rQ   dockets     r1   register_with_docketzTool.register_with_docketd  s1    ..0
3r3   )fn_keytask_keyc               ~   K   |xs | j                   }|r||d<     |j                  |fi ||       d{   S 7 w)ae  Schedule this tool for background execution via docket.

        Args:
            docket: The Docket instance
            arguments: Tool arguments
            fn_key: Function lookup key in Docket registry (defaults to self.key)
            task_key: Redis storage key for the result
            **kwargs: Additional kwargs passed to docket.add()
        r   N)r   add)rQ   r   r   r   r   kwargs
lookup_keys          r1   add_to_docketzTool.add_to_docketj  sE     $ 'txx
$F5M5ZVZZ
5f5i@@@@s   4=;=)
rl   ro   r6   ry   r   rd   rf   r<   transform_argstransform_fnc       
        j    ddl m} | j                  |      } |j                  |||||
||||||	      S )Nr   )r(   )ra   r   rl   ro   r   r6   ry   r   rd   rf   r<   )fastmcp.tools.tool_transformr(   _ensure_tool	from_tool)r   ra   rl   ro   r6   ry   r   rd   rf   r<   r   r   r(   s                r1   r   zTool.from_tool  sN      	A%(((%)##'!
 	
r3   c                    t        |t              r|S ddlm} ddlm}m}  ||      }t        ||      r |j                  ||      S | j                  |      S )zCCoerce a callable into a Tool, respecting @tool decorator metadata.r   )get_fastmcp_meta)r&   ToolMeta)metadata)rE   r   fastmcp.decoratorsr   r~   r&   r   r   )r   ra   r   r&   r   fmetas         r1   r   zTool._ensure_tool  sS     dD!K7F &eX&-<--dUCC  &&r3   c                ,    t         |          dddz  S )Nra   LocalProvider)zfastmcp.component.typezfastmcp.provider.type)rO   get_span_attributes)rQ   rT   s    r1   r   zTool.get_span_attributes  s#    w*,&,%40
 
 	
r3   )rZ   r   )rv   r   rZ   rs   ) r}   zCallable[..., Any]rl   
str | Nonerx   zstr | int | Nonero   r   r6   r   rr   zlist[Icon] | Nonery   set[str] | Noner   zToolAnnotations | Nonerz   zlist[str] | Nonerd   dict[str, Any] | NotSetT | Nonerf   ToolResultSerializerType | Noner<   r:   r{   zbool | TaskConfig | Nonerh   zfloat | Nonerg   z"AuthCheck | list[AuthCheck] | NonerZ   r&   )r   dict[str, Any]rZ   r5   )r   r   rZ   r5   r   )r   r   r   NonerZ   r5   )r   r   r   r   rZ   zmcp.types.CreateTaskResult)r   r   r   zTaskMeta | NonerZ   z'ToolResult | mcp.types.CreateTaskResult)r   r#   rZ   r   )r   r#   r   r   r   r   r   r   r   r   rZ   r$   )ra   Tool | Callable[..., Any]rl   r   ro   str | NotSetT | Noner6   r   ry   r   r   z ToolAnnotations | NotSetT | Nonerd   r   rf   r   r<   r   r   zdict[str, ArgTransform] | Noner   zCallable[..., Any] | NonerZ   r(   )ra   r   rZ   r   )rZ   r   )rN   r[   r\   __doc__rb   r]   rd   r   re   rf   rg   rh   r   rm   rw   classmethodr   r   r   r   r
   r   r   r   r   r   r   r^   r_   s   @r1   r   r      sU   * &J& 
 	    	    	    	    	 	   	    '" #


 

4 
  $( "&#' $.2)-9?6:&*)- $37#&
&
 	&

 "&
 &
  &
 !&
 &
 ,&
 '&
 7&
 4&
 $&
 '&
  !&
" 1#&
$ 
%&
 &
P
E,
\  !  
	  )!) ) 
$	) ) &*$)!$) #$) 
1	$)L4 "#AA "A
 A A A 
A. 
  &,,2 $8>9?6:069=26
'
 	

 $
 *
 
 6
 7
 4
 .
 7
 0
 

 
B ' '
 
r3   r   c                    |		  ||       S t        |       S # t         $ r,}t        j                  d|d       Y d }~t        |       S d }~ww xY w)Nz!Error serializing tool result: %sT)exc_info)	ExceptionrJ   warningr2   )r>   rf   rS   s      r1   _serialize_with_fallbackr     se     	f%% f%%  	NN3    f%%	s    	AAAc                N   t        | t              r| S t        | t              r| j                         S t        | t              r| j                         S t        | t              r| j                         S t        | t              rt        d|       S t        dt        | |            S )NtextrM   r   )rE   r   r   to_image_contentr   to_audio_contentr   to_resource_contentr.   r   r   )r   rf   s     r1    _convert_to_single_content_blockr     s     $%$$$&&$$$&&$''))$T22F)A$
)STTr3   z[Rendered Prefab UI]c                X    t        t        dt              g| j                               S )z,Convert a PrefabApp to a FastMCP ToolResult.r   r   r   )r5   r   _PREFAB_TEXT_FALLBACKr-   )apps    r1   r   r     s&    &/DEF;;= r3   c                0   | g S t        | t        t        z        st        | |      gS t	        d | D              r| S t        d | D              r,| D cg c]   }t        |t              st        ||      n|" c}S t        dt        | |            gS c c}w )z2Convert a result to a sequence of content objects.c              3  <   K   | ]  }t        |t                y wr   r   r   s     r1   r   z&_convert_to_content.<locals>.<genexpr>  s     
=fd:dL)fr   c              3  f   K   | ])  }t        |t        t        z  t        z  t        z         + y wr   )rE   r   r   r   r   r   s     r1   r   z&_convert_to_content.<locals>.<genexpr>  s'     
TVT:dL50584?@Vs   /1r   r   )	rE   r   r   r   allr   r   r   r   )r>   rf   r   s      r1   rC   rC     s     ~	fte|-0DEE 
=f
== 
TV
TT
 	
  dL1 -T:> 	
 	
 V*B6:*VWXX
s   %Bc                    dddd}| |v rLddl }|j                  j                  r t        j                  d|  dt
        d	
       ddlm} t        ||       S t        dt        d|       )z2Deprecated re-exports for backwards compatibility.r&   ParsedFunctionra   )r&   r   ra   r   Nz
Importing zX from fastmcp.tools.tool is deprecated. Import from fastmcp.tools.function_tool instead.   )
stacklevel)function_toolzmodule z has no attribute )fastmcpsettingsdeprecation_warningswarningswarnDeprecationWarningfastmcp.toolsr   getattrAttributeErrorrN   )rl   deprecated_exportsr   r   s       r1   __getattr__r   
  s     '* !!00MMTF #C D"	 	0}d++
78,.@I
JJr3   )r0   r   rZ   r.   r   )r>   r   rf   r   rZ   r.   )r   r   rf   r   rZ   r   )r   r   rZ   r5   )r>   r   rf   r   rZ   r7   )rl   r.   rZ   r   )M
__future__r   r   collections.abcr   typingr   r   r   r   r	   r
   	mcp.typesmcpr,   mcp.shared.tool_name_validationr   r   r   r   r   r   r   r   rs   pydanticr   r   r   pydantic.json_schemar   !fastmcp.server.auth.authorizationr   fastmcp.server.tasks.configr   r   fastmcp.utilities.componentsr   fastmcp.utilities.loggingr   fastmcp.utilities.typesr   r   r   r   r    prefab_ui.appr!   rF   prefab_ui.components.baser"   rG   rD   ImportErrorr   r#   docket.executionr$   r~   r&   r   r'   r(   rN   rJ   r.   r)   r]   r2   r5   r   r   r   r   rC   __all__r   r   r3   r1   <module>r     sd   "  $    G  & 6 6 / 7 < 9 0 5GK *8J 
H	 '/ucz&: ) :>B5 B5Jm
 m
b	 @D&&<&&$ 37U
U/U U, /  37YY/Y Y: <
 Ky  Ks   ?D DD