
    ja!                        U d dl Z d dl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 h dZdZ G d de          Z G d	 d
          Zdaedz  ed<   defdZdej        defdZ	 	 	 	 	 	 d(deeeef                  dedz  dedededeeeef                  dz  deeeef         z  dz  deeef         eeeef         ddf         z  fdZ	 	 	 d)deeeef                  dee         dedz  dededeeef         eeeef         ddf         z  fdZ	 	 d*deee         z  dedz  d edeee                  fd!Z 	 	 d+d#ed$ee         dedz  d%edeeeef                  f
d&Z!deeeef                  fd'Z"dS ),    N)	GeneratorIterable)Any)RUIZHI_API_KEYRUIZHI_BASE_URLRUIZHI_EMBEDDING_MODELRUIZHI_RERANK_MODELRUIZHI_TEXT_MODEL>                    c            	       >     e Zd Zddededz  dedz  ddf fdZ xZS )RuizhiApiErrorNmessagestatus_coderesponse_textreturnc                 f    t                                          |           || _        || _        d S N)super__init__r   r   )selfr   r   r   	__class__s       9/home/longshao/multi-rider-rag/shared/ai/ruizhi_client.pyr   zRuizhiApiError.__init__   s1    !!!&*    )NN)__name__
__module____qualname__strintr   __classcell__)r   s   @r   r   r      sj        + + +#* +TWZ^T^ +jn + + + + + + + + + +r    r   c            	          e Zd ZddZdedededefdZdedeeef         deeeef         ddf         fd	Z	e
d
ee         deeeef         ddf         fd            Ze
dej        ddfd            Ze
deddfd            ZdS )_RuizhiClientr   Nc                     ddd}t           rdt            |d<   t          j        t          j        d          |t          j        dd	          d
          | _        d S )Nzapplication/jsonzgzip, deflate)zContent-TypezAccept-EncodingzBearer Authorization/g      N@g     r@)readF)base_urlheaderstimeoutverify)r   httpxClientr   rstripTimeout_client)r   r.   s     r   r   z_RuizhiClient.__init__   su    .  /
 
  	B'A'A'AGO$|$+C00M$U333	
 
 
r    methodpathkwargsc                 F   t          t          dz             D ]}	  | j        j        ||fi |}|j        t
          v r!|t          k     r|                     |           F|                     |           |                                c S # t          j
        t          j        t          j        f$ r=}|t          k    rt          d|           ||                     |           Y d }~d }~wt          j        $ r}t          d|           |d }~ww xY wt          d          )N   zRuizhi API request failed: z'Ruizhi API request failed after retries)range_MAX_RETRIESr5   requestr   _TRANSIENT_STATUS_CODES_sleep_raise_for_statusjsonr1   TimeoutExceptionNetworkErrorRemoteProtocolErrorr   	HTTPError)r   r6   r7   r8   attemptresponseexcs          r   r=   z_RuizhiClient.request0   sV   \A-.. 	S 	SGS/4</GGGG'+BBBwQ]G]G]KK(((&&x000}}&&&*E,>@YZ % % %l**()Ls)L)LMMSVVG$$$$$$$$? S S S$%H3%H%HIIsRS FGGGs*   AB	(B		&D/3C''D9DDjson_payloadc              #     K   d}t          t          dz             D ]I}	 | j                            d||          5 }|j        t
          v r-|t          k     r"|                     |           	 d d d            ]|                     |           |                     |	                                          D ]}d}|V  		 d d d             d S # 1 swxY w Y   # t          j        t          j        t          j        f$ r@}|s|t          k    rt          d|           ||                     |           Y d }~d }~wt          j        $ r}t          d|           |d }~ww xY wd S )NFr:   POSTrA   TzRuizhi API stream failed: )r;   r<   r5   streamr   r>   r?   r@   _iter_sse_chunks
iter_linesr1   rB   rC   rD   r   rE   )r   r7   rI   yieldedrF   rG   chunkrH   s           r   rM   z_RuizhiClient.streamB   s     \A-.. 	R 	RGR\((L(II X+/FFF7UaKaKaG,,,        **8444!%!6!6x7J7J7L7L!M!M $ $"&#                  *E,>@YZ % % % Vg55()Kc)K)KLLRUUG$$$$$$$$? R R R$%G#%G%GHHcQR	R 	RsS   C0C-C9AC?CC	CC	C&E$?5D::E$EE$linesc              #   h  K   | D ]}|                                 }|s|                    d          r|dd                                           }|dk    r d S 	 t          j        |          }n*# t          j        $ r}t          d|           |d }~ww xY wt          |t                    r|V  d S )Nzdata:   z[DONE]zInvalid Ruizhi stream chunk: )strip
startswithrA   loadsJSONDecodeErrorr   
isinstancedict)rR   raw_linelinerQ   rH   s        r   rN   z_RuizhiClient._iter_sse_chunksV   s       	 	H>>##D w'' (ABBx~~''xV
4((' V V V$%KT%K%KLLRUUV%&& 	 	s   A..B=BBrG   c                     | j         rd S |                                  t          |           }t          d| j         d| | j        | j                  )NzRuizhi API returned HTTP z: )r   r   )
is_successr,   _response_error_detailr   r   text)rG   details     r   r@   z_RuizhiClient._raise_for_statusg   sd     	F'11H(<HHHH ,"-
 
 
 	
r    rF   c                 :    t          j        dd| z  z             d S )Ng      ?r   )timesleep)rF   s    r   r?   z_RuizhiClient._sleeps   s!    
3!W*%&&&&&r    )r   N)r!   r"   r#   r   r$   r   r=   rZ   r   rM   staticmethodr   rN   r1   Responser@   r%   r?    r    r   r(   r(      sV       
 
 
 
