
    .h-                        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Zddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlZ G d de      Ze G d d	             Z G d
 d      Z	 	 	 	 d4dededededededefdZej2                  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 d#       ejC                  eej2                  $      Z" e d%e"         e d&       ejC                  eejF                  e'      Z" e d( e$e"       d)        e d*       ejK                  eej2                  d+,      Z" e d%e"         e d.       	  eddd/ej2                  d01      Z" e d2e"        yy# e&$ rZ' e d-e'        Y dZ'['BdZ'['ww xY w# e&$ rZ' e d3e'        Y dZ'['ydZ'['ww xY w)5u   
简化版 OpenAI-like 模型访问标准调用模块
只使用标准库，不依赖外部包
支持流式输出和完整输出两种模式
    N)DictAnyOptionalCallable)	dataclass)Enumc                       e Zd ZdZdZdZy)
OutputModeu   输出模式枚举streamcompleteN)__name__
__module____qualname____doc__STREAMCOMPLETE     >C:\Users\win\Desktop\pyccd\funcs\utils\simple_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                       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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ej                  ddfdedede	e
   de	eegdf      d	ef
dZy)SimpleOpenAIClientu=   简化版 OpenAI-like 模型客户端（仅使用标准库）configc                 B    || _         d|j                   ddd| _        y)u\   
        初始化客户端
        
        Args:
            config: 模型配置
        zBearer zapplication/jsonzSimpleOpenAI-Client/1.0)AuthorizationzContent-Typez
User-AgentN)r(   r   headers)selfr(   s     r   __init__zSimpleOpenAIClient.__init__)   s)     &v~~&67.3
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: 请求超时
            urllib.error.URLError: 请求异常
        )r(   r!   r
   r   _chat_stream_chat_complete)r,   r.   r/   r!   r0   s        r   chat_completez SimpleOpenAIClient.chat_complete7   sN    . 0T[[00:$$$$$XwAA&&x99r   c                    | j                   j                  || j                   j                  | j                   j                  dd}t	        j
                  |      j                  d      }t        j                  j                  | j                   j                  || j                  d      }	 t        j                         }d|_        t        j                  |_        t        j                  j#                  |||      5 }t	        j$                  |j'                         j)                  d            }|d   d   d	   d
   cddd       S # 1 sw Y   yxY w# t        j*                  j,                  $ r|}	d|	j.                   d|	j0                   }
t3        |	d      r0	 |	j'                         j)                  d      }|
d| z  }
n#  Y nxY wt        j*                  j5                  |
      d}	~	wt        j*                  j4                  $ rC}	dt7        |	      v rt9        d| d      t        j*                  j5                  d|	       d}	~	ww xY w)u   完整输出Fmodelr.   r   r   r   utf-8POSTdatar+   methodr!   contextchoicesr   messagecontentN   HTTP错误 : readu   
详细错误: 	timed out   请求超时 (   秒)u   请求异常: )r(   r   r   r   jsondumpsencodeurllibrequestRequestr   r+   sslcreate_default_contextcheck_hostname	CERT_NONEverify_modeurlopenloadsrE   decodeerror	HTTPErrorcodereasonhasattrURLErrorr"   TimeoutError)r,   r.   r!   payloadr<   reqssl_contextresponseresulte	error_msgerror_details               r   r4   z!SimpleOpenAIClient._chat_completeU   s    [[++ ++00;;22
 zz'"))'2nn$$KKLL	 % 
	>446K).K&&)mmK#''Wk'R BV^HMMO$:$:7$CDi(+I6yAB B B ||%% 	3%affXRz:Iq&!#$668??7#;L#3L>!BBI,,''	22||$$ 	>c!f$"^G9D#ABB,,''.(<==	>s\   +AE =A E=	E EE E I
0(G''G G'G$G'' I
>II
c                    | j                   j                  || j                   j                  | j                   j                  dd}t	        j
                  |      j                  d      }t        j                  j                  | j                   j                  || j                  d      }d}t        j                         }	 t        j                         }	d|	_        t        j                   |	_        t        j                  j%                  |||	      5 }
	 t        j                         |z
  |kD  rt'        d	| d
      |
j)                         }|sn|j+                  d      j-                         }|j/                  d      r|dd }|j-                         dk(  rng	 t	        j0                  |      }d|v rLt3        |d         dkD  r;|d   d   j5                  di       }|j5                  dd      }|r||z  }|r ||       ddd       |S # t        j6                  $ r Y w xY w# 1 sw Y   |S xY w# t        j8                  j:                  $ r@}d|j<                   d|j>                   }t        j8                  jA                  |      d}~wt        j8                  j@                  $ rC}dtC        |      v rt'        d	| d
      t        j8                  jA                  d|       d}~ww xY w)u   流式输出Tr7   r9   r:   r;    Fr>   u   流式请求超时 (rH   zdata:    Nz[DONE]r@   r   deltarB   rC   rD   rF   u   流式请求异常: )"r(   r   r   r   rI   rJ   rK   rL   rM   rN   r   r+   timerO   rP   rQ   rR   rS   rT   r]   readlinerV   strip
