
     @gU                        d dl m Z  d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZ d dlZd dlmZmZmZmZmZ d d	lmZ d d
lmZmZmZmZm Z   ej!        e"          Z# G d d          Z$ G d de          Z% G d de          Z& G d de          Z' G d de           Z( G d de%          Z) G d de&          Z* G d de          Z+dS )    )datetimeN)ListUnion)uuid4)FastAPIRequest)JSONResponseResponse)EventSourceResponse)	ProxyBaseRequestFilterBaseResponseFilterBaseRequestFilterExceptionResponseFilterException)QueueClientBase)_AccessLogBaseRequestItemBaseResponseItemBaseStreamChunkItemBaseErrorItemBasec                       e Zd Zd ZdS )SessionInfoc                 (   t          t                                | _        d | _        d | _        d | _        d| _        d | _        d | _        d | _	        d| _
        d| _        d| _        i | _        t          j                    | _        | j        | _        d S )NFg        r   )strr   
request_idrequest_jsonrequest_headersrequest_urlstreamresponse_jsonresponse_bodyresponse_headersdurationduration_apistatus_code
extra_infotime
start_timestart_time_api)selfs    G/var/www/piapp/venv/lib/python3.11/site-packages/aiproxy/httpx_proxy.py__init__zSessionInfo.__init__   s    egg,, # "! $ )++"o    N)__name__
__module____qualname__r,    r-   r+   r   r      s#        . . . . .r-   r   c                   H     e Zd Zdededef fdZedefd            Z xZ	S )SessionRequestItemBaser   r   r   c                 \    t                                          |||           d | _        d S Nsuperr,   session)r*   r   r   r   	__class__s       r+   r,   zSessionRequestItemBase.__init__-   s*    \?CCC$(r-   r8   c                 L     | |j         |j        |j                  }||_        |S r5   )r   r   r   r8   clsr8   items      r+   from_sessionz#SessionRequestItemBase.from_session1   s*    s7%w';W=TUUr-   )
r.   r/   r0   r   dictr,   classmethodr   r>   __classcell__r9   s   @r+   r3   r3   ,   sy        )3 )d )T ) ) ) ) ) ) ;    [    r-   r3   c                   Z     e Zd Zddedededededed	df fd
Zede	fd            Z
 xZS )SessionResponseItemBaseNr   r   r    r"   r#   r$   r%   returnc                 b    t                                          ||||||           d | _        d S r5   r6   )r*   r   r    r"   r#   r$   r%   r9   s          r+   r,   z SessionResponseItemBase.__init__9   s3    ]4DhP\^ijjj$(r-   r8   c                 p     | |j         |j        |j        |j        |j        |j                  }||_        |S r5   )r   r    r"   r#   r$   r%   r8   r;   s      r+   r>   z$SessionResponseItemBase.from_session=   J    s7%w'<g>VX_Xhjqj~  AH  AT  U  Ur-   )Nr   r   r   r.   r/   r0   r   r?   floatintr,   r@   r   r>   rA   rB   s   @r+   rD   rD   8   s        ) )3 )t )t )fk )  @E )  X[ )  dh ) ) ) ) ) ) ;    [    r-   rD   c                   Z     e Zd Zddedededededed	df fd
Zede	fd            Z
 xZS )SessionStreamChunkItemBaseNr   r   response_contentr"   r#   r$   r%   rE   c                 b    t                                          ||||||           d | _        d S r5   r6   )r*   r   rN   r"   r#   r$   r%   r9   s          r+   r,   z#SessionStreamChunkItemBase.__init__E   s4    %57GS_almmm$(r-   r8   c                 p     | |j         |j        |j        |j        |j        |j                  }||_        |S r5   )r   r!   r"   r#   r$   r%   r8   r;   s      r+   r>   z'SessionStreamChunkItemBase.from_sessionI   rH   r-   )NNr   r   r   rI   rB   s   @r+   rM   rM   D   s        ) )3 )# )X\ )ot )  IN )  ad )  mq ) ) ) ) ) ) ;    [    r-   rM   c                   b     e Zd Zddedededededed	df fd
