§
     @g€,  ã                   óf  — d dl m 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 d dlZd dl	m
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 G d„ de¦  «        Z  G d„ de¦  «        Z!eee e!gZ" G d„ de¦  «        Z#dS )é    )ÚdatetimeN)ÚList)ÚRequest)ÚStreamingResponseé   )ÚRequestFilterBaseÚResponseFilterBase)Ú
HTTPXProxyÚSessionInfoÚSessionRequestItemBaseÚSessionResponseItemBaseÚSessionStreamChunkItemBaseÚSessionErrorItemBase)Ú_AccessLogBase)ÚQueueClientBasec                   ó   — e Zd Zdedefd„ZdS )ÚGeminiRequestItemÚaccesslog_clsÚreturnc                 ó:  —  || j         t          j        ¦   «         d| j        d         d         d         d                              d¦  «        t          j        | j        d¬¦  «        t          j        | j        d¬¦  «        | j        j	        d	         ¬
¦  «        }|S )NÚrequestÚcontentséÿÿÿÿÚpartsr   ÚtextF©Úensure_asciiÚmodel)Ú
request_idÚ
created_atÚ	directionÚcontentÚraw_bodyÚraw_headersr   )
r   r   ÚutcnowÚrequest_jsonÚgetÚjsonÚdumpsÚrequest_headersÚsessionÚ
extra_info)Úselfr   Ú	accesslogs      úB/var/www/piapp/venv/lib/python3.11/site-packages/aiproxy/gemini.pyÚto_accesslogzGeminiRequestItem.to_accesslog   s’   € Ø!�MØ”Ý”Ñ(Ô(ØØÔ% jÔ1°"Ô5°gÔ>¸qÔA×EÒEÀfÑMÔMÝ”Z Ô 1ÀÐFÑFÔFÝœ
 4Ô#7ÀeÐLÑLÔLØ”,Ô)¨'Ô2ð
ñ 
ô 
ˆ	ð Ðó    N©Ú__name__Ú
__module__Ú__qualname__r   r0   © r1   r/   r   r      s6   € € € € € ð¨.ð ¸^ð ð ð ð ð ð r1   r   c                   ó   — e Zd Zdedefd„ZdS )ÚGeminiResponseItemr   r   c                 ó6  — d}d }| j         d         d         d         d         D ]4}|                     d¦  «        x}r|}|                     d¦  «        x}r|}Œ5| j        �:t          j        t          | j                             ¦   «         ¦  «        d¬	¦  «        nd } || j        t          j	        ¦   «         d
| j
        |d |�t          j        |d¬	¦  «        nd t          j        | j         d¬	¦  «        || j        j        d         dd| j        | j        ¬¦  «        S )NÚ Ú
candidatesr   r"   r   r   ÚfunctionCallFr   Úresponser   ©r   r    r!   Ústatus_coder"   Úfunction_callÚ
tool_callsr#   r$   r   Úprompt_tokensÚcompletion_tokensÚrequest_timeÚrequest_time_api)Úresponse_jsonr'   Úresponse_headersr(   r)   ÚdictÚitemsr   r   r%   r?   r+   r,   ÚdurationÚduration_api)r-   r   r"   rA   ÚpÚtÚfrG   s           r/   r0   zGeminiResponseItem.to_accesslog$   s;  € ØˆØˆ
ØÔ# LÔ1°!Ô4°YÔ?ÀÔHð 	ð 	ˆAØ—E’E˜&‘M”MÐ!ˆqð Ø�Ø—E’E˜.Ñ)Ô)Ð)ˆqð Ø�
øàbfÔbwð  cD�4œ:¥d¨4Ô+@×+FÒ+FÑ+HÔ+HÑ&IÔ&IÐX]Ð^Ñ^Ô^Ð^ð  JNÐàˆ}Ø”Ý”Ñ(Ô(Ø ØÔ(ØØØEOÐE[•t”z *¸5ÐAÑAÔAÐAÐaeÝ”Z Ô 2ÀÐGÑGÔGØ(Ø”,Ô)¨'Ô2ØØØœØ!Ô.ð
ñ 
ô 
ð 	
r1   Nr2   r6   r1   r/   r8   r8   #   s6   € € € € € ð
¨.ð 
¸^ð 
ð 
ð 
ð 
ð 
ð 
r1   r8   c                   ó   — e Zd Zdedefd„ZdS )ÚGeminiStreamResponseItemr   r   c                 óÒ  — t          j        | j        ¦  «        }d}g }|D ]x}d|v rr|d         D ]i}d|v rcd|d         v rY|d         d         D ]J}|                     d¦  «        x}r||z  }|                     d¦  «        x}	r|                     |	¦  «         ŒKŒjŒyt          |¦  «        dk    rt          j        |d¬	¦  «        nd }
| j        �:t          j        t          | j         	                    ¦   «         ¦  «        d¬	¦  «        nd } || j
        t          j        ¦   «         d
