
    <:i!                     v    S r SSKJrJrJrJr  SSKrSSKrSSKJ	r	  \R                  " \5      r " S S\	5      rg)uG   
OpenAI 提供商实现

支持 GPT-4o, GPT-4, GPT-3.5-turbo 等模型
    )DictListAny	GeneratorN   )BaseAIProviderc                   j   \ rS rSrSr\S\4S j5       r\S\4S j5       rS\4S jr	S\4S jr
S\\   4S jrS	 r   SS\\\\4      S\\   S\S\S\\\4   4
S jjr   SS\\\\4      S\\   S\S\S\\\\4   S
S
4   4
S jjrS\\\4   4S jrS\\\\4      S\S\S\S\\\4   4
S jrSrg
)OpenAIProvider   u   OpenAI API 提供商returnc                     g)Nopenai selfs    X   /Users/yu22x/Desktop/ddd_副本5/ctf/app/services/ai_driver/providers/openai_provider.pyprovider_typeOpenAIProvider.provider_type           c                     g)NOpenAIr   r   s    r   provider_nameOpenAIProvider.provider_name   r   r   c                     g)Nzhttps://api.openai.com/v1r   r   s    r   get_default_base_url#OpenAIProvider.get_default_base_url   s    *r   c                     g)Ngpt-4or   r   s    r   get_default_model OpenAIProvider.get_default_model   s    r   c                 
    / SQ$ )N)r   zgpt-4o-minizgpt-4-turbozgpt-4zgpt-3.5-turbor   r   s    r   get_available_models#OpenAIProvider.get_available_models"   s    QQr   c                      SSK Jn  U" U R                  U R                  U R                  S9$ ! [
         a    [        S5      ef = f)u   获取 OpenAI 客户端r   )r   )api_keybase_urltimeoutu(   请安装 openai 库: pip install openai)r   r   r&   r'   r(   ImportError)r   r   s     r   _get_clientOpenAIProvider._get_client%   sL    	J% 
  	JHII	Js	   +. ANmessagestoolstemperature
