§
     @gË5  ã                   ó–  — 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È$ÈrÈsÈsÌ)Ñ4SÐ  Ñ1àÔ# JÔ/°Ô3°IÔ>ˆÝ�g�tÑ$Ô$ð 	.Øð .ð .�Ø�V”9 Ò&Ð&Ø œi�GØ�Eð 'õ œ* WÑ-Ô-�à!�MØ”Ý”Ñ(Ô(ØØÝ”Z Ô 1ÀÐFÑFÔFÝœ
Ð#7ÀeÐ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ˆØÔ(¨Ô3°AÔ6°yÔA×EÒEÀoÑVÔVˆØÔ% iÔ0°Ô3°IÔ>×BÒBÀ<ÑPÔPˆ
ØbfÔbwð  cD�4œ:¥d¨4Ô+@×+FÒ+FÑ+HÔ+HÑ&IÔ&IÐX]Ð^Ñ^Ô^Ð^ð  JNÐØÔ  Ô)ˆØÔ(¨Ô1°/ÔBˆØÔ,¨WÔ5Ð6IÔJÐàˆ}Ø”Ý”Ñ(Ô(Ø ØÔ(ØØKXÐKd�$œ* ]ÀÐGÑGÔGÐGÐjnØEOÐE[•t”z *¸5ÐAÑAÔAÐAÐaeÝ”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ð ˜*Ô%ð 
/ð 
/ˆØÐ)Ñ)ˆØ—G’G‘I”Ið 	/ð 	/‰DˆAˆqÝ˜!�TÑ"Ô"ð .Øð >ð >�AØ—u’u˜V‘}”}¨Ò.Ð.Ø#¥{°1°V´9Ñ'=Ô'=Ñ=˜øð>ð �{¨1™~œ~Ñ-�Ø�FŠ{ˆ{Ø˜Ñ.�øð	/ð !×$Ò$ [Ñ1Ô1Ð1€yð 6Øð 	6ð 	6ˆAØ�;¥t¤z°!¡}¤}Ñ5Ô5Ñ5ˆKˆKð %×(Ò(¨Ñ9Ô9Ð9€}ð 6Ý�m¥TÑ*Ô*ð 	6Ø�;¥t¤z°-Ñ'@Ô'@ÑAÔAÑAˆKˆKà�; }Ñ5Ô5Ñ5ˆKð × Ò  Ñ)Ô)Ð)€uð 6Øð 	6ð 	6ˆAØ�;¥t¤z°!¡}¤}Ñ5Ô5Ñ5ˆKˆKà"×&Ò& }Ñ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Ô4ˆJà"Ÿš wÑ/Ô/Ð/ˆuð ?Ø % oÔ 6�Ø$)Ð*=Ô$>Ð!å�:˜iÔ(Ñ)Ô)¨QÒ.Ð.ààð 0˜W¨
Ð2Ð2Ø"Ÿš wÑ/Ô/�à˜yÔ)¨!Ô,¨WÔ5ˆEð �yŠy˜Ñ&Ô&ð <ØÐ%Ø!#�JØ˜Ô& qÔ)¨*Ô5×9Ò9¸&ÑAÔAð 	yØ×%Ò%Ø *à$)¨,Ô$7¸Ô$:¸:Ô$FÀvÔ$NØ)+ð%ð %ð'ð 'ñ ô ð ñ ð ˜<Ô(¨Ô+¨JÔ7×;Ò;¸KÑHÔHð yØ˜r”N :Ô.¨{Ð;Ð;Ô;¸uÀ\Ô?RÐSTÔ?UÐV`Ô?a×?eÒ?eÐfqÑ?rÔ?rÐ?xÐvxÑxÐ;Ð;Ñ;ùð —’˜?Ñ+Ô+ð <Ø Ð(Ø$&�MØ˜Ô)×-Ò-¨fÑ5Ô5ð VØ,1°/Ô,BÀ6Ô,J�M &Ñ)Ø13�M +Ñ.Ñ.Ø˜?Ô+×/Ò/°Ñ<Ô<ð VØ! +Ð.Ð.Ô.°%¸Ô2HÈÔ2UÑUÐ.Ð.Ñ.ùð  §¢¨9Ñ!5Ô!5Ð!;¸Ñ;�‘ð N[ÐMf�DœJ }À5ÐIÑIÔIÐIÐlpÐØGQÐG]�œ J¸UÐCÑCÔCÐCÐcgˆØbfÔbwð  cD�4œ:¥d¨4Ô+@×+FÒ+FÑ+HÔ+HÑ&IÔ&IÐX]Ð^Ñ^Ô^Ð^ð  JNÐð ˜AÒÐÐ!2°aÒ!7Ð!7Ý/°´Ô0IÑJÔJˆMàð ?Ý$/°Ñ$?Ô$?Ð!Ð!Ø"ð ?Ý$/Ð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�   € àØ+6À2Ð"FÐ"FÐY]ÐhiÐjÐjÐkØØ%Ø'Ø'(¸qÐRSÐTÐTð
ð 
ˆð Ø#,¨dÐ"3ÀfÐWXÐYÐYÐZØØ%Ø'Ø'(¸qÐRSÐ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¨   øè è € Ý‰gŒg×#Ò# O°WÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø Ô-×1Ò1°(Ñ;Ô;¸tÐCˆŒØŒ>ð 	KØÔ'×+Ò+Ð,<Ñ=Ô=ð <Ø9;�Ô$Ð%5Ñ6ØFJˆGÔ Ð!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Ð6Ø3K¸T¼\Ð3KÐ3KˆÔ Ñ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  ø€ € € € € ð ØØ37Ø59Ø#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   øè è € Ý‰gŒg×#Ò# O°WÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØÔ×#Ò#Ð$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  ø€ € € € € ð Ø!Ø!ØØØ37Ø59Ø#5Ø$7Ø+DØ!1ð'ð 'ð 'ð ð'ð ð	'ð
 ð'ð ð'ð Ð/Ô0ð'ð Ð1Ô2ð'ð !ð'ð "ð'ð %)ð'ð ð'ð -ð'ð 'ð 'ð 'ð 'ð 'ðB7°7ð 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]
ð ]
ð ]
ð ]
ð ]
Ð :ñ ]
ô ]
ð ]
ð@ð ð ð ð Ð+ñ ô ð ð 'Ð(;Ð=VÐXhÐ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   