
    kKjA                     D   d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZ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mZmZmZ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( ddl)m*Z* dgZ- e.h d      Z/de
defdZ0 G d d      Z1y# e+$ rZ, e+d      e,dZ,[,ww xY w)z'Anthropic sampling handler for FastMCP.    )IteratorSequence)Any)AudioContentCreateMessageResultCreateMessageResultWithToolsImageContentModelPreferencesSamplingMessageSamplingMessageContentBlock
StopReasonTextContentTool
ToolChoiceToolResultContentToolUseContent)CreateMessageRequestParams)AsyncAnthropic)
Base64ImageSourceParamImageBlockParamMessageMessageParam	TextBlockTextBlockParam	ToolParamToolResultBlockParamToolUseBlockToolUseBlockParam)
ModelParam)ToolChoiceAnyParam)ToolChoiceAutoParam)ToolChoiceParamzThe `anthropic` package is not installed. Install it with `pip install fastmcp-slim[anthropic]` or add `anthropic` to your dependencies.NAnthropicSamplingHandler>   	image/gif	image/png
image/jpeg
image/webpcontentreturnc           
          | j                   t        vr7t        d| j                   ddj                  t	        t                           t        dt        d| j                   | j                              S )z6Convert MCP ImageContent to Anthropic ImageBlockParam.z+Unsupported image MIME type for Anthropic: z. Supported types: z, imagebase64)type
media_typedata)r-   source)mimeType_ANTHROPIC_IMAGE_MEDIA_TYPES
ValueErrorjoinsortedr   r   r/   )r(   s    {/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/client/sampling/handlers/anthropic.py!_image_content_to_anthropic_blockr7   7   sz    ;;9':J:J9M N  $		&1M*N OPR
 	
 %''
     c            	       R   e Zd ZdZ	 ddededz  ddfdZdee   de	d	e
deez  fd
Zedeez  ee   z  dz  dee   fd       Zedee   dee   fd       Zededefd       Zdeez  ee   z  dz  defdZedee   dee   fd       Zedededz  fd       Zededefd       Zy)r#   a  Sampling handler that uses the Anthropic API.

    Example:
        ```python
        from anthropic import AsyncAnthropic
        from fastmcp import FastMCP
        from fastmcp.client.sampling.handlers.anthropic import AnthropicSamplingHandler

        handler = AnthropicSamplingHandler(
            default_model="claude-sonnet-4-5",
            client=AsyncAnthropic(),
        )

        server = FastMCP(sampling_handler=handler)
        ```
    Ndefault_modelclientr)   c                 8    |xs
 t               | _        || _        y N)r   r;   r:   )selfr:   r;   s      r6   __init__z!AnthropicSamplingHandler.__init__Z   s     '-&@0@)6r8   messagesparamscontextc                   K   | j                  |      }| j                  |j                        }d }|j                  r| j	                  |j                        }d }|j
                  r"| j                  |j
                        }|d }n|}|||j                  d}	|j                  |j                  |	d<   |j                  |j                  |	d<   |j                  |j                  |	d<   |||	d<   |||	d<    | j                  j                  j                  di |	 d {   }
|j                  r| j                  |
      S | j                  |
      S 7 2w)	N)r@   )modelr@   
