
     @g5                        d dl m Z  d dlZd dlZd dlmZ d dlZd dlmZ ddlm	Z	m
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  ej        e          Z G d
 de          Z G d de          Z ej        d          ZdefdZdefdZ  G d de          Z! G d de          Z"eee!e"gZ# G d de          Z$ G d de$          Z%dS )    )datetimeN)List)Request   )RequestFilterBaseResponseFilterBase)
HTTPXProxySessionInfoSessionRequestItemBaseSessionResponseItemBaseSessionStreamChunkItemBaseSessionErrorItemBase)_AccessLogBase)QueueClientBasec                       e Zd ZdedefdZdS )ChatGPTRequestItemaccesslog_clsreturnc                 0   | j                                         }|                    d          x}r|d d         dz   |dd          z   |d<   | j        d         d         d         }t	          |t
                    r/|D ]}|d         d	k    r
|d	         } nt          j        |          } || j        t          j
                    d
|t          j        | j        d          t          j        |d          | j                            d                    }|S )Nauthorization   z*****messagescontenttypetextrequestFensure_asciimodel)
request_id
created_at	directionr   raw_bodyraw_headersr!   )request_headerscopygetrequest_json
isinstancelistjsondumpsr"   r   utcnow)selfr   request_headers_copyauthr   c	accesslogs          C/var/www/piapp/venv/lib/python3.11/site-packages/aiproxy/chatgpt.pyto_accesslogzChatGPTRequestItem.to_accesslog   s3   #388::'++O<<<4 	T48"I4G$rss)4S 1#J/3I>gt$$ 	. . .V9&&iGE ' *W--!M((Z 1FFF
#7eLLL#''00
 
 
	     N__name__
__module____qualname__r   r6    r7   r5   r   r      s6        . ^      r7   r   c                       e Zd ZdedefdZdS )ChatGPTResponseItemr   r   c                    | j         d         d         d                             d          }| j         d         d         d                             d          }| j         d         d         d                             d          }| j        :t          j        t          | j                                                  d          nd }| j         d	         }| j         d
         d         }| j         d
         d         } || j        t          j	                    d| j
        ||t          j        |d          nd |t          j        |d          nd t          j        | j         d          ||||| j        | j                  S )Nchoicesr   messager   function_call
tool_callsFr   r!   usageprompt_tokenscompletion_tokensresponser"   r#   r$   status_coder   rB   rC   r%   r&   r!   rE   rF   request_timerequest_time_api)response_jsonr)   response_headersr-   r.   dictitemsr"   r   r/   rI   durationduration_api)	r0   r   r   rB   rC   rM   r!   rE   rF   s	            r5   r6   z ChatGPTResponseItem.to_accesslog,   s   "9-a0;??	JJ(3A6yAEEoVV%i03I>BB<PP
bfbw  cD4:d4+@+F+F+H+H&I&IX]^^^^  JN )(1/B,W56IJ}(( (KXKd$*]GGGGjnEOE[tz*5AAAAaeZ 2GGG('/!.
 
 
 	
r7   Nr8   r<   r7   r5   r>   r>   +   s6        
. 
^ 
 
 
 
 
 
r7   r>   cl100k_baser   c                 P    t          t                              |                     S )N)lentoken_encoderencode)r   s    r5   count_tokenrW   I   s    }##G,,---r7   r*   c                 ~   d}d}d}| d         D ]}||z  }|                                 D ]n\  }}t          |t                    r7|D ]3}|                    d          dk    r|t	          |d                   z  }4n|t	          |          z  }|dk    r||z  }o|                     d          x}r)|D ]&}	|t	          t          j        |	                    z  }'|                     d	          x}
rLt          |
t                    r%|t	          t          j        |
                    z  }n|t	          |
          z  }|                     d
          x}r)|D ]&}|t	          t          j        |                    z  }'|                     d          x}r$|t	          t          j        |                    z  }|dz  }|S )N   r   r   r   r   r   name	functionsrB   toolstool_choice)rO   r+   r,   r)   rW   r-   r.   rN   )r*   tokens_per_messagetokens_per_nametoken_countmkvr3   r[   frB   r\   tr]   s                 r5   count_request_tokenrf   L   s   OK *% 
