
    kKjNO                        U d Z ddlZddlmZmZ ddlmZmZmZ ddl	m
Z
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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*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 dddddZ4e5e6ed   f   e7d<    e8h d      Z9e8e6   e7d<   dede#fdZ:dede$fdZ; G d d      Z<y# e2$ rZ3 e2d      e3dZ3[3ww xY w)z$OpenAI sampling handler for FastMCP.    N)IteratorSequence)AnyLiteralget_args)ClientSessionServerSession)LifespanContextTRequestContext)AudioContentCreateMessageResultCreateMessageResultWithToolsImageContentModelPreferencesSamplingMessage
StopReasonTextContentTool
ToolChoiceToolResultContentToolUseContent)CreateMessageRequestParams)AsyncOpenAI)ChatCompletion#ChatCompletionAssistantMessageParam#ChatCompletionContentPartImageParam(ChatCompletionContentPartInputAudioParamChatCompletionContentPartParam"ChatCompletionContentPartTextParamChatCompletionMessageParam"ChatCompletionMessageToolCallParam ChatCompletionSystemMessageParam#ChatCompletionToolChoiceOptionParamChatCompletionToolMessageParamChatCompletionToolParamChatCompletionUserMessageParam)	ChatModel)FunctionDefinitionz{The `openai` package is not installed. Please install `fastmcp-slim[openai]` or add `openai` to your dependencies manually.wavmp3)z	audio/wavzaudio/x-wavz	audio/mp3z
audio/mpeg)r)   r*   _OPENAI_AUDIO_FORMATS>   	image/gif	image/png
image/jpeg
image/webp_OPENAI_IMAGE_MEDIA_TYPEScontentreturnc           
          | j                   t        vr7t        d| j                   ddj                  t	        t                           d| j                    d| j
                   }t        dd|i      S )	z:Convert MCP ImageContent to OpenAI image_url content part.z(Unsupported image MIME type for OpenAI: . Supported types: , zdata:z;base64,	image_urlurl)typer6   )mimeTyper0   
ValueErrorjoinsorteddatar   )r1   data_urls     x/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/client/sampling/handlers/openai.py_image_content_to_openai_partr@   ?   s     886w7G7G6J K  $		&1J*K LMO
 	
 w''(?H.(#     c           
          t         j                  | j                        }|7t        d| j                  ddj	                  t        t                            t        d| j                  |d      S )z<Convert MCP AudioContent to OpenAI input_audio content part.z(Unsupported audio MIME type for OpenAI: r4   r5   input_audio)r=   format)r8   rC   )r+   getr9   r:   r;   r<   r   r=   )r1   audio_formats     r?   _audio_content_to_openai_partrG   O   sz     ),,W-=-=>L6w7G7G6J K  $		&1F*G HIK
 	
 4$\\\B rA   c            	       p   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
eef   e
eef   z  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dz  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 fd       Z!ededefd       Z"y)OpenAISamplingHandlerz*Sampling handler that uses the OpenAI API.Ndefault_modelclientr2   c                 8    |xs
 t               | _        || _        y N)r   rK   rJ   )selfrJ   rK   s      r?   __init__zOpenAISamplingHandler.__init__b   s    
 $*#:[](5rA   messagesparamscontextc                   K   | j                  |j                  |      }| j                  |j                        }d }|j                  r| j                  |j                        }d }|j                  r| j                  |j                        }||d}|j                  |j                  |d<   |j                  |j                  |d<   |j                  r|j                  |d<   |||d<   |||d<    | j                  j                  j                  j                  di | d {   }	|j                  r| j                  |	      S | j!                  |	      S 7 2w)	N)system_promptrP   )modelrP   max_completion_tokenstemperaturestoptoolstool_choice )_convert_to_openai_messagessystemPrompt_select_model_from_preferencesmodelPreferencesrY   _convert_tools_to_openai
