
    iF                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	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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mZ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+ ddl,m-Z- ddl.m/Z/ erddl0m1Z1 ddl2m3Z3  ededef         Z4 e-e5      Z6e G d de             Z7 e	dd       G d d             Z8 G d de      Z9ed&d        Z:eddddddddd!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd"       Z:e	 d(dddddddddd#		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d$       Z:	 d(dddddddddd#		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*d%Z:y)+z)Standalone @prompt decorator for FastMCP.    )annotationsN)Callable)	dataclassfield)TYPE_CHECKINGAnyLiteralProtocolTypeVaroverloadruntime_checkable)Icon)SkipJsonSchema)resolve_task_config)PromptError)PromptPromptArgumentPromptResult)	AuthCheck)transform_context_annotationswithout_injected_parameters)
TaskConfig)call_sync_fn_in_threadpool)compress_schema)
get_logger)get_cached_typeadapter)Docket)	ExecutionF.)boundc                  $    e Zd ZU dZded<   ddZy)DecoratedPromptz.Protocol for functions decorated with @prompt.
PromptMeta__fastmcp__c                     y N )selfargskwargss      o/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/prompts/function_prompt.py__call__zDecoratedPrompt.__call__6   s    #    N)r)   r   r*   r   returnr   )__name__
__module____qualname____doc____annotations__r,   r'   r-   r+   r"   r"   0   s    8=r-   r"   T)frozenkw_onlyc                      e Zd ZU dZ 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<   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<   y)r#   z8Metadata attached to functions by the @prompt decorator.promptF)defaultinitzLiteral['prompt']typeN
str | Nonenamestr | int | Noneversiontitledescriptionlist[Icon] | Noneiconsset[str] | Nonetagsdict[str, Any] | Nonemetabool | TaskConfig | Nonetask"AuthCheck | list[AuthCheck] | NoneauthTboolenabled)r/   r0   r1   r2   r   r:   r3   r<   r>   r?   r@   rB   rD   rF   rH   rJ   rL   r'   r-   r+   r#   r#   9   s    B#H5AD
AD* $G$E:"K"#E# D/ "&D
&%)D
")/3D
,3GTr-   r#   c                      e Zd ZU dZded<   eddddddddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       ZddZ	 d	 	 	 ddZdd	Z	ddd
	 	 	 	 	 	 	 	 	 	 	 ddZ
y)FunctionPromptzA prompt that is a function.z"SkipJsonSchema[Callable[..., Any]]fnN)
metadatar<   r>   r?   r@   rB   rD   rF   rH   rJ   c       
        f   t        d |||||||	|
|f	D              }||rt        d      |t        |||||||	|
|	      }|j                  xs% t	        |dd      xs |j
                  j                  }|dk(  rt        d      t        j                  |      }|j                  j                         D ]f  }|j                  t        j                  j                  k(  rt        d      |j                  t        j                  j                  k(  s]t        d	       |j                   xs t        j"                  |      }|j$                  }|t'        d
      }n(t)        |t*              rt'        j,                  |      }n|}|j/                  ||       t        j0                  |      s|j2                  }t)        |t4              r|j6                  }t9        |      }t;        |      }t=        |      }|j?                         }tA        |d      }g }d|v r|d   jC                         D ]  \  }}|jE                  d      }||j                  v r|j                  |   }|jF                  t        j                  jH                  k7  r`|jF                  tJ        urN	 t=        |jF                        }|j?                         }tM        jN                  |d      }d| }|r| d| }n|}|jW                  tY        ||||jE                  dg       v                | ||jZ                  tK        |jZ                        nd|j\                  ||j^                  ||j`                  xs
 tc               ||jd                  ||jf                        S # tP        $ r!}tR        jU                  d||       Y d}~d}~ww xY w)a'  Create a Prompt from a function.

        Args:
            fn: The function to wrap
            metadata: PromptMeta object with all configuration. If provided,
                individual parameters must not be passed.
            name, title, etc.: Individual parameters for backwards compatibility.
                Cannot be used together with metadata parameter.

        The function can return:
        - str: wrapped as single user Message
        - list[Message | str]: converted to list[Message]
        - PromptResult: used directly
        c              3  $   K   | ]  }|d u 
 y wr&   r'   ).0xs     r+   	<genexpr>z/FunctionPrompt.from_function.<locals>.<genexpr>o   s      )