max_tokensc           
        ^ SSK nU R                  5       nU R                  U R                  U5      US.nU(       a  XHS'   U(       a  U R	                  U5      US'   SUS'   Sn	[        U R                  5       Hi  n
 U R                  SS	U R                   3U
S:  a  S
U
 S3OS-   5        UR                  R                  R                  " S0 UD6nU R                  U5      s  $    U R                  SSU R                   S[        U	5       35        U	e! [         a  nUn	[        U5      R                  5       m[        U4S jS 5       5      nU(       a^  XR                  S-
  :  aL  U
S-   S-  nU R                  SS[!        U5      R"                   SU S35        UR%                  U5         SnAGM9  U R                  SS[        U5       35        e SnAff = f)u   执行聊天补全r   N)modelr,   r.   r/   r-   autotool_choiceinfou   发送请求到 u	    (重试 ) c              3   ,   >#    U  H	  oT;   v   M     g 7f)Nr   ).0keyword	error_strs     r   	<genexpr>&OpenAIProvider.chat.<locals>.<genexpr>W   s      # HGi#7 Hs   )	
connectionr(   rate502503504zbad gatewayzservice unavailablezgateway timeoutr      warningu   API 调用失败 (u   )，u   秒后重试...erroru   API 调用失败: u   API 调用失败（已重试 u	    次）: r   )timer*   r1   _format_messages_format_toolsrangemax_retries_logchatcompletionscreate_parse_response	Exceptionstrloweranytype__name__sleep)r   r,   r-   r.   r/   kwargsrE   clientrequest_params
last_errorattemptresponseeshould_retry	wait_timer:   s                  @r   rK   OpenAIProvider.chat1   s    	!!# ZZ--h7&
 +5<(&*&8&8&?N7#,2N=) 
T--.G		&$4TZZL"A_fij_jyQXPYYZE[pr"st!;;2299KNK++H55	 /. 			':4;K;K:LIVYZdVeUfgh%  
FLLN	" # H #    !1!1A!55%,q[A$5			)/A$q'BRBRASSWXaWbbq-rs

9- 		'%7Ax#@As    ;A$D
GBG0GGc           	   +     #    U R                  5       nU R                  U R                  U5      USS.nU(       a  XGS'   U(       a  U R                  U5      US'   SUS'    U R	                  SSU R                   35        UR
                  R                  R                  " S0 UD6nS	n	/ n
U GH  nUR                  (       d  M  [        UR                  5      S
:  d  M2  UR                  S
   R                  nUR                  (       a   XR                  -  n	SUR                  U	S.v   UR                  (       Ga  UR                   GH  nUR                  [        U
5      :  a+  U
R                  UR                  =(       d    S	SS	S	S.S.5        XR                     nUR                  (       a  UR                  US'   UR                   (       d  M  UR                   R"                  (       a  UR                   R"                  US   S'   UR                   R$                  (       d  M  US   S==   UR                   R$                  -  ss'   GM     UR                  S
   R&                  (       d  GM  SUR                  S
   R&                  U	U
(       a  U
OSS.v   GM     g! [(         a$  nU R	                  SS[+        U5       35        e SnAff = f7f)u   流式聊天补全T)r1   r,   r.   streamr/   r-   r2   r3   r4   u   开始流式请求到 r6   r   content)rS   rb   accumulatedfunctionname	argumentsidrS   rd   ri   rf   rg   finishN)rS   finish_reasonrb   
tool_callsrD   u   流式 API 调用失败: r   )r*   r1   rF   rG   rJ   rK   rL   rM   choiceslendeltarb   rl   indexappendri   rd   rf   rg   rk   rO   rP   )r   r,   r-   r.   r/   rV   rW   rX   ra   collected_contentcollected_tool_callschunkro   	tool_calltcr\   s                   r   chat_streamOpenAIProvider.chat_streamg   sl     !!# ZZ--h7&	
 +5<(&*&8&8&?N7#,2N=)6	IIf 6tzzlCD[[,,33EnEF "#% ===S%7!%;!MM!,22E }})]]:)$-',}}+<  ''').)9)9I(#6J2KK 4 ; ;*3,,*<",602571&=" !# "6oo!FB(||+4<<4(111#,#5#5#:#:=F=O=O=T=TBzN6$:#,#5#5#?#?#?$&zN;$?9CUCUC_C_$_$?' *:, }}Q'555$,-2]]1-=-K-K'8BV*>\`	 M  Z  	IIg!:3q6(CD	sL   AKAJ J C-J AJ !AJ +.J K
K$KKKc                 0   UR                   S   nUR                  nUR                  =(       d    SUR                  SSS.nUR                  (       ao  / US'   UR                   HZ  nUS   R                  UR                  UR                  UR                  R                  UR                  R                  S.S.5        M\     UR                  (       aE  UR                  R                  UR                  R                  UR                  R                  S.US	'   U$ )
u   解析 OpenAI 响应r   r6   N)rb   rk   rl   usagerl   re   rh   )prompt_tokenscompletion_tokenstotal_tokensrz   )rm   messagerb   rk   rl   rq   ri   rS   rd   rf   rg   rz   r{   r|   r}   )r   r[   choicer~   resultrv   s         r   rN   OpenAIProvider._parse_response   s    !!!$.. ,"#11	
 #%F< ((|$++%%GG " 0 0%'[[%:%:!-  ) >>!)!=!=%-^^%E%E ( ; ;F7O r   tool_call_id	tool_nametool_resultc                 V    USUUUS./-   nU R                   " U4SU R                  0UD6$ )u   继续对话，传入工具执行结果

Args:
    messages: 之前的消息列表
    tool_call_id: 工具调用 ID
    tool_name: 工具名称
    tool_result: 工具执行结果
    
Returns:
    AI 响应
tool)roler   rf   rb   r-   )rK   _tools)r   r,   r   r   r   rV   messages_with_results          r   continue_with_tool_result(OpenAIProvider.continue_with_tool_result   sE    (  (("	,
 +   yy-KT[[KFKKr   r   )Ngffffff?N)rT   
__module____qualname____firstlineno____doc__propertyrP   r   r   r   r    r   r#   r*   r   floatintr   rK   r   rw   rN   r   __static_attributes__r   r   r   r
   r
      s   s   s  +c +3 Rd3i R
J ! 4tCH~&4 Dz4 	4
 4 
c3h4r ! OtCH~&O DzO 	O
 O 
4S>4-	.Ob!4S> !FLtCH~&L L 	L
 L 
c3hLr   r
   )r   typingr   r   r   r   loggingjsonbaser   	getLoggerrT   loggerr
   r   r   r   <module>r      s;    . -    			8	$eL^ eLr   