
     h                        d dl mZ d dlZd dlmZ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 d dlmZmZmZ d d	lmZ d d
lmZ erd dlmZ  ee          Z G d d          ZdS )    )annotationsN)	AwaitableCallable)TYPE_CHECKINGAny)GetPromptResult)settings)NotFoundErrorPromptError)FunctionPromptPromptPromptResult)DuplicateBehavior)
get_logger)MountedServerc                  z    e Zd ZdZ	 	 d*d+dZd,dZddd-dZd.dZd/dZd0dZ	d1dZ
	 	 	 d2d3d#Zd4d%Z	 d5d6d)ZdS )7PromptManagerzManages FastMCP prompts.Nduplicate_behaviorDuplicateBehavior | Nonemask_error_detailsbool | Nonec                    i | _         g | _        |pt          j        | _        |d}|t          j        vr2t          d| dd                    t          j                             || _        d S )NwarnzInvalid duplicate_behavior: z. Must be one of: z, )	_prompts_mounted_serversr	   r   r   __args__
ValueErrorjoinr   )selfr   r   s      p/Users/user/workspace/sujinbaek/cqa-test-app/venv/lib/python3.11/site-packages/fastmcp/prompts/prompt_manager.py__init__zPromptManager.__init__   s    
 ,.57"4"S8S %!'%6%???K/A K K#'99->-G#H#HK K  
 #5    serverr   returnNonec                :    | j                             |           dS )z.Adds a mounted server as a source for prompts.N)r   append)r   r#   s     r    mountzPromptManager.mount-   s    $$V,,,,,r"   F
