
     @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"5g>qAEEfMMZ 1FFF
4#7e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!4Y?H 	 	AEE&MM!q EE.)))q 
bfbw  cD4:d4+@+F+F+H+H&I&IX]^^^^  JN}(( (EOE[tz*5AAAAae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|                    |	           Kjyt          |          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'(uuV}}4t 0 '401n0E0EE} E . 5 5m D D D PSSaObObefOfOfTZUKKKKlpbfbw  cD4:d4+@+F+F+H+H&I&IX]^^^^  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     (.tn%5wGG &!BS_``!<\ZZ!;LYY!BS_``	"	
 
 
  !BS_``!<\ZZ!;LYY!BS_``	"
 
 	
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   %rl^#  !'  	
 
 
 $  !' !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|      gg##OW=========1S9L5M5MM&(i0@'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648L 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\    ggw''zz$/83>.5n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::       !))QXXg->->>))GGGGG  ;:0)++C'*W-?'?G$+.1G+GG(,007DDWMM    ! O O OLL!^!^!^iFZF\F\!^!^___LL!Mg6K!M!MNNNNNNNNO
 '--///////////,--//////////0)++C'*W-?'?G$+.1G+GG(,007DDWMM    ! O O OLL!^!^!^iFZF\F\!^!^___LL!Mg6K!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 	02 !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        3759#4$6+C!0/ / / /
 /0/ 12/ !/ "/ %)/ / -/ / / / / /:
# 
$ 
 
 
 
.O5C O5DJ O5 O5 O5 O5b`7 `[ ` ` ` ` ` `
;[ ; ; ; ; ; ;
 
 
 
 
 
 

1B 
UZUc 
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;SUde w
 w
 w
 w
 w
* w
 w
 w
 w
 w
r1   