W TMWs   Nz|Cannot pass both 'metadata' and individual parameters to from_function(). Use metadata alone or individual parameters alone.	r<   r>   r?   r@   rB   rD   rF   rH   rJ   r/   z<lambda>z,You must provide a name for lambda functionsz1Functions with *args are not supported as promptsz4Functions with **kwargs are not supported as prompts	forbidden)modeT)prune_titles
propertiesr@   ),:)
separatorsz8Provide as a JSON string matching the following schema: z

z4Failed to generate schema for prompt argument %s: %srequired)r<   r@   r^   )r<   r>   r?   r@   rB   	argumentsrD   rO   rF   task_configrJ   )4any	TypeErrorr#   r<   getattr	__class__r/   
ValueErrorinspect	signature
parametersvalueskind	ParameterVAR_POSITIONALVAR_KEYWORDr@   getdocrH   r   
isinstancerK   	from_boolvalidate_function	isroutiner,   staticmethod__func__r   r   r   json_schemar   itemsget
annotationemptystrjsondumps	Exceptionloggerdebugappendr   r>   r?   rB   rD   setrF   rJ   )clsrO   rP   r<   r>   r?   r@   rB   rD   rF   rH   rJ   individual_params_provided	func_namesigparam
task_valuer`   
wrapped_fntype_adapterrh   r_   
param_namearg_description	sig_paramparam_adapterparam_schema
schema_strschema_notees                                 r+   from_functionzFunctionPrompt.from_functionO   s   @ &) )
GUKdDRVW)
 &
"
 $>E  !'
H MMSWRT:Sbll>S>S 	 
"KLL #^^**,EzzW..=== !TUUzzW..::: !WXX	 - **@gnnR.@ ]]
$+6K
D)$..z:K$K%%b)4   $Bb,'B +2. 14
-j9!--/
$ZdC
 +-	:%%/%=%C%C%E!
E"'))M": / #z :I!,,0A0A0G0GG%00;,B9CWCW,XM+8+D+D+FL *.LZ)XJ -eeodp*qK.5D4ET+2W2=   "'$3!+z~~j"/M!MC &FR -5-=-=-IC(()t..#..'#%#
 	
!  ) "LL V * ! s   AN	N0N++N0c                   ddl m}  || j                        }t        j                  |      }i }|j                         D ]  \  }}||j                  v r|j                  |   }|j                  t        j                  j                  k(  s"|j                  t        u st        |t              s|||<   r	 t        |j                        }		 |	j                  |      ||<   |||<    |S # t        t        t         j"                  f$ r |	j%                  |      ||<   Y >w xY w# t        t        t         j"                  f$ r'}
t'        d| d| d|j                   d|
       |
d}
~
ww xY w)zGConvert string arguments to expected types based on function signature.r   )r   zCould not convert argument 'z' with value 'z' to expected type z	. Error: N)fastmcp.server.dependenciesr   rO   rf   rg   rv   rh   rx   rk   ry   rz   ro   r   validate_jsonre   rb   pydantic_coreValidationErrorvalidate_pythonr   )r(   r*   r   
wrapper_fnr   converted_kwargsr   param_valuer   adapterr   s              r+   _convert_string_argumentsz(FunctionPrompt._convert_string_arguments   sv   K09

+'-||~#JS^^+z2 $$(9(9(?(??''3.#K53>$Z0!"89I9I"J;B;P;P +<,Z8  0; ,A (6D   !+I}7T7TU ;B;R;R +<,Z8
 '	=3P3PQ !)::,nU`Ta b0050@0@/A1#O  !!!s6   3D	C''2DDDDE$="EE$c                  K   | j                   rT| j                   D ch c]  }|j                  s|j                   }}t        |xs i       }||z
  }|rt	        d|       	 |r|j                         ni }| j                  |      }t        j                  | j                        }t        |j                  j                               }|j                         D 	
