o
    i7                     @  sj  d Z ddlmZ ddlZddlZddlmZmZm	Z	 ddl
m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 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# ddl$m%Z%m&Z&m'Z' e#e(Z)	d d!ddZ*ee eZ+e,eB e-e,ef B e	e,eB e-e,ef B  B Z.e.ee. B Z/G dd de%ZG dd deZG dd deZ0dS )"z!Base classes for FastMCP prompts.    )annotationsN)	AwaitableCallableSequence)Any)ContentBlockIconPromptMessageRoleTextContent)Prompt)PromptArgument)FieldTypeAdapter)PromptError)get_context)FastMCPComponent)compress_schema)
get_logger)FastMCPBaseModelfind_kwarg_by_typeget_cached_typeadaptercontentstr | ContentBlockroleRole | Nonekwargsr   returnr	   c                 K  s6   t | trtd| d} |du rd}td| |d|S )z.A user-friendly constructor for PromptMessage.texttyper   Nuser)r   r    )
isinstancestrr   r	   )r   r   r   r"   r"   \/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/prompts/prompt.pyMessage   s
   
r&   c                   @  sL   e Zd ZU dZeddZded< edddZd	ed
< edddZded< dS )r   z+An argument that can be passed to a prompt.zName of the argument)descriptionr$   nameNz%Description of what the argument doesdefaultr'   
str | Noner'   Fz Whether the argument is requiredboolrequired)	__name__
__module____qualname____doc__r   r(   __annotations__r'   r-   r"   r"   r"   r%   r   4   s   
 r   c                      s   e Zd ZU dZed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$Z	d,d-d&d'Z  ZS ).r   z7A prompt template that can be rendered with parameters.Nz*Arguments that can be passed to the promptr)   zlist[PromptArgument] | None	argumentsr   Nonec                   4   t    z
t }|  W d S  ty   Y d S w N)superenabler   _queue_prompt_list_changedRuntimeErrorselfcontext	__class__r"   r%   r8   G      
zPrompt.enablec                   r5   r6   )r7   disabler   r9   r:   r;   r>   r"   r%   rA   O   r@   zPrompt.disableinclude_fastmcp_metarC   bool | None	overridesr   	MCPPromptc                K  s`   dd | j pg D }t|d| j|d| j||d| j|d| j|d| j|dd	S )
z$Convert the prompt to an MCP prompt.c                 S  s    g | ]}t |j|j|jd qS )r(   r'   r-   )MCPPromptArgumentr(   r'   r-   .0argr"   r"   r%   
<listcomp>^   s    z(Prompt.to_mcp_prompt.<locals>.<listcomp>r(   r'   titleicons_metarB   )r(   r'   r3   rM   rN   rO   )r3   rF   getr(   r'   rM   rN   get_meta)r<   rC   rE   r3   r"   r"   r%   to_mcp_promptW   s   	zPrompt.to_mcp_promptfn5Callable[..., PromptResult | Awaitable[PromptResult]]r(   r+   rM   r'   rN   list[Icon] | Nonetagsset[str] | Noneenabledmetadict[str, Any] | NoneFunctionPromptc              
   C  s   t j| |||||||dS )Create a Prompt from a function.

        The function can return:
        - A string (converted to a message)
        - A Message object
        - A dict (converted to a message)
        - A sequence of any of the above
        rS   r(   rM   r'   rN   rV   rX   rY   )r[   from_functionr]   r"   r"   r%   r^   r   s   zPrompt.from_functionlist[PromptMessage]c                   s
   t d)zRender the prompt with arguments.

        This method is not implemented in the base Prompt class and must be
        implemented by subclasses.
        z"Subclasses must implement render())NotImplementedError)r<   r3   r"   r"   r%   render   s   	zPrompt.render)r   r4   )rC   rD   rE   r   r   rF   NNNNNNNrS   rT   r(   r+   rM   r+   r'   r+   rN   rU   rV   rW   rX   rD   rY   rZ   r   r[   r6   r3   rZ   r   r_   )r.   r/   r0   r1   r   r3   r2   r8   rA   rR   staticmethodr^   ra   __classcell__r"   r"   r>   r%   r   @   s(   
 r   c                   @  sP   e Zd ZU dZded< e							ddddZdddZ	dd ddZdS )!r[   zA prompt that is a function.rT   rS   Nr(   r+   rM   r'   rN   rU   rV   rW   rX   rD   rY   rZ   r   c	                 C  s  ddl m}	 |pt|ddp|jj}
|
dkrtdt|}|j	 D ]}|j
tjjkr1td|j
tjjkr<tdq$|pCt|}t|sL|j}t|trT|j}t|}| }t||	d	}|rg|gnd}t||d
}g }d|v r|d  D ]`\}}|d}||jv r|j| }|jtjjkr|jtur||krz#t|j}| }tj|dd}d| }|r| d| }n|}W n	 ty   Y nw | t!||||dg v d q{| |
|||||pt" |dur|nd||d	S )r\   r   Contextr.   Nz<lambda>z,You must provide a name for lambda functionsz1Functions with *args are not supported as promptsz4Functions with **kwargs are not supported as prompts
kwarg_type)prune_params
propertiesr'   ),:)
separatorsz8Provide as a JSON string matching the following schema: z

r-   rG   T)	r(   rM   r'   rN   r3   rV   rX   rS   rY   )#fastmcp.server.contextrh   getattrr?   r.   
ValueErrorinspect	signature
parametersvalueskind	ParameterVAR_POSITIONALVAR_KEYWORDgetdoc	isroutine__call__r#   re   __func__r   json_schemar   r   itemsrP   
annotationemptyr$   jsondumps	Exceptionappendr   set)clsrS   r(   rM   r'   rN   rV   rX   rY   rh   	func_namesigparamtype_adapterru   context_kwargrk   r3   
param_namearg_description	sig_paramparam_adapterparam_schema
schema_strschema_noter"   r"   r%   r^      sx   








zFunctionPrompt.from_functionr   dict[str, Any]c                 C  s*  ddl m} t| j}i }t| j|d}| D ]y\}}||jv r|j| }||kr0|||< q|jtj	j
ksA|jtu sAt|tsF|||< qz%t|j}	z	|	|||< W n tttjfyi   |	|||< Y nw W q tttjfy }
 ztd| d| d|j d|
 |
d}
~
ww |||< q|S )	zGConvert string arguments to expected types based on function signature.r   rg   ri   zCould not convert argument 'z' with value 'z' to expected type z	. Error: N)rp   rh   rs   rt   rS   r   r   ru   r   rx   r   r$   r#   r   validate_jsonrr   	TypeErrorpydantic_coreValidationErrorvalidate_pythonr   )r<   r   rh   r   converted_kwargscontext_param_namer   param_valuer   adapterer"   r"   r%   _convert_string_arguments  sR   





z(FunctionPrompt._convert_string_argumentsr3   r_   c                   s  ddl m} | jr%dd | jD }t|pi }|| }|r%td| z|r,| ni }t| j|d}|r@||vr@t ||< | 	|}| jdi |}t
|rW|I dH }t|ttB sa|g}g }	|D ]I}
z6t|
trs|	|
 n)t|
tr|	tdtd	|
d
d ntj|
td }|	tdtd	|d
d W qe ty } ztd|d}~ww |	W S  ty } ztd| j  td| j d|d}~ww )z!Render the prompt with arguments.r   rg   c                 S  s   h | ]}|j r|jqS r"   )r-   r(   rI   r"   r"   r%   	<setcomp>G  s    z(FunctionPrompt.render.<locals>.<setcomp>zMissing required arguments: ri   Nr!   r   r   )r   r   )fallbackz+Could not convert prompt result to message.zError rendering prompt .r"   )rp   rh   r3   r   rr   copyr   rS   r   r   rs   isawaitabler#   listtupler	   r   r$   r   r   to_jsondecoder   r   logger	exceptionr(   )r<   r3   rh   r-   providedmissingr   r   resultmessagesmsgr   r   r"   r"   r%   ra   >  sj   







zFunctionPrompt.renderrb   rc   )r   r   r   r   r6   rd   )	r.   r/   r0   r1   r2   classmethodr^   r   ra   r"   r"   r"   r%   r[      s   
 
i5r[   r6   )r   r   r   r   r   r   r   r	   )1r1   
__future__r   _annotationsrs   r   collections.abcr   r   r   typingr   r   	mcp.typesr   r   r	   r
   r   r   rF   r   rH   pydanticr   r   fastmcp.exceptionsr   fastmcp.server.dependenciesr   fastmcp.utilities.componentsr   fastmcp.utilities.json_schemar   fastmcp.utilities.loggingr   fastmcp.utilities.typesr   r   r   r.   r   r&   message_validatorr$   dictSyncPromptResultPromptResultr[   r"   r"   r"   r%   <module>   sB    
\