
    .h0                     <   d Z ddlZddlZddlZddlZddlZddl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e      Ze G d d	             Z G d
 d      Z	 	 	 	 d(dededededededefdZej0                  ddfdededededede	eegdf      defdZedk(  rdefdZ eddd      Z ee      Zdd d!gZ ed"       ejA                  eejB                  e#      Z" ed$e"         ed%       ejA                  eej0                  &      Z" ed'e"        yy))uZ   
OpenAI-like 模型访问标准调用模块
支持流式输出和完整输出两种模式
    N)DictAnyOptional	GeneratorAsyncGeneratorCallable)	dataclass)Enumc                       e Zd ZdZdZdZy)
OutputModeu   输出模式枚举streamcompleteN)__name__
__module____qualname____doc__STREAMCOMPLETE     7C:\Users\win\Desktop\pyccd\funcs\utils\openai_client.pyr   r      s    FHr   r   c                   ^    e Zd ZU dZeed<   eed<   dZeed<   dZeed<   dZ	e
ed	<   d
Ze
ed<   y)ModelConfigu   模型配置api_urlapi_keygpt-3.5-turbo
model_name  
max_tokensffffff?temperature      >@timeoutN)r   r   r   r   str__annotations__r   r   intr!   floatr#   r   r   r   r   r      s7    LL%J%JKGUr   r   c                   8   e Zd ZdZdefdZej                  ddfdedede	e
   de	eegdf      d	ef
d
Zej                  ddfdedede	e
   de	eegdf      d	ef
dZdede
d	efdZdede
de	eegdf      d	efdZdede
d	efdZdede
de	eegdf      d	efdZy)OpenAILikeClientu   OpenAI-like 模型客户端configc                 @    || _         d|j                   dd| _        y)u\   
        初始化客户端
        
        Args:
            config: 模型配置
        zBearer zapplication/json)AuthorizationzContent-TypeN)r*   r   headers)selfr*   s     r   __init__zOpenAILikeClient.__init__&   s&     &v~~&67.
r   Nmessagesmoder#   callbackreturnc                     |xs | j                   j                  }|t        j                  k(  r| j	                  |||      S | j                  ||      S )u  
        聊天完成（同步版本）
        
        Args:
            messages: 消息列表
            mode: 输出模式
            timeout: 超时时间（秒），如果为None则使用配置中的默认值
            callback: 流式输出时的回调函数
            
        Returns:
            str: 完整的响应文本
            
        Raises:
            TimeoutError: 请求超时
            requests.RequestException: 请求异常
        )r*   r#   r   r   _chat_stream_sync_chat_complete_syncr.   r0   r1   r#   r2   s        r   chat_completezOpenAILikeClient.chat_complete3   sN    . 0T[[00:$$$))(GXFF++Hg>>r   c                    K   |xs | j                   j                  }|t        j                  k(  r| j	                  |||       d{   S | j                  ||       d{   S 7 7 w)u  
        聊天完成（异步版本）
        
        Args:
            messages: 消息列表
            mode: 输出模式
            timeout: 超时时间（秒），如果为None则使用配置中的默认值
            callback: 流式输出时的回调函数
            
        Returns:
            str: 完整的响应文本
            
        Raises:
            asyncio.TimeoutError: 请求超时
            aiohttp.ClientError: 请求异常
        N)r*   r#   r   r   _chat_stream_async_chat_complete_asyncr7   s        r   chat_complete_asyncz$OpenAILikeClient.chat_complete_asyncQ   sb     . 0T[[00:$$$007HMMM228WEEE NEs$   AA)A%A) A'!A)'A)c                 &   | j                   j                  || j                   j                  | j                   j                  dd}	 t	        j
                  | j                   j                  | j                  ||      }|j                          |j                         }|d   d   d   d   S # t        j                  j                  $ r t        d| d	      t        j                  j                  $ r}t	        j                  d