Zede	dedefd            Z
 xZS )SessionErrorItemBaseNr   r   	exceptiontraceback_infor    r"   r%   rE   c                 b    t                                          ||||||           d | _        d S r5   r6   )r*   r   rS   rT   r    r"   r%   r9   s          r+   r,   zSessionErrorItemBase.__init__Q   s2    YO_almmm$(r-   r8   c                 \     | |j         |||j        |j        |j                  }||_        |S r5   )r   r    r"   r%   r8   )r<   r8   rS   rT   r=   s        r+   r>   z!SessionErrorItemBase.from_sessionU   s?    s7%y.'BWY`Yqsz  tG  H  Hr-   )NNr   )r.   r/   r0   r   	Exceptionr?   rK   r,   r@   r   r>   rA   rB   s   @r+   rR   rR   P   s        ) )3 )9 )c )bf )  BF )  \_ )  hl ) ) ) ) ) ) ; 9 VY    [    r-   rR   c                       e Zd ZdedefdZdS )SessionRequestItemEssentialaccesslog_clsrE   c                      || j         t          j                    dd| j                            d          t          j        | j        j        d          | j        j	        d                   S )Nrequest utf-8Fensure_asciiresource_path)r   
created_at	directioncontentraw_bodyraw_headersmodel)
r   r   utcnowr   decodejsondumpsr8   r   r&   r*   rZ   s     r+   to_accesslogz(SessionRequestItemEssential.to_accesslog]   si    }((&--g66
4<#?eTTT,)/:
 
 
 	
r-   Nr.   r/   r0   r   rm   r1   r-   r+   rY   rY   \   s6        	
. 	
^ 	
 	
 	
 	
 	
 	
r-   rY   c                       e Zd ZdedefdZdS )SessionResponseItemEssentialrZ   rE   c                      || j         t          j                    d| j        dd d | j                            d          t          j        | j        d          | j	        j
        d         dd| j        | j                  S )	Nresponser]   r^   Fr_   ra   r   )r   rb   rc   r%   rd   function_call
tool_callsre   rf   rg   prompt_tokenscompletion_tokensrequest_timerequest_time_api)r   r   rh   r%   r    ri   rj   rk   r"   r8   r&   r#   r$   rl   s     r+   rm   z)SessionResponseItemEssential.to_accesslogj   s    }(( ('..w77
4#8uMMM,)/:!.
 
 
 	
r-   Nrn   r1   r-   r+   rp   rp   i   s6        
. 
^ 
 
 
 
 
 
r-   rp   c                       e Zd Zdddddddd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deef         fdZde	de
de
fdZdedefdZdej        defdZdefdZdefdZdefdZdej        defdZdej        dej        defdZded ed!e d"e	def
d#Z!d$e"fd%Z# xZ$S )&
HTTPXProxyg      N@N)timeoutrequest_filtersresponse_filtersrequest_item_classresponse_item_classstream_response_item_classerror_item_classr|   r}   r~   r   r   r   access_logger_queuec                    t                                          |||           || _        || _        || _        || _        || _        d| _        d| _        d| _	        d| _
        d S )N)r|   r}   r   	empty_urlz/path/to/chatempty_idPOST)r7   r,   r{   r~   r   r   r   api_base_urlapi_chat_resource_pathapi_service_idapi_chat_method)