toolChoice_convert_tool_choice_to_openai	maxTokensrW   stopSequencesrK   chatcompletionscreate%_chat_completion_to_result_with_tools)_chat_completion_to_create_message_result)
rN   rP   rQ   rR   openai_messagesrU   openai_toolsopenai_tool_choicekwargsresponses
             r?   __call__zOpenAISamplingHandler.__call__j   sk     ,,$11! -  	  >>v?V?VW >B<<88FL JN!%!D!DVEVEV!W
 '"
 '.4.>.>F*+)$*$6$6F=!#11F6N#*F7O)$6F=!<))55<<FvFF <<==hGG==hGG Gs   D"E$E%3Emodel_preferencesc              #     K   | y t        | t              r| t        t              v r|  y t        | t              r| E d {    y t        | t
              r*| j                  x}sy |D ]  }|j                  x}s|  y y 7 @wrM   )
isinstancestrr   r'   listr   hintsname)rp   ru   hintrv   s       r?   _iter_models_from_preferencesz3OpenAISamplingHandler._iter_models_from_preferences   s      $'-2CxH
 3
 $#)40((()+;<.444E4 $		))
	 	 = )s   ?BBABrT   c                 
   g }| r|j                  t        d|              |D ]  }|j                  }t        |t              rg }g }g }g }|D ]  }	t        |	t
              rR|j                  t        |	j                  d|	j                  t        j                  |	j                        d             ft        |	t              rB|j                  |	j                         |j                  t        d|	j                               t        |	t              r|j                  t!        |	             t        |	t"              r|j                  t%        |	             t        |	t&              r{d}
|	j                  rD|	j                  D cg c]  }t        |t              r|j                    }}d	j)                  |      }
|j                  t+        d
|	j,                  |
             t/        dt1        |	      j2                          |s|r|rht5        |      t5        |      kD  }|rt/        d      d	j)                  |      xs d }|j                  t7        d||             |j9                  |       n|r|j:                  dk(  r|j                  t=        d|             ngt5        |      t5        |      kD  }|rt/        d      d	j)                  |      }|r0|j                  t7        d|             n|r|j9                  |       t        |t
              r_|j                  t7        dt        |j                  d|j                  t        j                  |j                        d      g             [t        |t&              rg }|j                  r=|j                  D ].  }	t        |	t              s|j                  |	j                         0 |j                  t+        d