|       d}~ww xY w)u   完整输出（同步）Fmodelr0   r   r!   r   )r-   jsonr#   choicesr   messagecontentu   请求超时 (   秒)u   请求异常: N)r*   r   r   r!   requestspostr   r-   raise_for_statusr@   
exceptionsTimeoutTimeoutErrorRequestException)r.   r0   r#   payloadresponseresultes          r   r6   z$OpenAILikeClient._chat_complete_synco   s     [[++ ++00;;22
	B}}##	H %%']]_F)$Q'	29==""** 	?y=>>""33 	B++nQC,@AA	Bs   A$B+ +AD3DDc                    | j                   j                  || j                   j                  | j                   j                  dd}d}t	        j                         }	 t        j                  | j                   j                  | j                  |d|      }|j                          |j                         D ]  }t	        j                         |z
  |kD  rt        d| d      |s/|j                  d      }|j                  d      sR|d	d
 }	|	j                         dk(  r |S 	 t        j                   |	      }
d|
v rLt#        |
d         dkD  r;|
d   d   j%                  di       }|j%                  dd      }|r||z  }|r ||        |S # t        j&                  $ r Y w xY w# t
        j(                  j*                  $ r t        d| d      t
        j(                  j,                  $ r}t        j,                  d|       d
}~ww xY w)u   流式输出（同步）Tr>    )r-   r@   r   r#   u   流式请求超时 (rD   utf-8data:    N[DONE]rA   r   deltarC   u   流式请求异常: )r*   r   r   r!   timerE   rF   r   r-   rG   
iter_linesrJ   decode
startswithstripr@   loadslengetJSONDecodeErrorrH   rI   rK   )r.   r0   r#   r2   rL   full_response
start_timerM   linedatachunkrV   rC   rO   s                 r   r5   z"OpenAILikeClient._chat_stream_sync   s    [[++ ++00;;22
 YY[
*	H}}##H %%' ++- %99;+g5&)=gYd'KLL;;w/Dx0#ABx::<83!  ! %$(JJt$4E(E1c%	:J6Ka6O(-i(8(;(?(?(L*/))Ir*B#*$1W$<M'/(0(9-%6 !   $33 %$%
 ""** 	E!5gYdCDD""33 	H++.B1#,FGG	HsK   BF$ #"F$ F$ "A%FF$ F!F$  F!!F$ $AH	,HH	c                 j  K   | j                   j                  || j                   j                  | j                   j                  dd}t	        j
                  t	        j                  |            4 d{   }	 |j                  | j                   j                  | j                  |      4 d{   }|j                          |j                          d{   }|d   d   d	   d
   cddd      d{    cddd      d{    S 7 7 ^7 87 7 # 1 d{  7  sw Y   nxY wn^# t        j                  $ r t        j                  d| d      t        j                  $ r}t	        j                  d|       d}~ww xY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)u   完整输出（异步）Fr>   totalr#   Nr-   r@   rA   r   rB   rC   u   异步请求超时 (rD   u   异步请求异常: )r*   r   r   r!   aiohttpClientSessionClientTimeoutrF   r   r-   rG   r@   asynciorJ   ClientError)r.   r0   r#   rL   sessionrM   rN   rO   s           r   r;   z%OpenAILikeClient._chat_complete_async   s     [[++ ++00;;22
 ((1F1FW1UV 	F 	FZaF"<<KK'' LL  (  F F --/#+==?2F!),Q/	:9EF F F	F 	F 	FF 3F	FF F F F '' Q**-A'$+OPP&& F)),@*DEEF	F 	F 	F 	F 	Fs   A3F35D6F39F;6D.1D2D.5$DDD+D.7D8D.<F3D	F3D.DD.F3D*	D!D*	&D.-F.>F	,FF		FF3FF3F0$F'%F0,F3c                   K   | j                   j                  || j                   j                  | j                   j                  dd}d}t	        j
                  t	        j                  |            4 d{   }	 |j                  | j                   j                  | j                  |      4 d{   }|j                          |j                  2 3 d{   }|j                  d      j                         }|j                  d	      s:|d
d }	|	j                         dk(  r ng	 t        j                   |	      }
d|
v rLt#        |
d         dkD  r;|
d   d   j%                  di       }|j%                  dd      }|r||z  }|r ||       ddd      d{    |cddd      d{    S 7 ;7 7 # t        j&                  $ r Y w xY w6 F7 :# 1 d{  7  sw Y   JxY w7 ?# t(        j*                  $ r t)        j*                  d| d      t        j,                  $ r}t	        j,                  d|       d}~ww xY w# 1 d{  7  sw Y   yxY ww)u   流式输出（异步）Tr>   rQ   rf   rh   Nri   rR   rS   rT   rU   rA   r   rV   rC   u   异步流式请求超时 (rD   u   异步流式请求异常: )r*   r   r   r!   rj   rk   rl   rF   r   r-   rG   rC   rY   r[   rZ   r@   r\   r]   r^   r_   rm   rJ   rn   )r.   r0   r#   r2   rL   r`   ro   rM   rb   rc   rd   rV   rC   rO   s                 r   r:   z#OpenAILikeClient._chat_stream_async   sV     [[++ ++00;;22
 ((1F1FW1UV %	L %	LZa$L"<<KK'' LL  (  ) ) --/&.&6&6 ) )d#{{7399;??84#'8D#zz|x7 %)(,

4(8#,#5#eI>N:ORS:S,1),<Q,?,C,CGR,PE.3ii	2.FG'.(5(@+3,4W,=3) )< %A%	L %	L %	L))( $(#7#7 ) ()) '7) ) ) )%	LD '' W**-GyPT+UVV&& L)),Fqc*JKKLI%	L %	L %	Ls   A5I!7F28I!;I=6G.3F54G.7GGF8
G1GG)A%F:GG.GG. I!,G,-I!5G.8G:G	GG	GG.G)	G G)	%G.,I!.>I	,II		IIIII!)r   r   r   r   r   r/   r   r   listr   r'   r   r$   r8   r<   r6   r5   r;   r:   r   r   r   r)   r)   #   s   %
{ 
  &..#'48?? ? %	?
 8SE4K01? 
?B &..#'48FF F %	F
 8SE4K01F 
F<BD B5 BS B6<H<H <H 8SE4K01	<H
 
<H|F4 F% FC F46L6L 6L 8SE4K01	6L
 
6Lr   r)   r"   r   r   r   r   r!   r#   r3   c                 :    t        | |||||      }t        |      S )u(  
    创建OpenAI客户端
    
    Args:
        api_url: API地址
        api_key: API密钥
        model_name: 模型名称
        max_tokens: 最大token数
        temperature: 温度参数
        timeout: 超时时间
        
    Returns:
        OpenAILikeClient: 客户端实例
    )r   r   r   r   r!   r#   )r   r)   )r   r   r   r   r!   r#   r*   s          r   create_openai_clientrs     s-    , F F##r   rB   r1   r2   c                 R    t        | ||      }d|dg}|j                  ||||      S )u  
    快速聊天
    
    Args:
        api_url: API地址
        api_key: API密钥
        message: 用户消息
        mode: 输出模式
        timeout: 超时时间
        callback: 流式输出回调函数
        
    Returns:
        str: 响应文本
    rh   userrolerC   )rs   r8   )r   r   rB   r1   r#   r2   clientr0   s           r   
quick_chatry   =  s6    , "'7GDFG45H$BBr   __main__rC   c                      t        | dd       y )NrQ   T)endflush)print)rC   s    r   stream_callbackr   [  s    g2T*r   z*https://api.openai.com/v1/chat/completionszyour-api-key-here)r   r   r#   ru   u   你好，请介绍一下Pythonrv   u   === 流式输出 ===)r1   r2   u   
完整响应: u   
=== 完整输出 ===)r1   u   响应: )r   r   r    r"   )#r   r@   rW   rm   rj   rE   typingr   r   r   r   r   r   dataclassesr	   enumr
   r   r   r)   r$   r&   r'   rs   r   ry   r   r   r*   rx   r0   r~   r8   r   rM   r   r   r   <module>r      s  
      K K !     uL uLx &$$$ $ 	$
 $ $ $J "**04CCC C 	C
 C xt,-C 	C8 z+ + <#F
 f%F $DEH
 

 !##  $ H
 
XJ
'( 

"###   $ H 
HXJ
 A r   