&Hc H H H H H H H$R3 Rd38n R4PSUXPX>[_aeKeAf R R R R(  )DcNDRV<V2W    \  	
EN 	
t 	
 	
 	
 \	
 ' ' ' ' ' \' ' 'r    r(   r5   r   c                  :    t           t                      a t           S r   )r5   r(   rg   r    r   _get_clientri   {   s    //Nr    rG   c                    	 |                                  }n# t          $ r | j        d d         cY S w xY wt          |t                    r|                    d          }t          |t                    r&|                    d          }|rt          |          S |rt          |          S |                    d          }|rt          |          S t          |          d d         S )Nr   errorr   )rA   
ValueErrorr`   rY   rZ   getr$   )rG   payloadrk   r   s       r   r_   r_      s    #--// # # #}TcT""""# '4   
 G$$eT"" 	$ii	**G $7||# 	u::++i(( 	 w<<w<<s    33F   ffffff?messagesmodelrM   
max_tokenstemperaturetoolstool_choicec                     |pt           | |||d}|||d<   |||d<   t                      }|r|                    d|          S |                    dd|          S )N)rr   rq   rM   rs   rt   ru   rv   z/chat/completionsrK   rL   )r
   ri   rM   r=   )	rq   rr   rM   rs   rt   ru   rv   rn   clients	            r   chatry      s     ++ " G  !,]]F ;}}0':::>>&"5G>DDDr      kb_namesc                 x    d                     d |D                       }g | d|d}t          ||||          S )N c              3       K   | ]	}d | V  
dS )@Nrg   ).0names     r   	<genexpr>zchat_with_kb.<locals>.<genexpr>   s(      ::*d**::::::r    run)rolecontent)rr   rM   rs   )joinry   )rq   r{   rr   rM   rs   
kb_contentrag_messagess          r   chat_with_kbr      sR     :::::::JFXF*EEFLE&ZPPPPr       texts
dimensionsc                 
   |pt           | |d}t                                          dd|          }t          |t                    r|                    dg           ng }t          |t                    st          d          t          |d           }g }|D ]i}t          |t                    r(t          |                    d	          t                    st          d
          |	                    |d	                    j|S )N)rr   inputr   rK   z/embeddingsrL   dataz,Ruizhi embeddings response missing data listc                 \    t          | t                    r|                     dd          ndS )Nindexr   )rY   rZ   rm   )items    r   <lambda>zembedding.<locals>.<lambda>   s*    JtUYDZDZ,aDHHWa,@,@,@`a r    )key	embeddingz3Ruizhi embeddings response contains an invalid item)
r   ri   r=   rY   rZ   rm   listr   sortedappend)	r   rr   r   rn   rG   r   orderedvectorsr   s	            r   r   r      s    00  G
 }}$$V]$IIH'1(D'A'AI8<<###rDdD!! MKLLLTaabbbG!#G * *$%% 	XZ8M8Mt-T-T 	X !VWWWtK())))Nr    rT   query	documentstop_kc                 r   |pt           | ||d}t                                          dd|          }t          |t                    r|S t          |t
                    rK|                    d|                    dg                     }t          |t                    rd |D             S t          d          )	N)rr   r   r   r   rK   z/rerankrL   resultsr   c                 <    g | ]}t          |t                    |S rg   rY   rZ   r   r   s     r   
<listcomp>zrerank.<locals>.<listcomp>   s'    GGGT
40F0FGDGGGr    z+Ruizhi rerank response missing results list)r	   ri   r=   rY   r   rZ   rm   r   )r   r   rr   r   rn   rG   r   s          r   rerankr      s     --	 G }}$$VYW$EEH(D!! (D!! H,,y(,,vr*B*BCCgt$$ 	HGGWGGGG
F
G
GGr    c                      t                                          dd          } t          | t                    r7|                     dg           }t          |t
                    rd |D             S t          d          )NGETz/modelsr   c                 <    g | ]}t          |t                    |S rg   r   r   s     r   r   zlist_models.<locals>.<listcomp>   s'    DDDTZd-C-CDDDDDr    z(Ruizhi models response missing data list)ri   r=   rY   rZ   rm   r   r   )rG   r   s     r   list_modelsr      sw    }}$$UI66H(D!! E||FB''dD!! 	EDDTDDDD
C
D
DDr    )NFro   rp   NN)NFrz   )Nr   )NrT   )#rA   rc   collections.abcr   r   typingr   r1   shared.config.configr   r   r   r	   r
   r>   r<   RuntimeErrorr   r(   r5   __annotations__ri   rf   r$   r_   r   rZ   boolr%   floatry   r   r   r   r   rg   r    r   <module>r      s     / / / / / / / /                     >== + + + + +\ + + +Y' Y' Y' Y' Y' Y' Y' Y'x !%	 $ $ $]    U^     , )-/3E E4S>"E:E E 	E
 E S#X$&E tCH~%,E 
#s(^iS#Xd :;;E E E E< 	Q 	Q4S>"	Q3i	Q :	Q 		Q
 	Q 
#s(^iS#Xd :;;	Q 	Q 	Q 	Q  c?:  
$u+	   6 	H HHCyH :H 	H
 
$sCx.H H H H,ET$sCx.) E E E E E Er    