| j        ||
d t          j        |d¬	¦  «        || j        j        d         dd| j        | j        ¬¦  «        S )Nr:   r;   r"   r   r   r<   r   Fr   r=   r   r>   )r(   ÚloadsÚresponse_contentr'   ÚappendÚlenr)   rG   rH   rI   r   r   r%   r?   r+   r,   rJ   rK   )r-   r   rF   r"   Úfunction_callsÚchunkÚcandrL   r   r@   Úfunction_calls_strrG   s               r/   r0   z%GeminiStreamResponseItem.to_accesslogB   s¸  € Ýœ
 4Ô#8Ñ9Ô9ˆàˆØˆØ"ð 	Eð 	EˆEØ˜uÐ$Ð$Ø! ,Ô/ð Eð E�DØ  DÐ(Ð(¨W¸¸Y¼Ð-GÐ-GØ!% i¤°Ô!9ð Eð E˜AØ'(§u¢u¨V¡}¤}Ð4˜tð 0Ø '¨4¡ Ø01·²°nÑ0EÔ0EÐE˜}ð EØ .× 5Ò 5°mÑ DÔ DÐ Døøøõ PSÐSaÑObÔObÐefÒOfÐOf�TœZ¨ÀUÐKÑKÔKÐKÐlpÐØbfÔbwð  cD�4œ:¥d¨4Ô+@×+FÒ+FÑ+HÔ+HÑ&IÔ&IÐX]Ð^Ñ^Ô^Ð^ð  JNÐàˆ}Ø”Ý”Ñ(Ô(Ø ØÔ(ØØ,ØÝ”Z ¸EÐBÑBÔBØ(Ø”,Ô)¨'Ô2ØØØœØ!Ô.ð
ñ 
ô 
ð 	
r1   Nr2   r6   r1   r/   rP   rP   A   s6   € € € € € ð"
¨.ð "
¸^ð "
ð "
ð "
ð "
ð "
ð "
r1   rP   c                   ó   — e Zd ZdS )ÚGeminiErrorItemN)r3   r4   r5   r6   r1   r/   r[   r[   g   s   € € € € € Ø€Cr1   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defˆ fd„Zdej        dej        defd„Zˆ xZS )ÚGeminiProxyNg      N@)Úapi_keyÚtimeoutÚrequest_filtersÚresponse_filtersÚrequest_item_classÚresponse_item_classÚstream_response_item_classÚerror_item_classr^   r`   ra   rb   rc   rd   re   Úaccess_logger_queuec       	   
      ó’   •— t          ¦   «                              ||||||||	¬¦  «         || _        d| _        d| _        d| _        d S )N)r_   r`   ra   rb   rc   rd   re   rf   z)https://generativelanguage.googleapis.comz!/v1beta/models/{model_and_method}Úgoogleaistudio)ÚsuperÚ__init__r^   Úapi_base_urlÚapi_chat_resource_pathÚapi_service_id)r-   r^   r_   r`   ra   rb   rc   rd   re   rf   Ú	__class__s             €r/   rj   zGeminiProxy.__init__p   se   ø€ õ 	‰Œ×ÒØØ+Ø-Ø1Ø 3Ø'AØ-Ø 3ð 	ñ 		
ô 		
ð 		
ð ˆŒØGˆÔØ&IˆÔ#Ø.ˆÔÐÐr1   r   r   c           	      óh   — d|igddœdddddœd	ddœd
ddœdddœgdœgddddœd	ddœd
ddœdddœgidœS )Nr   r   ©r   ÚroleÚSTOPr   ÚHARM_CATEGORY_SEXUALLY_EXPLICITÚ
NEGLIGIBLE©ÚcategoryÚprobabilityÚHARM_CATEGORY_HATE_SPEECHÚHARM_CATEGORY_HARASSMENTÚHARM_CATEGORY_DANGEROUS_CONTENT©r"   ÚfinishReasonÚindexÚsafetyRatingsr~   )r;   ÚpromptFeedbackr6   )r-   r   s     r/   Útext_to_response_jsonz!GeminiProxy.text_to_response_json�   sª   € ð (.¨t nÐ%5¸wÐGÐGØ &Øà!BÐS_Ð`Ð`Ø!<È\ÐZÐZØ!;ÈLÐYÐYØ!BÐS_Ð`Ð`ð	"ð	
ð 
ð 
ð  Ø!BÐS_Ð`Ð`Ø!<È\ÐZÐZØ!;ÈLÐYÐYØ!BÐS_Ð`Ð`ð	"ðð
ð 
ð 	
r1   c           
      óª   — dddigddœdddœgi}dd|igddœddd	d