/ 
/))GGII 	/ 	/DAq!T"" . > >AuuV}}..#{1V9'='==> {1~~-F{{.	/ !$$[111y 6 	6 	6A;tz!}}555KK %((999} 6mT** 	6;tz-'@'@AAAKK;}555K   )))u 6 	6 	6A;tz!}}555KK"&&}555{ <{4:k#:#:;;;1Kr7   c                       e Zd ZdedefdZdS )ChatGPTStreamResponseItemr   r   c                    d}d}d }d }d}d}| j                             d          }|D ]Q}	|	                                }
|
                    d          s-|
                    d          r nt          j        |
dd                    }|                    d          x}r|d         }|d	         }t          |d
                   dk    r|sd|v r|                    d          }|d
         d         d         }|                    d          r|g }|d         d         d                             d          r5|	                    d|d         d         d         d         ddd           F|d         d         d                             d          rC|d         d         dxx         |d         d         d                             d          pdz  cc<   |                    d          rp|i }|d                             d          r|d         d         |d<   d|d<   |d                             d          r|dxx         |d         d         z  cc<   7||                    d          pdz  }S|t          j
        |d          nd }|t          j
        |d          nd }| j        :t          j
        t          | j                                                  d          nd }|dk    s|dk    rLt          | j        j                  }|rt#          |          }n!|rt#          |          }nt#          |          } || j        t'          j                    d| j        |||| j         ||||| j        | j                  S )N r   z

zdata:z[DONE]   rD   rE   rF   r@   r!   deltarC   functionrZ   )rZ   	arguments)r   rm   rn   r   rB   r   Fr   rG   rH   )response_contentsplitstrip
startswithendswithr-   loadsr)   rT   appendr.   rM   rN   rO   rf   sessionr*   rW   r"   r   r/   rI   rP   rQ   )r0   r   response_textr!   rB   rC   rE   rF   chunkschunkchunk_strip
chunk_jsonrD   rl   function_call_strtool_calls_strrM   s                    r5   r6   z&ChatGPTStreamResponseItem.to_accesslogw   s3   
 &,,V44 1	< 1	<E++--K))'22 ##H-- KO44J"w///u ? %o 6$)*=$>!:i())Q.. 0W
22"w//y)!,W5E yy&& <%!#J&q)*599&AA 	y%% *$),$7$::$Fv$N)+% %' '     <(+J7;;KHH yrN:.{;;;u\?RST?UV`?a?e?efq?r?r?xvxx;;; ?++ < ($&M)--f55 V,1/,B6,JM&)13M+..?+//<< V!+...%2H2UU... 9!5!5!;; N[MfDJ}5IIIIlpGQG]JUCCCCcgbfbw  cD4:d4+@+F+F+H+H&I&IX]^^^^  JN A!2a!7!7/0IJJM ?$/$?$?!!" ?$/0A$B$B!!$/$>$>!}(( (!+%*('/!.
 
 
 	
r7   Nr8   r<   r7   r5   rh   rh   v   s>        \
. \
^ \
 \
 \
 \
 \
 \
r7   rh   c                       e Zd ZdS )ChatGPTErrorItemN)r9   r:   r;   r<   r7   r5   r   r      s        Cr7   r   c                        e Zd Zddddeeeeddedee	         dee
         deded	ed
edef fdZdedefdZdedee         fdZdedef fdZdef fdZ xZS )ChatGPTProxyN      N@)api_keytimeoutrequest_filtersresponse_filtersrequest_item_classresponse_item_classstream_response_item_classerror_item_classr   r   r   r   r   r   r   access_logger_queuec       	   
          t                                          ||||||||	           || _        d| _        d| _        d| _        d S )N)r   r   r   r   r   r   r   r   zhttps://api.openai.com/v1z/chat/completionsopenai)super__init__r   api_base_urlapi_chat_resource_pathapi_service_id)r0   r   r   r   r   r   r   r   r   r   	__class__s             r5   r   zChatGPTProxy.__init__   se     	+-1 3'A- 3 	 		
 		
 		
 7&9#&r7   r   r   c           	          ddt          t          j                                                              ddd|dddgdddd	d