startswithrU   lengetJSONDecodeErrorrW   rX   rY   rZ   r\   r"   )r,   r.   r!   r0   r^   r<   r_   full_response
start_timer`   ra   linedata_contentchunkri   rB   rc   rd   s                     r   r3   zSimpleOpenAIClient._chat_stream   s    [[++ ++00;;22
 zz'"))'2nn$$KKLL	 % 
 YY[
.	D446K).K&&)mmK#''Wk'R %V^yy{Z/'9*-A'$+OPP#,,.D;;w/557Dx0'+ABx'--/8;!%$(JJ|$<E(E1c%	:J6Ka6O(-i(8(;(?(?(L*/))Ir*B#*$1W$<M'/(0(95 %@ !   $33 %$%;%@ ! ||%% 	3%affXRz:I,,''	22||$$ 	Dc!f$"%9'$#GHH,,''*>qc(BCC	Dsi   AH2 BH%A%H H%	H2 H"H%!H""H%%H/*H2 /H2 2K-;J

 K-*>K((K-c                 8    xs  j                   j                  ddd fd}t        j                  |      }d|_        |j                          |j                         |j                         rt        d d      d   rd   d	   S )
u=  
        使用线程实现超时控制的聊天完成
        
        Args:
            messages: 消息列表
            mode: 输出模式
            timeout: 超时时间（秒）
            callback: 流式输出时的回调函数
            
        Returns:
            str: 完整的响应文本
        N)ra   rW   c                  l    	 j                        d<   y # t        $ r} | d<   Y d } ~ y d } ~ ww xY w)Nra   rW   )r5   	Exception)rc   r0   r.   r/   rb   r,   r!   s    r   workerz;SimpleOpenAIClient.chat_with_timeout_thread.<locals>.worker   s=    $%)%7%7$QY%Zz" $"#w$s    	3.3)targetTrG   rH   rW   ra   )	r(   r!   	threadingThreaddaemonstartjoinis_aliver]   )r,   r.   r/   r!   r0   ry   threadrb   s   `````  @r   chat_with_timeout_threadz+SimpleOpenAIClient.chat_with_timeout_thread   s    & 0T[[00"T2	$ 	$ !!0G??y=>>'?/!j!!r   )r   r   r   r   r   r-   r
   r   listr   r%   r   r"   r5   r4   r3   r   r   r   r   r'   r'   &   s&   G
{ 
" &..#'48:: : %	:
 8SE4K01: 
:<)>t )>e )> )>VIDID ID 8SE4K01	ID
 
ID\ &..#'48("(" (" %	("
 8SE4K01(" 
("r   r'   r    r   r   r   r   r   r!   r1   c                 :    t        | |||||      }t        |      S )u3  
    创建简化版OpenAI客户端
    
    Args:
        api_url: API地址
        api_key: API密钥
        model_name: 模型名称
        max_tokens: 最大token数
        temperature: 温度参数
        timeout: 超时时间
        
    Returns:
        SimpleOpenAIClient: 客户端实例
    )r   r   r   r   r   r!   )r   r'   )r   r   r   r   r   r!   r(   s          r   create_simple_openai_clientr      s-    , F f%%r   rA   r/   r0   c                 R    t        | ||      }d|dg}|j                  ||||      S )u  
    快速聊天（简化版）
    
    Args:
        api_url: API地址
        api_key: API密钥
        message: 用户消息
        mode: 输出模式
        timeout: 超时时间
        callback: 流式输出回调函数
        
    Returns:
        str: 响应文本
    )r!   userrolerB   )r   r5   )r   r   rA   r/   r!   r0   clientr.   s           r   quick_chat_simpler     s6    , )'7KFG45H$BBr   __main__rB   c                      t        | dd       y )Nrg   T)endflush)print)rB   s    r   stream_callbackr   6  s    g2T*r   z*https://api.openai.com/v1/chat/completionszyour-api-key-here)r   r   r!   r   u   你好，请介绍一下Pythonr   u    === 简化版客户端示例 ===u   完整输出测试:)r/   u   响应: u   
流式输出测试:)r/   r0   u   
完整响应长度: u    字符u   
线程超时版本测试:g      $@)r/   r!   u   测试失败: u   
=== 快速聊天测试 ===u!   请用一句话描述人工智能g      .@)r   r   rA   r/   r!   u   快速聊天响应: u   快速聊天失败: )r   r   r   r    )(r   rI   rj   r{   urllib.requestrL   urllib.parseurllib.errortypingr   r   r   r   dataclassesr   enumr   rO   r
   r   r'   r"   r$   r%   r   r   r   r   r   r(   r   r.   r   r5   ra   r   rn   r   rx   rc   r   r   r   <module>r      s         0 0 !  
    M" M"h &&&& & 	&
 & & &J "**04CCC C 	C
 C xt,-C 	C8 z+ + <#F
  'F $DEH 

,-$#$''$$ ( 
 	
#$ 	%&''""$ ( 

 	&s8}oW=> 	+,22$$ 3 

 	
#$ 

()
*$@'7$$
 	$XJ/0w \  $qc"##$  *$QC())*s1   BF *"F+ F(F##F(+G0G  G