r*   r{   r|   r}   r~   r   r   r   r   r9   s
            r+   r,   zHTTPXProxy.__init__   s     	+- 3 	 	
 	
 	
  ;M<O F`'6F'&5#(%r-   textrE   c                      t          d          )NzA'text_to_response_json' must be implemented to use request filterNotImplementedErrorr*   r   s     r+   text_to_response_jsonz HTTPXProxy.text_to_response_json   s    !"efffr-   c                      t          d          )NzC'text_to_response_chunks' must be implemented to use request filterr   r   s     r+   text_to_response_chunksz"HTTPXProxy.text_to_response_chunks   s    !"ghhhr-   r8   c                   K   | j         D ]2}|                    |j        |j        |j                   d {V x}r |                     |          |_        t          |j                  }|                     ||j                   t          |j
                  |_        | j                            | j                            |                     |j        r`dt"          t                   fd}t%           ||                     |                              }|                     ||j                   |c S |c S 4d S )Nr8   deltasc                *   K   | 2 3 d {V }|W V  6 d S r5   r1   )r   ds     r+   filter_response_streamz9HTTPXProxy.filter_request.<locals>.filter_response_stream   sD      '- $ $ $ $ $ $ $!"#GGGGG (.vvs   )r|   filterr   r   r   r   r    r	   add_response_headersr?   headersr"   r   putr   r>   r   listr   r   )r*   r8   fcompletion_contentjson_responser   sse_resps          r+   filter_requestzHTTPXProxy.filter_request   sp     % 	) 	)A+,88G4FH\^e^u+v+v%v%v%v%v%v%vv! )(,(B(BCU(V(V% ,W-B C C))-9KLLL+/0E+F+F( (,,,99'9JJ  
 > )$T$Z $ $ $ $  3..t/K/KL^/_/_``   H --h8JKKK#OOO )(((3)6 tr-   r   r    c                 b   K   | j         D ]$}|                    ||           d {V x}r|c S %|S r5   )r}   r   )r*   r   r    r   immediately_return_json_resps        r+   filter_responsezHTTPXProxy.filter_response   s_      & 	4 	4A56XXj-5X5X/X/X/X/X/X/XX+ 433334 r-   fastapi_requestc                    K   |                                  d {V |_        t          |j                                                  |_        t          |j                  |_        d S r5   )	rj   r   r?   r   itemsr   r   urlr   )r*   r   r8   s      r+   parse_requestzHTTPXProxy.parse_request   sd      %4%9%9%;%;;;;;;;"&'>'D'D'F'F"G"G!/"566r-   httpx_responsec                    K   t          |j                  |_        |j        |_        |j        s;|                                |_        t          j                    |j        z
  |_	        d S d S r5   )
r?   r   r"   r%   r   rj   r    r'   r)   r$   )r*   r   r8   s      r+   parse_responsezHTTPXProxy.parse_response   sk      #'(>#?#? ,8~ 	H$2$7$7$9$9G!#'9;;1G#GG   	H 	Hr-   c                     |j                             d          r|j         d= |j                             d          r
|j         d= d S d S )Nhostcontent-length)r   getr*   r8   s     r+   prepare_httpx_request_headersz(HTTPXProxy.prepare_httpx_request_headers   s\    "&&v.. 	0'/"&&'788 	:'(8999	: 	:r-   c                 4   |j                             d          r|j         d= |j                             d          r|j         d= |j                             d          r|j         d= |j                             d          r|j         d= |j        |j         d<   d S )Ndater   zcontent-encodingzcache-controlzX-AIProxy-Request-Id)r"   r   r   r   s     r+   prepare_httpx_response_headersz)HTTPXProxy.prepare_httpx_response_headers   s    #''// 	1(0#''(899 	;()9:#''(:;; 	=();<#''88 	:(9;B;M !7888r-   c                      | j         | j        z   S r5   )r   r   r   s     r+   make_urlzHTTPXProxy.make_url   s     4#>>>r-   async_clientc                    K   	 |j                                         }|                     |j        |j                    d {V }||k    r|n||_         t	          |j         |j        |j                  }t          j                    |j        z
  |_	        | j
                            | j                            |                     ||                                 d {V  S # |                                 d {V  w xY w)Nr   )r    copyr   r   r	   r%   r"   r'   r(   r#   r   r   r   r>   aclose)r*   r   r8   original_response_jsonfiltered_response_jsonr   s         r+   make_json_responsezHTTPXProxy.make_json_response   s2     	(%,%:%?%?%A%A"+/+?+?@RT[Ti+j+j%j%j%j%j%j%j">TXn>n>n$:$:  uKG! )%#( M  $y{{W-??G$(((55g5FF   ! %%'''''''''',%%''''''''''s   CC! !C=stream_responsec                 b      fd}t           |            j        j                  S )Nc            
        K   d_         	 d}                                 2 3 d {V }|                    d          }xj         |z  c_         |                    d          r-| |z                                                       d          }d} n| |z  } t|D ]}d}g }|                    d          D ]x}|                    d          r|dd                                          }4|                    d          r/|                    |dd                                                     y|r|d                    |          d	W V  d