S )N-chat.completionrequest_filterr   	assistantroler   stop)indexrA   finish_reasonrE   rF   total_tokens)idobjectcreatedr!   r@   rD   )intr   r/   	timestamp)r0   r   s     r5   text_to_response_jsonz"ChatGPTProxy.text_to_response_json   su    '8?,,668899%#  "(   "#%& ! 
 
 	
r7   c           	      \    ddddd ddgddddddd	d
}dd|idddgddddddd	d
}||gS )Nr   r   rj   r   r   )rl   r   r   r   r   r   )r   r@   r   r!   r   rD   r   r   r<   )r0   r   first_chunk
last_chunks       r5   text_to_response_chunksz$ChatGPTProxy.text_to_response_chunks  s    +62"F"FY]hijjk%''(qRSTT
 
 #,d"3fWXYYZ%''(qRSTT
 

 Z((r7   fastapi_requestrv   c                   K   t                                          ||           d {V  |j                            d          du |_        |j        r6|j                            d          s
i |j        d<   d|j        d         d<   d S d S )NstreamTstream_optionsinclude_usage)r   parse_requestr*   r)   r   r0   r   rv   r   s      r5   r   zChatGPTProxy.parse_request$  s      gg##OW========= -11(;;tC> 	K'++,<== <9;$%56FJG !12?CCC	K 	Kr7   c                 n    t                                          |           d| j         |j        d<   d S )NzBearer r   r   prepare_httpx_request_headersr   r'   r0   rv   r   s     r5   r   z*ChatGPTProxy.prepare_httpx_request_headers,  s8    --g6663KT\3K3K000r7   )r9   r:   r;   r   r>   rh   r   strr   r   r   r   r   r   rN   r   r   r   r
   r   r   __classcell__r   s   @r5   r   r      si        3759#5$7+D!1' ' ' '
 /0' 12' !' "' %)' ' -' ' ' ' ' ':
# 
$ 
 
 
 
*)C )DJ ) ) ) )&K7 K[ K K K K K KL[ L L L L L L L L L Lr7   r   c                        e Zd Zdddddddeeeeddededededee	         d	ee
         d
ededededef fdZdedef fdZdef fdZdefdZ xZS )AzureOpenAIProxyNr   )r   resource_namedeployment_idapi_versionr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                    t                                          ||||||	|
||	  	         d| _        || _        || _        || _        d S )N)	r   r   r   r   r   r   r   r   r   zvhttps://{resource_name}.openai.azure.com/openai/deployments/{deployment_id}/chat/completions?api-version={api_version})r   r   r   r   r   r   )r0   r   r   r   r   r   r   r   r   r   r   r   r   r   s                r5   r   zAzureOpenAIProxy.__init__3  sj      	+-1 3'A- 3 	 
	
 
	
 
	
 U**&r7   r   rv   c                    K   t                                          ||           d {V  |j                            d          r
|j        d= d S d S )Nr   )r   r   r*   r)   r   s      r5   r   zAzureOpenAIProxy.parse_requestT  si      gg##OW=========##$455 	7$%5666	7 	7r7   c                 h    t                                          |           | j        |j        d<   d S )Nzapi-keyr   r   s     r5   r   z.AzureOpenAIProxy.prepare_httpx_request_headersY  s0    --g666-1\	***r7   c                 Z    | j                             | j        | j        | j                  S )N)r   r   r   )r   formatr   r   r   )r0   rv   s     r5   make_urlzAzureOpenAIProxy.make_url]  s4     '',,( ( 
 
 	
r7   )r9   r:   r;   r   r>   rh   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   s   @r5   r   r   2  sQ        !!3759#5$7+D!1' ' ' ' 	'
 ' ' /0' 12' !' "' %)' ' -' ' ' ' ' 'B77 7[ 7 7 7 7 7 7
:[ : : : : : :
 
 
 
 
 
 
 
 
r7   r   )&r   r-   loggingtypingr   tiktokenfastapir   proxyr   r   httpx_proxyr	   r
   r   r   r   r   r4   r   queueclientr   	getLoggerr9   loggerr   r>   get_encodingrU   r   rW   rN   rf   rh   r   queue_item_typesr   r   r<   r7   r5   <module>r      s                        8 8 8 8 8 8 8 8 T  T  T  T  T  T  T  T  T  T  T  T  T  T  T  T % % % % % % ( ( ( ( ( (		8	$	$    /   8
 
 
 
 
1 
 
 
8 &%m44. . . . .'d ' ' ' 'T]
 ]
 ]
 ]
 ]
 : ]
 ]
 ]
@    +    '(;=VXhi PL PL PL PL PL: PL PL PLh0
 0
 0
 0
 0
| 0
 0
 0
 0
 0
r7   