max_tokenssystemtemperaturestop_sequencestoolstool_choice )_convert_to_anthropic_messages_select_model_from_preferencesmodelPreferencesrI   _convert_tools_to_anthropic
toolChoice!_convert_tool_choice_to_anthropic	maxTokenssystemPromptrG   stopSequencesr;   r@   create_message_to_result_with_tools!_message_to_create_message_result)r>   r@   rA   rB   anthropic_messagesrD   anthropic_toolsanthropic_tool_choice	convertedkwargsresponses              r6   __call__z!AnthropicSamplingHandler.__call__`   st     261T1T 2U 2
 !??@W@WX 37<<">>v||LO 9=>>v?P?PQI "&(1%
 * **"

 *%22F8)$*$6$6F=!+'-';';F#$&-F7O ,$9F=!4--44>v>> <<55h??55h?? ?s   DE!E"3Emodel_preferencesc              #      K   | y t        | t              r|  y t        | t              r| E d {    y t        | t              r*| j                  x}sy |D ]  }|j
                  x}s|  y y 7 @wr=   )
isinstancestrlistr
   hintsname)r_   rd   hintre   s       r6   _iter_models_from_preferencesz6AnthropicSamplingHandler._iter_models_from_preferences   s      $'-##)40((()+;<.444E4 $		))
	 	 = )s   .A3A1AA3c                    g }| D ]  }|j                   }t        |t              rg }|D ]  }t        |t              r=|j	                  t        d|j                  |j                  |j                               Qt        |t              r'|j	                  t        d|j                               t        |t              r5|j                  dk7  rt        d      |j	                  t        |             t        |t               rt        d      t        |t"              rd}|j                   rY|j                   D cg c])  }t        |t              rt        d|j                        + }}t%        |      d	k(  r	|d
   d   }n|r|}|j	                  t'        d|j(                  ||j*                  r|j*                  nd             t        dt-        |      j.                          |r&|j	                  t1        |j                  |             t        |t              rJ|j	                  t1        dt        d|j                  |j                  |j                        g             lt        |t"              rd}	|j                   rY|j                   D cg c])  }t        |t              rt        d|j                        + }
}t%        |
      d	k(  r	|
d
   d   }	n|
r|
}	|j	                  t1        dt'        d|j(                  |	|j*                  r|j*                  nd      g             1t        |t              r2|j	                  t1        |j                  |j                               st        |t              rB|j                  dk7  rt        d      |j	                  t1        dt        |      g             t        |t               rt        d      t        dt-        |              |S c c}w c c}w )Ntool_user-   idre   inputtextr-   rm   userz=ImageContent is only supported in user messages for Anthropicz2AudioContent is not supported by the Anthropic API    r   tool_resultF)r-   tool_use_idr(   is_errorz(Unsupported content type for Anthropic: )roler(   	assistantzUnsupported content type: )r(   ra   rc   r   appendr   rk   re   rl   r   r   rm   r	   ru   r3   r7   r   r   lenr   	toolUseIdisErrorr-   __name__r   )r@   rX   messager(   content_blocksitemresult_contentsub_itemtext_blocksresult_content_str
text_partss              r6   rL   z7AnthropicSamplingHandler._convert_to_anthropic_messages   s    24GooG '4(   $D!$7&---%/#'77%)YY&*jj	 $D+6&--*TYYG $D,7"<<61",!0#  '--.OPT.UV#D,7(P  $D*;<EG<< 15A0<H#-h#D !/F O0< ( A
  #;/141<Q1G!,1<&--0%2,0NN(69=5	 )FtDzGZGZF[\ a $h "&--$!($2  '>2")) (-%/#*::%,\\&-mm	!
  '#45AC"?? %,OO8$3D%dK8 'FC$3  8
 :!+-7]6-B*#-7*")) #0%2,3,=,=(:<COOQV	!
  ';/")) $\\ '  '<0<<6)$W  #)) #!B7!K L  '<0 !UVV9$w-IJJg  j "!YAj8s   >.O?.Pr|   c           	      R   t        | j                        dk(  rt        d      dj                  d | j                  D              }|r#t	        t        d|      d| j                        S t        d	| j                  D cg c]  }t        |      j                   c}       c c}w )
Nr   %No content in response from Anthropicrp   c              3   V   K   | ]!  }t        |t              s|j                   # y wr=   )ra   r   rm   ).0blocks     r6   	<genexpr>zMAnthropicSamplingHandler._message_to_create_message_result.<locals>.<genexpr>Q  s!      
$35z%7SEJJOs   ))rm   rn   rv   )r(   ru   rD   z,No text content in response from Anthropic: )	rx   r(   r3   r4   r   r   rD   r-   r{   )r|   rm   bs      r6   rW   z:AnthropicSamplingHandler._message_to_create_message_resultI  s     w1$DEE ww 
$+OO
 
 &#d; mm  :V]VeVe;fVeQRDG<L<LVe;f:gh
 	
;fs   ?B$
c                 p    | j                  |      D ]  }|j                  d      s|c S  | j                  S )Nclaude)rg   
startswithr:   )r>   r_   model_options      r6   rM   z7AnthropicSamplingHandler._select_model_from_preferences_  s=     !>>?PQL&&x0## R
 !!!r8   rI   c                     g }| D ]U  }t        |j                        }d|vrd|d<   |j                  t        |j                  |j
                  xs d|             W |S )z+Convert MCP tools to Anthropic tool format.r-   objectrp   )re   descriptioninput_schema)dictinputSchemarw   r   re   r   )rI   rY   toolr   s       r6   rO   z4AnthropicSamplingHandler._convert_tools_to_anthropici  sk     ,.D+/0@0@+AL\)'/V$"" $ 0 0 6B!-  r8   rJ   c                     | j                   dk(  rt        d      S | j                   dk(  rt        d      S | j                   dk(  ryt        d| j                         )zConvert MCP tool_choice to Anthropic format.

        Returns None for "none" mode, signaling that tools should be omitted
        from the request entirely (Anthropic doesn't have an explicit "none" option).
        auto)r-   requiredanynoneNzUnsupported tool_choice mode: )moder!   r    r3   )rJ   s    r6   rQ   z:AnthropicSamplingHandler._convert_tool_choice_to_anthropic|  sc     v%&F33+%511' =k>N>N=QRSSr8   c           	         t        | j                        dk(  rt        d      | j                  dk(  rd}n8| j                  dk(  rd}n&| j                  dk(  rd}n| j                  d	k(  rd}nd}g }| j                  D ]  }t	        |t
              r'|j                  t        d
|j                               :t	        |t              sKt	        |j                  t              r|j                  ni }|j                  t        d|j                  |j                  |              |st        d      t        |d| j                   |      S )z;Convert Anthropic response to CreateMessageResultWithTools.r   r   ri   toolUseend_turnendTurnrE   rR   stop_sequencerm   rn   rj   rv   )r(   ru   rD   
stopReason)rx   r(   r3   stop_reasonra   r   rw   r   rm   r   rl   r   r   rk   re   r   rD   )r|   r   r(   r   	argumentss        r6   rV   z6AnthropicSamplingHandler._message_to_result_with_tools  s"   
 w1$DEE *,#K  J.#K  L0%K  O3#K#K 68__E%+{UZZHIE<0+5ekk4+HEKKb	"' 88"ZZ'	 %" DEE+--"	
 	
r8   r=   ) r{   
__module____qualname____doc__r   r   r?   rc   r   SamplingParamsr   r   r   r^   staticmethodr
   rb   r   rg   r   r   rL   r   rW   rM   r   r   rO   r   r"   rQ   rV   rK   r8   r6   r#   r#   H   s   $ JN7'71?$1F7	73@'3@ 3@ 	3@
 
;	;3@j +c1DI=D	# , Z"?+Z"	l	Z" Z"x 

	
 
*"!1C!7$s)!Cd!J"	" 4: $y/  $ TT	4	T T& 0
0
	%0
 0
r8   )2r   collections.abcr   r   typingr   	mcp.typesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   	anthropicr   anthropic.typesr   r   r   r   r   r   r   r   r   r   anthropic.types.model_paramr   %anthropic.types.tool_choice_any_paramr    &anthropic.types.tool_choice_auto_paramr!   !anthropic.types.tool_choice_paramr"   ImportErrore__all__	frozensetr2   r7   r#   rK   r8   r6   <module>r      s    - .     C(   7HJA &
&  ):  
|  "y
 y
?  
	i s   6B B	BB