d                    |          iW V  ͐E6 	 	 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]   r^   z


zevent:   zdata:   )eventdatar   zFailed in making log items: zresponse_content: )r!   	aiter_rawri   endswithstripsplit
startswithappendjoinr'   r(   r#   r)   r$   r   r   r   r>   rW   loggererror	traceback
format_excr   )chunk_bufferbchunkev
event_typedataslinenowexr   r*   r8   r   s            r+   process_streamz7HTTPXProxy.make_stream_response.<locals>.process_stream  s%     $&G!*0!.88:: = = = = = = =!HHW--E))U2))~~f-- !!-!5 < < > > D DV L L')$- # = =%'
 "$&HHTNN ? ?D#x88 ?-1!""X^^-=-=

!%!9!9 ? %T!""X^^-=-= > > >% =,6		%@P@P"Q"QQQQQQ#)499U+;+;"<<<<<<=  ;:4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   I3 E'E I3 *A#G I 
H5AH0+I 0H55I I03M=5A#KM
M #AL;6M;M  MM=M::M=r%   r   )r   r%   r"   )r*   r   r   r8   r   s   ```` r+   make_stream_responsezHTTPXProxy.make_stream_response  s_    ,	0 ,	0 ,	0 ,	0 ,	0 ,	0 ,	0 ,	0\ #N+,
 
 
 	
r-   r%   r   
error_typec                    dt          |          |di}t          ||          }|                     ||j                   | j                            | j                            ||t          j	                                         |S )Nr   )messagetype)r%   r8   rS   rT   )
r   r	   r   r   r   r   r   r>   r   r   )r*   r8   r%   r   r   kwargs	resp_jsonr   s           r+   make_error_responsezHTTPXProxy.make_error_response<  s    #b'':FFG	$YKHHH!!-1CDDD 	 $$T%:%G%G$/11 &H &
 &
 	 	 	 r-   appc                      |                     d j          j          j        g          dt          f fd            }|                     d j         dg d          dt          dt
          f fd            }d S )	N/)methodsr\   c           	        K   t                      }	                     | |           d {V  j                            j                            |                                         |           d {V x}r|S t          j                    |_        t          j
        j                  }	                     |           t          j        d                    |          |j        |j                  }|                    ||j                   d {V }                    ||           d {V                      |           |                                 n.# t,          $ r!}|                                 d {V  |d }~ww xY w|j        r                    |||          S                     ||           d {V S # t4          $ rX}t6                              d| dt;          j                                                    ||j         |d          cY d }~S d }~wtB          $ rX}t6                              d| dt;          j                                                    ||j         |d	          cY d }~S d }~wt          j"        $ rW}t6                              d
| dt;          j                                	 |j#        $                                }	n#  	 |j#        %                                 d {V }
tM          |
tN                    r|
(                    d          }
ntS          |
          }
tI          j*        |
          }	n#  ddddd}	Y nxY wY nxY w                    |           j                            j+                            ||t;          j                                         tY          |	|j#        j         |j-                  cY d }~S d }~wt,          $ rS}t6                              d
