
    Ki'<                     &   d Z ddlZddl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 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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( ddl)m*Z* ddl+m,Z,  G d d      Z/y# e-$ rZ. e-d      e.dZ.[.ww xY w)z$OpenAI sampling handler for FastMCP.    N)IteratorSequence)Anyget_args)ClientSessionServerSession)LifespanContextTRequestContext)CreateMessageRequestParams)
CreateMessageResultCreateMessageResultWithToolsModelPreferencesSamplingMessage
StopReasonTextContentTool
ToolChoiceToolResultContentToolUseContent)	NOT_GIVENAsyncOpenAINotGiven)	ChatCompletion#ChatCompletionAssistantMessageParamChatCompletionMessageParam"ChatCompletionMessageToolCallParam ChatCompletionSystemMessageParam#ChatCompletionToolChoiceOptionParamChatCompletionToolMessageParamChatCompletionToolParamChatCompletionUserMessageParam)	ChatModel)FunctionDefinitionzvThe `openai` package is not installed. Please install `fastmcp[openai]` or add `openai` to your dependencies manually.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clientreturnc                 8    |xs
 t               | _        || _        y N)r   r'   r&   )selfr&   r'   s      s/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/client/sampling/handlers/openai.py__init__zOpenAISamplingHandler.__init__0   s    
 $*#:[](5    messagesparamscontextc           	        K   | j                  |j                  |      }| j                  |j                        }t        }|j
                  r| j                  |j
                        }t        }|j                  r| j                  |j                        }| j                  j                  j                  j                  |||j                  |j                  nt        |j                  |j                  r|j                  nt        ||       d {   }|j
                  r| j!                  |      S | j#                  |      S 7 2w)N)system_promptr/   )modelr/   temperature
max_tokensstoptoolstool_choice)_convert_to_openai_messagessystemPrompt_select_model_from_preferencesmodelPreferencesr   r8   _convert_tools_to_openai
toolChoice_convert_tool_choice_to_openair'   chatcompletionscreater5   	maxTokensstopSequences%_chat_completion_to_result_with_tools)_chat_completion_to_create_message_result)	r+   r/   r0   r1   openai_messagesr4   openai_toolsopenai_tool_choiceresponses	            r,   __call__zOpenAISamplingHandler.__call__8   s*     ,,$11! -  	  >>v?V?VW BK<<88FL NW!%!D!DVEVEV!W))55<<$&,&8&8&D"")'')/)=)=%%9* = 

 

 <<==hGG==h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r*   )
isinstancestrr   r"   listr   hintsname)rM   rR   hintrS   s       r,   _iter_models_from_preferencesz3OpenAISamplingHandler._iter_models_from_preferencesc   s      $'-2CxH
 3
 $#)40((()+;<.444E4  $		))
		 = )s   ?BBABr3   c                 V   g }| r|j                  t        d|              |D ]  }|j                  }t        |t              rg }g }g }|D ]'  }t        |t
              rR|j                  t        |j                  d|j                  t        j                  |j                        d             ft        |t              r|j                  |j                         t        |t              sd}	|j                  rPg }
|j                  D ].  }t        |t              s|
j                  |j                         0 dj                  |
      }	|j                  t!        d|j"                  |		             * |s|r|rdj                  |      nd }|r/|j                  t%        d
||             |j'                  |       n^|r\|j(                  dk(  r|j                  t+        d|             n0|j                  t%        d
|             n|r|j'                  |       t        |t
              r_|j                  t%        d