ci c]  \  }	}
|	|v s|	|
 }}	}
t        | j                        }t        j                  | j                        r|j                  |       d{   }n=t!        |j                  |       d{   }t        j"                  |      r
| d{   }| j%                  |      S c c}w c c}
}	w 7 ^7 A7 $# t&        $ rA}t(        j+                  d| j                          t-        d| j                   d      |d}~ww xY ww)z!Render the prompt with arguments.zMissing required arguments: NzError rendering prompt .)r_   r^   r<   r   re   copyr   rf   rg   rO   rh   keysrv   r   iscoroutinefunctionr   r   isawaitableconvert_resultr}   r~   	exceptionr   )r(   r_   argr^   providedmissingr*   r   valid_paramskvr   resultr   s                 r+   renderzFunctionPrompt.render  s     >>,0NNKNScllNHK9?+H)G #?y!IJJ#	M)2Y^^%F 33F;F ##DGG,Cs~~2245L'-||~K~tq!l9Jad~FK 2$'':L **4773+;;FCC  : 00&   &&v.#)\F&&v..M L& L D
 *  	M6tyykBC 7		{!DE1L	Ms   G-FF&G-$A:F  F+F0AF  ;F<F  FF  9F:F  G-F  F  F   	G*)<G%%G**G-c                    | j                   j                         sy|j                  | j                  | j                  g       y)zRegister this prompt with docket for background execution.

        FunctionPrompt registers the underlying function, which has the user's
        Depends parameters for docket to resolve.
        N)names)r`   supports_tasksregisterrO   key)r(   dockets     r+   register_with_docketz#FunctionPrompt.register_with_docketK  s3     ..0z2r-   )fn_keytask_keyc                  K   |xs | j                   }|r||d<     |j                  |fi |di |xs i  d{   S 7 w)a  Schedule this prompt for background execution via docket.

        FunctionPrompt splats the arguments dict since .fn expects **kwargs.

        Args:
            docket: The Docket instance
            arguments: Prompt 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   Nr'   )r   add)r(   r   r_   r   r   r*   
lookup_keys          r+   add_to_docketzFunctionPrompt.add_to_docketU  sL     ( 'txx
$F5M5ZVZZ
5f5JbJJJJs   8A?A)rO   Callable[..., Any]rP   zPromptMeta | Noner<   r;   r>   r=   r?   r;   r@   r;   rB   rA   rD   rC   rF   rE   rH   rG   rJ   rI   r.   rN   )r*   dict[str, Any]r.   r   r&   )r_   rE   r.   r   )r   r   r.   None)r   r   r_   rE   r   r;   r   r;   r*   r   r.   r   )r/   r0   r1   r2   r3   classmethodr   r   r   r   r   r'   r-   r+   rN   rN   J   s;   &**
 '+$( "&#' $&*)-37[
[
 $	[
 [
 "[
 [
  [
 ![
 [
 $[
 '[
 1[
 
[
 [
z* \ ,00M(0M 
0Md3 "#KK )K
 K K K 
Kr-   rN   c                     y r&   r'   )rO   s    r+   r7   r7   o  s    r-   )r>   r?   r@   rB   rD   rF   rH   rJ   c                    y r&   r'   )	
name_or_fnr>   r?   r@   rB   rD   rF   rH   rJ   s	            r+   r7   r7   q  s     r-   rV   c       	             y r&   r'   )
r   r<   r>   r?   r@   rB   rD   rF   rH   rJ   s
             r+   r7   r7   ~  s     r-   c       	   	     d  	 t        | t              rt        d      	 	 	 	 	 	 d	fdd		fdd	fdt        j                  |       r	 | |      S t        | t
              r|t        d      | n| |nt        dt        |              d
fd}
|
S )zStandalone decorator to mark a function as an MCP prompt.

    Returns the original function with metadata attached. Register with a server
    using mcp.add_prompt().
    zwTo decorate a classmethod, use @classmethod above @prompt. See https://gofastmcp.com/servers/prompts#using-with-methodsc                l    t        |
	t              	      }t        j                  | |      S )NrV   )rP   )r#   r   rN   r   )rO   prompt_nameprompt_metarJ   r@   rB   rF   rD   rH   r?   r>   s      r+   create_promptzprompt.<locals>.create_prompt  sG     !#$T*

 ++B+EEr-   c                r    t        |
		      }t        | d      r| j                  n| }||_        | S )NrV   rt   )r#   hasattrrt   r$   )rO   r   rP   targetrJ   r@   rB   rF   rD   rH   r?   r>   s       r+   attach_metadatazprompt.<locals>.attach_metadata  sK    #

 !(J 7R%	r-   c                    t         j                  j                  dk(  r%t        j                  dt
        d        | |      S  | |      S )Nobjectzdecorator_mode='object' is deprecated and will be removed in a future version. Decorators now return the original function with metadata attached.   )
stacklevel)fastmcpsettingsdecorator_modewarningswarnDeprecationWarning)rO   r   r   r   s     r+   	decoratorzprompt.<locals>.decorator  sK    **h6MMV"	 ![11r;//r-   z6Cannot specify name both as first argument and keywordzInvalid first argument: c                     |       S r&   r'   )rO   r   r   s    r+   wrapperzprompt.<locals>.wrapper  s    [))r-   )rO   r   r   r;   r.   rN   )rO   r   r   r;   r.   r   rO   r   r.   r   )ro   r   rb   rf   rr   rz   r:   )r   r<   r>   r?   r@   rB   rD   rF   rH   rJ   r   r   r   r   r   s     ```````` @@@@r+   r7   r7     s    $ *k*K
 	

FF-7F	F F"  	0 $T**	J	$TUU 		24
3C2DEFF* Nr-   r   )r   rz   r>   r=   r?   r;   r@   r;   rB   rA   rD   rC   rF   rE   rH   rG   rJ   rI   r.   Callable[[F], F]r&   )r   r   r<   r;   r>   r=   r?   r;   r@   r;   rB   rA   rD   rC   rF   rE   rH   rG   rJ   rI   r.   r   )r   zstr | Callable[..., Any] | Noner<   r;   r>   r=   r?   r;   r@   r;   rB   rA   rD   rC   rF   rE   rH   rG   rJ   rI   r.   r   );r2   
__future__r   rf   r{   r   collections.abcr   dataclassesr   r   typingr   r   r	   r
   r   r   r   r   	mcp.typesr   pydantic.json_schemar   r   fastmcp.decoratorsr   fastmcp.exceptionsr   fastmcp.prompts.promptr   r   r   !fastmcp.server.auth.authorizationr   r   r   r   fastmcp.server.tasks.configr   fastmcp.utilities.async_utilsr   fastmcp.utilities.json_schemar   fastmcp.utilities.loggingr   fastmcp.utilities.typesr   r   r   docket.executionr   r   r/   r~   r"   r#   rN   r7   r'   r-   r+   <module>r      s   / "    $ (     /  2 * G G 7 3 D 9 0 :*CxS)*	H	 >h > > $%  & bKV bKJ	 
  
 	 !%"# "&%)/3  	
      # -  
 
  $"# "&%)/3  	
       # -  
  37R  $"# "&%)/3R/R R 	R
 R R R R  R #R -R 	Rr-   