| dt;          j                                                    |d|d          cY d }~S d }~ww xY w)Nr{   r   )methodr   r   rj   )r\   r   Request filter error: r   request_filter_errorResponse filter error: response_filter_errorError at server: r^   r   
http_error!Failed in parsing error response.r   r   r   r   r   r     proxy_error).r   r   r   r   r~   r>   r   r'   r)   httpxAsyncClientr{   r   r   r   r   r   sendr   r   r   raise_for_statusrW   r   r   r   r   r   r   r   r   r   r%   r   HTTPStatusErrorrr   rj   aread
isinstancebytesri   r   loadsr   r	   r"   )r\   r8   filtered_responser   httpx_requestr   r   rfexhtexr   rd   r*   s              r+   handle_chat_requestz1HTTPXProxy.add_route.<locals>.handle_chat_requestM  sY     !mmGNQ((':::::::::(,,T-D-Q-QRY-Z-Z[[[ /3.A.A'.J.J(J(J(J(J(J(JJ$ -,,)-&  %0FFF	66w???$)MT]]SZE[E[ele|  DK  DX  %Y  %Y  %YM+7+<+<][b[i+<+j+j%j%j%j%j%j%jN--ngFFFFFFFFF77@@@"335555    &--/////////H > 
44$&   "&!8!8$" "        * i i iVdVVi>R>T>TVVWWW//9I4Qghhhhhhhh* j j jWtWWy?S?U?UWWXXX//9I4Qhiiiiiiii(   QQQ9M9O9OQQRRRG $ 2 2 4 4II	GG(,(;(;(=(="="="="="="=%gu55 3&-nnW&=&=GG&)'llG$(Jw$7$7		G-4  bE  @F  @F  %G  %G			33G<<<(,,T-B-O-O#"#,#7#9#9 .P . .    $ $ 9#4          Q Q QOOOy7K7M7MOOPPP//b-PPPPPPPPQs   A,G  2G 3B1E% $G %
F/FF G 1G 
QAH*$Q*Q7AJ
Q
Q1O/K)(O/)M+,A-MM+
M&$M+)B O/)Q/Q<AQ
Q
Qz/{resource_path:path})GETr   PUTDELETEOPTIONSHEADPATCHra   c           	      	  K   t                      }	 |                                  d {V |_        t          | j                                                  |_        t          | j                  |_	        d|z   |j
        d<   j                            t                              |                     t          j        j                  }	                     |           t          j        | j        j        dz   |z   |j        |j                  }|                    |           d {V }t          |j                  |_        |j        |_        |j        |_        t7          j                    |j        z
  |_                            |           |                                 tA          |j        |j        |j                  }t7          j                    |j!        z
  |_"        j                            tF                              |                     |S # tH          $ r!}|%                                 d {V  |d }~ww xY w# tL          $ rX}tN          (                    d| dtS          j*                                +                    ||j        |d	          cY d }~S d }~wtX          $ rX}tN          (                    d