t        |j                  d|j                  t        j                  |j                        d      g             mt        |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                  t%        d
|j                               nt-        dt/        |              |S )Nsystem)rolecontentfunction)rS   	arguments)idtyperZ    
tool)rX   tool_call_idrY   	assistant)rX   rY   
tool_callsuser)rX   rc   zUnsupported content type: )appendr   rY   rO   rQ   r   r   r\   rS   jsondumpsinputr   textr   joinr   	toolUseIdr   extendrX   r!   
ValueErrorr]   )r3   r/   rH   messagerY   rc   
text_partstool_messagesitemcontent_textresult_textssub_itemmsg_contents                r,   r:   z1OpenAISamplingHandler._convert_to_openai_messages|   sY    =?""0!)   B	KGooG '4(GI
(*
FH# D!$7"))>#'77%/,0II15DJJ1G*"	 $D+6"))$))4#D*;<')<<+-L,0LL G#-h#D$0$7$7$FG ,099\+BL%,,:%+-1^^(4/B ;E$))J"74K!'..?%0(3+5 (..}=$"<<61+22 >)/,7!" ,22 C)4,7!" ##**=9 '>2&&7(>#*::%/,3LL15GMM1J*"	$  '#45*,?? ' ;%dK8(//		:;  &&2#%,%6%6 $		, 7  ';/<<6)#**6!'$+LL $**;!,$+LL 9$w-IJJEB	KH r.   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 completionri   r]   ri   rb   )rY   rX   r4   &No content in response from completion)lenchoicesrm   rn   rY   r   r   r4   )rv   first_choicerY   s      r,   rG   z?OpenAISamplingHandler._chat_completion_to_create_message_result  s{     &&'1,9::&..q1"**22272&#g> %++  ABBr.   c                 t    | j                  |      D ]  }|t        t              v s|}|c S  | j                  S r*   )rU   r   r"   r&   )r+   rM   model_optionchosen_models       r,   r<   z4OpenAISamplingHandler._select_model_from_preferences"  sE     !>>?PQ 	$Lx	22*6##	$
 !!!r.   r8   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.r]   objectrZ   r^   )rS   description
parameters)r]   rZ   )dictinputSchemare   r    r#   rS   r   )r8   rI   r`   r   s       r,   r>   z.OpenAISamplingHandler._convert_tools_to_openai,  s{     79 	D)-d.>.>)?JZ'%-
6"'#/!YY$($4$4$:#-		  r.   r9   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: )moderm   )r9   s    r,   r@   z4OpenAISamplingHandler._convert_tool_choice_to_openaiB  sQ    
 v%+'=k>N>N=QRSSr.   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   rx   rc   toolUser7   endTurnlengthrD   ri   ry   rZ   z$Invalid JSON in tool arguments for 'z': Ntool_use)r]   r\   rS   rh   rz   rb   )rY   rX   r4   
stopReason)r{   r|   rm   rn   finish_reasonrY   re   r   rc   hasattrrZ   rf   loadsr[   JSONDecodeErrorrS   r   r\   r   r4   )	rv   r}   rn   stop_reasonrY   	tool_callfuncr[   es	            r,   rF   z;OpenAISamplingHandler._chat_completion_to_result_with_toolsP  s   
 &&'1,9::&..q1&& %%5#K''61#K''83%K#K 79 ??NN;FIJ $// 	y*5 )) $

4>> :I "'$<<!YY'	0 EFF+!''"	
 	
' ++ $ II;c$..)9; s    EF,&FFr*   )#__name__
__module____qualname____doc__r"   r   r-   rQ   r   SamplingParamsr
   r   r	   r   r   r   rL   staticmethodr   rP   r   rU   r   r   r:   r   rG   r<   r   r    r>   r   r   r@   rF    r.   r,   r%   r%   -   s   4
 &*6 6 d"6 
	6)H')H )H  /? ?@
(88
9:	)H 
;	;)HV +c1DI=D	# 0 QTzQ-5o-FQ	(	)Q Qf C'C	C C""!1C!7$s)!Cd!J"	" T
 t<S7T  * TT	,T T >
'>
	%>
 >
r.   r%   )0r   rf   collections.abcr   r   typingr   r   mcpr   r   mcp.shared.contextr	   r
   	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   openair   r   r   openai.types.chatr   r   r   r   r   r   r   r    r!   openai.types.shared.chat_modelr"   openai.types.shared_paramsr#   ImportErrorr   r%   r   r.   r,   <module>r      s    *  .   , ? B  77
 
 
 9=b
 b
  
	Z s   ,A= =B	BB