dœdd
dœdd
dœdd
dœgdœgi}dddigddœddd	d
dœdd
dœdd
dœdd
dœgdœgi}|||gS )Nr;   r   r:   r   rp   rr   r   )r"   r|   r}   rs   rt   ru   rx   ry   rz   r{   r6   )r-   r   Úfirst_chunkÚ
text_chunkÚ
last_chunks        r/   Útext_to_response_chunksz#GeminiProxy.text_to_response_chunks¤   sn  € àà% r˜l˜^Ø#ðð ð !'Øðð ð ð	
ˆð ð
  ððð
 $ðð ð !'Øð !BØ#/ðð ð
 !<Ø#/ðð ð
 !;Ø#/ðð ð
 !BØ#/ðð ð"ðð ðð!
ˆ
ðF ð
  ððð
 $ðð ð !'Øð !BØ#/ðð ð
 !<Ø#/ðð ð
 !;Ø#/ðð ð
 !BØ#/ðð ð"ðð ðð!
ˆ
ðD ˜Z¨Ð4Ð4r1   Úfastapi_requestr+   c              ƒ   óü   •K  — t          ¦   «                              ||¦  «        ƒ d {V —† dt          |j        ¦  «        v |_        t          j        d|j        ¦  «                             d¦  «        |j        d<   d S )Nz:streamGenerateContentzmodels/(.*?):r   r   )	ri   Úparse_requestÚstrÚrequest_urlÚstreamÚreÚsearchÚgroupr,   )r-   r†   r+   rn   s      €r/   rˆ   zGeminiProxy.parse_requestõ   s|   øè è € Ý‰gŒg×#Ò# O°WÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø1µS¸Ô9LÑ5MÔ5MÐMˆŒÝ&(¤iÐ0@À'ÔBUÑ&VÔ&V×&\Ò&\Ð]^Ñ&_Ô&_ˆÔ˜7Ñ#Ð#Ð#r1   c                 ó°   •— t          ¦   «                              |¦  «         | j        |j        d<   |j                             d¦  «        r
|j        d= d S d S )Nzx-goog-api-keyzaccept-encoding)ri   Úprepare_httpx_request_headersr^   r*   r'   )r-   r+   rn   s     €r/   r�   z)GeminiProxy.prepare_httpx_request_headersú   sa   ø€ Ý‰Œ×-Ò-¨gÑ6Ô6Ð6Ø48´LˆÔÐ 0Ñ1àÔ"×&Ò&Ð'8Ñ9Ô9ð 	;ØÔ'Ð(9Ð:Ð:Ð:ð	;ð 	;r1   c                 ó¦   •— t          ¦   «                              |¦  «        }|                     |j        d         dz   |j        rdndz   ¬¦  «        S )Nr   ú:ÚstreamGenerateContentÚgenerateContent)Úmodel_and_method)ri   Úmake_urlÚformatr,   r‹   )r-   r+   Úurlrn   s      €r/   r–   zGeminiProxy.make_url  s\   ø€ Ý‰gŒg×Ò˜wÑ'Ô'ˆØ�zŠzØ$Ô/°Ô8¸3Ñ>Ø.5¬nÐSÐ*Ð*ÐBSñUð ñ 
ô 
ð 	
r1   Úasync_clientÚstream_responsec                 ób   ‡ ‡‡‡— ˆˆ ˆˆfd„}t           |¦   «         ‰j        ‰j        ¬¦  «        S )Nc            
     óÒ  •K  — d‰_         	 ‰                     ¦   «         2 3 d {V —†} ‰xj         |                      d¦  «        z  c_         | W V — Œ06 	 	 t          j        ¦   «         }|‰j        z
  ‰_        |‰j        z
  ‰_        ‰j         	                    ‰j
                             ‰¦  «        ¦  «         nj# t          $ r]}t                               d|› dt          j        ¦   «         › �¦  «         t                               d‰j         › �¦  «         Y d }~nd }~ww xY w‰                     ¦   «         ƒ d {V —† d S # ‰                     ¦   «         ƒ d {V —† w xY w# 	 t          j        ¦   «         }|‰j        z
  ‰_        |‰j        z
  ‰_        ‰j         	                    ‰j
                             ‰¦  «        ¦  «         nj# t          $ r]}t                               d|› dt          j        ¦   «         › �¦  «         t                               d‰j         › �¦  «         Y d }~nd }~ww xY w‰                     ¦   «         ƒ d {V —† w # ‰                     ¦   «         ƒ d {V —† w xY wxY w)Nr:   zutf-8zFailed in making log items: ú