| dtS          j*                                +                    ||j        |d          cY d }~S d }~wt          j-        $ rW}	tN          (                    d|	 dtS          j*                                	 |	j.        /                                }
n#  	 |	j.        0                                 d {V }tc          |td                    r|3                    d          }nt          |          }t_          j4        |          }
n#  ddddd}
Y nxY wY nxY w                    |           j                            j5                            ||	tS          j*                                         tm          |
|	j.        j        |j                  cY d }	~	S d }	~	wtH          $ rS}tN          (                    d| dtS          j*                                +                    |d|d          cY d }~S d }~ww xY w)Nr   ra   r   )r   r   r   r   )r\   r   r   r   r   r   r   r   r^   r   r   r   r   r   r   r   r   r   )7r   bodyr   r?   r   r   r   r   r   r   r&   r   r   rY   r>   r   r   r{   r   r   r   r   r   r"   r%   rd   r    r'   r)   r$   r   r   r
   r(   r#   rp   rW   r   r   r   r   r   r   r   r   r   rr   rj   r   r   r   ri   r  r   r	   )r\   ra   r8   r   r  r   rr   r   r  r  r   rd   r*   s               r+   handle_requestz,HTTPXProxy.add_route.<locals>.handle_request  ss     !mmGXQ-4\\^^';';';';';';$*.w/D/D/F/F*G*G'&)'+&6&6#69M6I"?3 (,,-H-U-UV]-^-^___  %0FFF66w???$)MTM^adMdgtMt  F  V  ]d  ]q  %r  %r  %rM+7+<+<]+<+S+S%S%S%S%S%S%SN 04N4J/K/KG,*8*DG',:,BG)+/9;;9O+OG(77@@@"33555  (-+0   H (,y{{W5G'GG$,004AA'ARR   $O    &--/////////H
 * i i iVdVVi>R>T>TVVWWW//9I4Qghhhhhhhh* j j jWtWWy?S?U?UWWXXX//9I4Qhiiiiiiii(   QQQ9M9O9OQQRRRG $ 2 2 4 4II	GG(,(;(;(=(="="="="="="=%gu55 3&-nnW&=&=GG&)'llG$(Jw$7$7		G-4  bE  @F  @F  %G  %G			33G<<<(,,T-B-O-O#"#,#7#9#9 .P . .    $ $ 9#4          Q Q QOOOy7K7M7MOOPPP//b-PPPPPPPPQs   B<I EH" "
I,III 
SAJ-'S-S:ALSS 1Q2M,+Q2,O./A-OO.
O)'O.,B Q2,S2S?ASSS)	api_router   r   r   r   r   )r*   r   r  r  s   `   r+   	add_routezHTTPXProxy.add_routeL  s   	M4.M0KMMX\XlWm	n	nQ	Qw Q	Q Q	Q Q	Q Q	Q Q	Q 
o	nQ	Qf 
G4.GGG  RN  RN  RN  
O  
O[	Q' [	Q# [	Q [	Q [	Q [	Q [	Q 
O  
O[	Q [	Q [	Qr-   )%r.   r/   r0   r   r   r   r   r   r,   r   r?   r   r   r   r   r   r	   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   rK   rW   r   r   r  rA   rB   s   @r+   rz   rz   ~   s        3759#'$(+/!%& & & /0	&
 12& !& "& %)& & -& & & & & &@g# g$ g g g giC iDJ i i i iK E$ViBi<j    > D T    77 7[ 7 7 7 7
H5> HK H H H H:[ : : : :
Nk 
N 
N 
N 
N? ? ? ? ?(U5F (Q\ ( ( ( (23
1B 3
UZUc 3
ny 3
 3
 3
 3
j; S i eh   xD     qQW qQ qQ qQ qQ qQ qQ qQ qQr-   rz   ),r   rj   loggingr'   r   typingr   r   uuidr   fastapir   r   fastapi.responsesr	   r
   sse_starlette.sser   r   aiproxy.proxyr   r   r   r   r   aiproxy.queueclientr   aiproxy.accesslogr   r   r   r   r   	getLoggerr.   r   r   r3   rD   rM   rR   rY   rp   rz   r1   r-   r+   <module>r     s                              $ $ $ $ $ $ $ $ 4 4 4 4 4 4 4 4 1 1 1 1 1 1  { { { { { { { { { { { { { { / / / / / / s s s s s s s s s s s s s s 
	8	$	$. . . . . . . .0	 	 	 	 	_ 	 	 		 	 	 	 	. 	 	 		 	 	 	 	!4 	 	 		 	 	 	 	= 	 	 	

 

 

 

 

"8 

 

 


 
 
 
 
#: 
 
 
*Q Q Q Q Q Q Q Q Q Qr-   