via_serverr*   booldict[str, Prompt]c          
     r  K   i }| j         D ]}	 |r |j                                         d{V }n$|j        j                                         d{V }d |D             }|j        rG|                                D ]1}|                    |j         d|j                   }|||j        <   2n|	                    |           # t          $ rJ}t                              d|j        j        d|j        d|            t          j        r Y d}~	d}~ww xY w|	                    | j                   |S )a:  
        The single, consolidated recursive method for fetching prompts. The 'via_server'
        parameter determines the communication path.

        - via_server=False: Manager-to-manager path for complete, unfiltered inventory
        - via_server=True: Server-to-server path for filtered MCP requests
        Nc                    i | ]
}|j         |S  key).0ps     r    
<dictcomp>z/PromptManager._load_prompts.<locals>.<dictcomp>E   s    >>>1aeQ>>>r"   _r0   z#Failed to get prompts from server: z, mounted at: : )r   r#   _list_prompts_prompt_managerlist_promptsprefixvalues
model_copyr1   update	Exceptionloggerwarningnamer	   &mounted_components_raise_on_load_errorr   )	r   r*   all_promptsmountedchild_results
child_dictpromptprefixed_promptes	            r    _load_promptszPromptManager._load_prompts1   s      *,, 	 	G X*1.*F*F*H*H$H$H$H$H$H$HMM +2.*H*U*U*W*W$W$W$W$W$W$WM ?>>>>
> 3","3"3"5"5 K K*0*;*;#*> @ @FJ @ @ +< + + <KO$788	K  &&z222   v'.:Mvv_f_mvvstvv   B  	4=)))s   B5C
D?DDr1   strc                B   K   |                                   d{V }||v S )zCheck if a prompt exists.N)get_promptsr   r1   promptss      r    
has_promptzPromptManager.has_prompt[   s3      ((********g~r"   r   c                v   K   |                                   d{V }||v r||         S t          d|           )zGet prompt by key.NUnknown prompt: )rM   r
   rN   s      r    
get_promptzPromptManager.get_prompt`   sS      ((********'>>3<4s44555r"   c                >   K   |                      d           d{V S )zI
        Gets the complete, unfiltered inventory of all prompts.
        Fr)   N)rJ   )r   s    r    rM   zPromptManager.get_promptsg   s1       ''5'999999999r"   list[Prompt]c                   K   |                      d           d{V }t          |                                          S )zA
        Lists all prompts, applying protocol filtering.
        Tr)   N)rJ   listr;   )r   prompts_dicts     r    r9   zPromptManager.list_promptsm   sJ       "//4/@@@@@@@@L''))***r"   fn5Callable[..., PromptResult | Awaitable[PromptResult]]rA   
str | Nonedescriptiontagsset[str] | Noner   c                    t           j        rt          j        dt          d           t          j        ||||          }|                     |          S )z Create a prompt from a function.zkPromptManager.add_prompt_from_fn() is deprecated. Use Prompt.from_function() and call add_prompt() instead.   )
stacklevel)rA   r\   r]   )r	   deprecation_warningswarningsr   DeprecationWarningr   from_function
add_prompt)r   rY   rA   r\   r]   rG   s         r    add_prompt_from_fnz PromptManager.add_prompt_from_fnt   sg     ( 	M}"   
  -T{
 
 
 v&&&r"   rG   c                v   | j                             |j                  }|r| j        dk    r2t                              d|j                    || j         |j        <   nZ| j        dk    r|| j         |j        <   n?| j        dk    rt          d|j                   | j        dk    r|S n|| j         |j        <   |S )zAdd a prompt to the manager.r   zPrompt already exists: replaceerrorignore)r   getr1   r   r?   r@   r   )r   rG   existings      r    rf   zPromptManager.add_prompt   s     =$$VZ00 	/&&00EEEFFF,2fj))(I55,2fj))(G33 !G6:!G!GHHH(H44 5 )/DM&*%r"   	argumentsdict[str, Any] | Noner   c                2  K   || j         v r|                     |           d{V }|st          d|           	 |                    |           d{V }t	          |j        |          S # t          $ r$}t                              d|           |d}~wt          $ rR}t                              d|           | j
        rt          d|          |t          d|d|           |d}~ww xY wt          | j                  D ]z}|}|j        r<|                    |j         d          r|                    |j         d          }nG	 |j                            ||           d{V c S # t          $ r Y ww xY wt          d|           )zv
        Internal API for servers: Finds and renders a prompt, respecting the
        filtered protocol path.
        NrR   )r\   messageszError rendering prompt r6   r5   )r   rS   r
   renderr   r\   r   r?   	exceptionr>   r   reversedr   r:   
startswithremoveprefixr#   _get_prompt)r   rA   rn   rG   rq   rI   rD   
prompt_keys           r    render_promptzPromptManager.render_prompt   s?      4=  ??400000000F ?#$=t$=$=>>>V!'y!9!9999999& & 2X   
      !C4!C!CDDD  V V V  !C4!C!CDDD* V%&H&H&HIIqP &&M&M&M!&M&MNNTUUV   566 
	 
	GJ~ ??gn#7#7#788 !%!2!2gn3G3G3G!H!HJJ$^77
INNNNNNNNNNN     5t55666s6   0A- -
C57BC5#AC00C5 E77
FF)NN)r   r   r   r   )r#   r   r$   r%   )r*   r+   r$   r,   )r1   rK   r$   r+   )r1   rK   r$   r   )r$   r,   )r$   rU   )NNN)
rY   rZ   rA   r[   r\   r[   r]   r^   r$   r   )rG   r   r$   r   )N)rA   rK   rn   ro   r$   r   )__name__
__module____qualname____doc__r!   r(   rJ   rP   rS   rM   r9   rg   rf   ry   r/   r"   r    r   r      s       "" 8<*.5 5 5 5 5*- - - - 9> ( ( ( ( ( (T   
6 6 6 6: : : :+ + + +  "& $' ' ' ' '(   * ,017 17 17 17 17 17 17r"   r   )
__future__r   _annotationsrc   collections.abcr   r   typingr   r   mcpr   fastmcpr	   fastmcp.exceptionsr
   r   fastmcp.prompts.promptr   r   r   fastmcp.settingsr   fastmcp.utilities.loggingr   fastmcp.server.serverr   rz   r?   r   r/   r"   r    <module>r      s3   2 2 2 2 2 2  / / / / / / / / % % % % % % % %             9 9 9 9 9 9 9 9 G G G G G G G G G G . . . . . . 0 0 0 0 0 0 4333333	H		v7 v7 v7 v7 v7 v7 v7 v7 v7 v7r"   