|j,                  d	j)                  |                   t        |t              r^|j:                  dk(  r'|j                  t=        d|j                               n&|j                  t7        d|j                               \t        |t              rB|j:                  dk7  rt/        d      |j                  t=        dt!        |      g             t        |t"              rB|j:                  dk7  rt/        d      |j                  t=        dt%        |      g              t/        dt1        |              |S c c}w )Nsystem)roler1   function)rv   	arguments)idr8   r|   textr8   r    
tool)r{   tool_call_idr1   z%Unsupported content type for OpenAI: zGImageContent/AudioContent is only supported in user messages for OpenAI	assistant)r{   r1   
tool_callsuser)r{   r   z:ImageContent is only supported in user messages for OpenAIz:AudioContent is only supported in user messages for OpenAIzUnsupported content type: )appendr"   r1   rr   rt   r   r!   r~   rv   jsondumpsinputr   r   r   r   r@   r   rG   r   r;   r$   	toolUseIdr:   r8   __name__lenr   extendr{   r&   )rT   rP   rj   messager1   r   content_parts
text_partstool_messagesitemcontent_textsub_itemresult_textshas_multimodaltext_strassistant_texts                   r?   r\   z1OpenAISamplingHandler._convert_to_openai_messages   s    =?""0!)  GooG '4(GI
FH(*
FH#D!$7"))>#'77%/,0II15DJJ1G*"	 $D+6"))$))4%,,>%+$))
 $D,7%,,-J4-PQ#D,7%,,-J4-PQ#D*;<')<< 15,0<H#-h#D !)0< ) ,
 ,099\+BL%,,:%+-1^^(4 )CDJDWDWCXY S $^ !),]);c*o)M)",!>#  $(99Z#8#@D'..?%0(0+5 (..}=&"<<61+22 >)/,9!" .1-?#j/-QN-&0%B'" !" .2YYz-BN- / 6 6$G-80>%&!" ##**=9 '>2&&7(>#*::%/,3LL15GMM1J*"	$  '#45*,?? '%dK8(//		: !0  &&2#%,%6%6 $		, 7  ';/<<6)#**6!'$+LL $**;!,$+LL  '<0<<6)$T   &&2#!>w!G H  '<0<<6)$T   &&2#!>w!G H 9$w-IJJw  z m,s   	#T=chat_completionc                     t        | j                        dk(  rt        d      | j                  d   }|j                  j                  x}r#t        t        d|      d| j                        S t        d      )Nr   No response for completionr   r   r   )r1   r{   rU   &No content in response from completion)r   choicesr:   r   r1   r   r   rU   )r   first_choicer1   s      r?   ri   z?OpenAISamplingHandler._chat_completion_to_create_message_result  s{     &&'1,9::&..q1"**22272&#g> %++  ABBrA   c                 t    | j                  |      D ]  }|t        t              v s|}|c S  | j                  S rM   )rx   r   r'   rJ   )rN   rp   model_optionchosen_models       r?   r^   z4OpenAISamplingHandler._select_model_from_preferences  sA     !>>?PQLx	22*6## R
 !!!rA   rY   c                     g }| D ]`  }t        |j                        }d|vrd|d<   |j                  t        dt	        |j
                  |j                  xs d|                   b |S )z(Convert MCP tools to OpenAI tool format.r8   objectr|   r   )rv   description
parameters)r8   r|   )dictinputSchemar   r%   r(   rv   r   )rY   rk   r   r   s       r?   r`   z.OpenAISamplingHandler._convert_tools_to_openai  sv     79D)-d.>.>)?JZ'%-
6"'#/!YY$($4$4$:#-	   rA   rZ   c                     | j                   dk(  ry| j                   dk(  ry| j                   dk(  ryt        d| j                         )z)Convert MCP tool_choice to OpenAI format.autorequirednonezUnsupported tool_choice mode: )moder:   )rZ   s    r?   rb   z4OpenAISamplingHandler._convert_tool_choice_to_openai  sQ    
 v%+'=k>N>N=QRSSrA   c           	      4   t        | j                        dk(  rt        d      | j                  d   }|j                  }|j                  dk(  rd}n&|j                  dk(  rd}n|j                  dk(  rd}nd}g }|j
                  r&|j                  t        d	|j
                  
             |j                  r||j                  D ]m  }t        |d      s|j                  }	 t        j                  |j                        }|j                  t!        d|j"                  |j                  |             o |st        d      t%        |d| j&                  |      S # t        j                  $ r+}t        d|j                   d|j                         |d}~ww xY w)z8Convert OpenAI response to CreateMessageResultWithTools.r   r   r   toolUserX   endTurnlengthrc   r   r   r|   z$Invalid JSON in tool arguments for 'z': Ntool_use)r8   r~   rv   r   r   r   )r1   r{   rU   
stopReason)r   r   r:   r   finish_reasonr1   r   r   r   hasattrr|   r   loadsr}   JSONDecodeErrorrv   r   r~   r   rU   )	r   r   r   stop_reasonr1   	tool_callfuncr}   es	            r?   rh   z;OpenAISamplingHandler._chat_completion_to_result_with_tools  s   
 &&'1,9::&..q1&& %%5#K''61#K''83%K#K 79 ??NN;FIJ $//	y*5 )) $

4>> :I "'$<<!YY'	 00 EFF+!''"	
 	
' ++ $ II;c$..)9; s    EF,&FFrM   )#r   
__module____qualname____doc__r'   r   rO   rt   r   SamplingParamsr   r	   r
   r   r   r   ro   staticmethodr   rs   r   rx   r   r    r\   r   ri   r^   r   r%   r`   r   r#   rb   rh   r[   rA   r?   rI   rI   _   s   4
 &*6 6 d"6 
	60H'0H 0H  /? ?@
(88
9:	0H 
;	;0Hd +c1DI=D	# 0 JTzJ-5o-FJ	(	)J JX C'C	C C""!1C!7$s)!Cd!J"	" T
 t<S7T  * TT	,T T >
'>
	%>
 >
rA   rI   )=r   r   collections.abcr   r   typingr   r   r   mcpr   r	   mcp.shared.contextr
   r   	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   openair   openai.types.chatr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   openai.types.shared.chat_modelr'   openai.types.shared_paramsr(   ImportErrorr   r+   r   rs   __annotations__	frozensetr0   r@   rG   rI   r[   rA   r?   <module>r      s    *  . ) ) , ?    C"    9= 	; tC!667  -6:- 9S> 
( - b
 b
g  
	_ s   0B> >C	CC