zresponse_content: )Úresponse_bodyÚ	aiter_rawÚdecodeÚtimeÚ
start_timerJ   Ústart_time_apirK   rf   Úputrd   Úfrom_sessionÚ	ExceptionÚloggerÚerrorÚ	tracebackÚ
format_excÚaclose)ÚbÚnowÚexr™   r-   r+   rš   s      €€€€r/   Úprocess_streamz8GeminiProxy.make_stream_response.<locals>.process_stream	  sî  øè è € Ø$&ˆGÔ!ð0à.×8Ò8Ñ:Ô:ð ð ð ð ð ð ð ˜!ØÐ)Ô)¨Q¯XªX°gÑ->Ô->Ñ>Ð)Ô)Ø�G�G�G�G�Gð  ;Ð:ð0Ýœ)™+œ+�CØ'*¨WÔ-?Ñ'?�GÔ$Ø+.°Ô1GÑ+G�GÔ(ØÔ,×0Ò0ØÔ7×DÒDÀWÑMÔMñô ð ð øõ !ð Oð Oð OÝ—L’LÐ!^ÀÐ!^Ð!^ÅiÔFZÑF\ÔF\Ð!^Ð!^Ñ_Ô_Ð_Ý—L’LÐ!M°gÔ6KÐ!MÐ!MÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð
 '×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ø˜,×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøð0Ýœ)™+œ+�CØ'*¨WÔ-?Ñ'?�GÔ$Ø+.°Ô1GÑ+G�GÔ(ØÔ,×0Ò0ØÔ7×DÒDÀWÑMÔMñô ð ð øõ !ð Oð Oð OÝ—L’LÐ!^ÀÐ!^Ð!^ÅiÔFZÑF\ÔF\Ð!^Ð!^Ñ_Ô_Ð_Ý—L’LÐ!M°gÔ6KÐ!MÐ!MÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð
 '×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ø˜,×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøøøs…   ŒE  A¦+E ÁA#B7 Â6D= Â7
DÃADÄD= ÄDÄD= Ä=EÅI&ÅA#GÇIÇ
H)ÇAH$ÈIÈ$H)È)IÈ,I&ÉI#É#I&)r?   Úheaders)r   r?   rG   )r-   r™   rš   r+   r¯   s   ```` r/   Úmake_stream_responsez GeminiProxy.make_stream_response  s^   øøøø€ ð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0õ2 !ØˆNÑÔØÔ+ØÔ,ð
ñ 
ô 
ð 	
r1   )r3   r4   r5   r   r8   rP   r[   r‰   r   r   r	   Útyper   rj   rH   r€   r…   r   r   rˆ   r�   r–   ÚhttpxÚAsyncClientÚResponser±   Ú__classcell__)rn   s   @r/   r]   r]   o   s»  ø€ € € € € ð ØØ37Ø59Ø#4Ø$6Ø+CØ!0ð/ð /ð /ð ð/ð
 Ð/Ô0ð/ð Ð1Ô2ð/ð !ð/ð "ð/ð %)ð/ð ð/ð -ð/ð /ð /ð /ð /ð /ð:
¨#ð 
°$ð 
ð 
ð 
ð 
ð.O5¨Cð O5°D¸´Jð O5ð O5ð O5ð O5ðb`°7ð `À[ð `ð `ð `ð `ð `ð `ð
;°[ð ;ð ;ð ;ð ;ð ;ð ;ð
 ð 
ð 
ð 
ð 
ð 
ð 
ð
°Ô1Bð 
ÐUZÔUcð 
Ðnyð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r1   r]   )$r   r(   ÚloggingrŒ   r¡   r©   Útypingr   r³   Úfastapir   Úfastapi.responsesr   Úproxyr   r	   Úhttpx_proxyr
   r   r   r   r   r   r.   r   Úqueueclientr   Ú	getLoggerr3   r§   r   r8   rP   r[   Úqueue_item_typesr]   r6   r1   r/   ú<module>rÀ      s5  ðØ Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ø 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Ñ	$Ô	$€ðð ð ð ð Ð.ñ ô ð ð
ð 
ð 
ð 
ð 
Ð0ñ 
ô 
ð 
ð<#
ð #
ð #
ð #
ð #
Ð9ñ #
ô #
ð #
ðLð ð ð ð Ð*ñ ô ð ð &Ð'9Ð;SÐUdÐeÐ ðw
ð w
ð w
ð w
ð w
�*ñ w
ô w
ð w
ð w
ð w
r1   