
    jv6                     V   U d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ  ee          Zdaej        dz  ed
<   dedej        fdZ G d d          Z G d de          Z G d de          Z G d d          Z da!de fdZ"dS )    N)Iterator)Any)Session)ExternalServiceErrorModelNotFoundErrorProviderNotConfiguredError)
LocalModel)ModelModelProvider)
get_logger)trace_llm_call_shared_http_clienttimeoutreturnc                     t           t           j        r*t          j        | t          j        dd                    a t           S )N   
   )max_connectionsmax_keepalive_connections)r   limits)r   	is_closedhttpxAsyncClientLimits)r   s    V/lsinfo/ai/hellotax_ai/base_platform/app/services/llm/backends/chat_backend_factory.py_get_shared_clientr      sF    "&9&C"#/EL_a$b$b$b
 
 
     c                       e Zd Z	 	 	 	 	 ddeeeef                  dedz  ded	ed
ededeee	f         fdZ
deee	f         defdZdeee	f         deeef         fdZdS )BaseChatClientNffffff?   FTmessagesmodeltemperature
max_tokensstreamenable_table_formatr   c                    K   t           NNotImplementedError)selfr"   r#   r$   r%   r&   r'   s          r   chat_completionzBaseChatClient.chat_completion!   s       "!r   api_responsec                     t           r)   r*   r,   r.   s     r   extract_response_textz$BaseChatClient.extract_response_text,   s    !!r   c                     ddddS )Nr   input_tokensoutput_tokenstotal_tokens r0   s     r   get_usage_infozBaseChatClient.get_usage_info/   s     !AqIIIr   Nr    r!   FT)__name__
__module____qualname__listdictstrfloatintboolr   r-   r1   r8   r7   r   r   r   r      s        
 ! $(	" 	"tCH~&	" Tz	" 		"
 	" 	" "	" 
c3h	" 	" 	" 	""$sCx. "S " " " "J4S> Jd38n J J J J J Jr   r   c                       e Zd Z	 ddedededefdZ	 	 	 	 	 ddee	e
e
f                  de
dz  dedededede	e
ef         fdZ	 ddee	e
e
f                  dedefdZde	e
ef         de
fdZde	e
ef         de	e
ef         f fdZ xZS )OpenAICompatibleChatClient        r@providerr#   max_retriesr   c                     |j         | _        |j        p|j        | _        |j        | _        |                                | _        |j	        p|j
        | _        || _        || _        d S r)   )name_provider_namebase_urldefault_base_url	_base_url	auth_type
_auth_typeget_api_key_api_keyremote_model_idcode_model_coderH   r   )r,   rG   r#   rH   r   s        r   __init__z#OpenAICompatibleChatClient.__init__5   sb     'm!*Gh.G", ,,.. 0>EJ&r   Nr    r!   FTr"   r$   r%   r&   r'   r   c           
        K   | j         }|st          | j                  ddi}| j        }	| j        dk    r|	r	d|	 |d<   n%| j        dk    r|	r|	|d<   n| j        dk    r|	r|	|d	<   |                    d
           d}
|p| j        ||||ddid}|p| j        }d }t          | j                  D ]}	 t          | j
                  }t          | j         d||          5 }|                    |
||           d {V }|                                 |                                }||                    di           }|                    |                    di g          d                             di                               dd          |                    dd          |                    dd          d           |cd d d            c S # 1 swxY w Y   3# t"          j        $ ri}|}t&                              d|dz    d
| j         d|            || j        dz
  k     r#t+          j        d|z             d {V  Y d }~Y d }~d }~wt"          j        $ r}|}|j        j        }d |cxk    rd!k     r_n n\|| j        dz
  k     rNt&                              d"| d#|dz    d
| j                    t+          j        d|z             d {V  Y d }~2t5          | j        d$| d|j        j                   |d }~wt"          j        $ ri}|}t&                              d%|dz    d
| j         d|            || j        dz
  k     r#t+          j        d|z             d {V  Y d }~Y d }~d }~wt:          $ r(}t5          | j        t=          |                    d d }~ww xY wt?          |t"          j                  rt5          | j        d&| j
         d'          t5          | j        d(| j         d)|           )*NContent-Typeapplication/jsonbearerBearer Authorizationapi_keyapi-key	x_api_key	X-API-Key//chat/completionsenable_thinkingFr#   r"   r$   r%   r&   chat_template_kwargsz/chat)rJ   r#   r"   headersjsonusagechoicesr   messagecontent prompt_tokenscompletion_tokens)inputoutput)rq   ri   zChat API timeout on attempt    z:    i  iX  zChat API server error z on attempt zHTTP z"Chat API request error on attempt zRequest timeout after szFailed after z
 retries: ) rN   r   rK   rR   rP   rstriprU   rangerH   r   r   r   postraise_for_statusrh   getupdater   TimeoutExceptionloggerwarningasynciosleepHTTPStatusErrorresponsestatus_coder   textRequestError	Exceptionr?   
isinstance)r,   r"   r#   r$   r%   r&   r'   rL   rg   r]   urlpayload
model_name
last_errorattemptclient
generationr   resultri   er   s                         r   r-   z*OpenAICompatibleChatClient.chat_completion@   s      > 	B,T-@AAA!#56-?h&&7&':':':GO$$_	))g)!(GI_+++#*GK %%888.d. &$%6$>
 
 .d.

T-.. 0	R 0	RG/R+DL99# /666$%   "  %+[[gG[%T%TTTTTTTH--///%]]__F!- &

7B 7 7"))#)::i"#>#>q#A#E#EiQS#T#T#X#XYbdf#g#g).?A)F)F*/))4G*K*K# # *    "#" " " " " " " " " " " " " " " " " " "$ )   
cgkccDL\cc`accdddT-111!-7
333333333HHHH 21111 (   
j4++++++++++$:JQ:N0N0NNNjjj'TU+jjX\Xhjj   "-7
333333333HHHH*')Q)Q)Q
)Q)Q  %   
^1^^tGW^^[\^^   T-111!-7
333333333HHHH 21111  R R R*4+>AGGTQRj%"899 	&#%Mdl%M%M%M   #!Y1A!Y!YZ!Y!Y
 
 	
sj   3.G"!C%GG"G	G"G	G""N21AIN2'A4L!&LN2AM==N2
#N--N2c                  K   | j         }|st          | j                  ddi}| j        }| j        dk    r|r	d| |d<   n%| j        dk    r|r||d<   n| j        dk    r|r||d	<   |                    d
           d}| j        |||dddid}t          | j                  }	|		                    d|||          4 d {V }
|

                                 |
                                2 3 d {V }|                    d          s|t          d          d                                          }|dk    r d d d           d {V  d S 	 t          j        |          }|d         d                             di           }|                    dd          }|r|W V  # t          j        t&          t(          f$ r Y w xY w6 	 d d d           d {V  d S # 1 d {V swxY w Y   d S )NrX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   Trc   Frd   POSTrf   zdata:z[DONE]rj   r   deltarl   rm   )rN   r   rK   rR   rP   ru   rU   r   r   r&   rx   aiter_lines
startswithlenstriprh   loadsry   JSONDecodeErrorKeyError
IndexError)r,   r"   r$   r%   rL   rg   r]   r   r   r   r   linedata
chunk_datar   r   s                   r   async_stream_completionz2OpenAICompatibleChatClient.async_stream_completion   s!      > 	B,T-@AAA!#56-?h&&7&':':':GO$$_	))g)!(GI_+++#*GK %%888% &$%6$>
 
 $DL11==gG=LL 	 	 	 	 	 	 	PX%%'''&2244       dw// CLLNN+11338##	 	 	 	 	 	 	 	 	 	 	 	 	 	!%D!1!1J&y1!488"EEE 99Y33D #"



,h
C   H 54	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sD   )G*G0AGAFGF>;G=F>>G
G #G r.   c                 v   	 |                     dg           }|rj|d                              di           }|                     dd          }t          |t                    rd                    d |D                       S |pdS dS # t          $ r(}t
                              d|            Y d }~d	S d }~ww xY w)
Nrj   r   rk   rl   rm   c              3   l   K   | ]/}t          |t                    |                    d d          V  0dS )r   rm   N)r   r>   ry   ).0parts     r   	<genexpr>zCOpenAICompatibleChatClient.extract_response_text.<locals>.<genexpr>   sT       # #15JtUYDZDZ#,,# # # # # #r   z$Sorry, I cannot generate a response.z!Failed to extract response text: z7Sorry, an error occurred while processing the response.)ry   r   r=   joinr   r|   error)r,   r.   rj   rk   rl   r   s         r   r1   z0OpenAICompatibleChatClient.extract_response_text   s    	M"&&y"55G %!!*..B77!++i44gt,, 77 # #9@# # #    }"$99 	M 	M 	MLL@Q@@AAALLLLLL	Ms   A=B  B 
B8B33B8c                    	 |                     di           }|                     d|                     dd                    }|                     d|                     dd                    }|                     d||z             }|||dS # t          $ rH}t                              d	|            t	                                          |          cY d }~S d }~ww xY w)
Nri   rn   r4   r   ro   r5   r6   r3   zFailed to get usage info: )ry   r   r|   r   superr8   )r,   r.   ri   rn   ro   r6   r   	__class__s          r   r8   z)OpenAICompatibleChatClient.get_usage_info   s    	8 $$Wb11E!IIouyyQR7S7STTM %		*=uyyZ[?\?\ ] ] 99^]EV5VWWL -!2 ,  
  	8 	8 	8LL9a99:::77)),77777777	8s   BB 
C=CCC)rE   rF   r9   r    r!   )r:   r;   r<   r   r
   rA   r@   rV   r=   r>   r?   rB   r   r-   r   r1   r8   __classcell__)r   s   @r   rD   rD   3   s        ]b	 	%	.3	BE	TY	 	 	 	 ! $(V
 V
tCH~&V
 TzV
 	V

 V
 V
 "V
 
c3hV
 V
 V
 V
r [_' 'T#s(^,';@'TW' ' ' 'RM$sCx. MS M M M M 84S> 8d38n 8 8 8 8 8 8 8 8 8 8r   rD   c                      e Zd ZdefdZ	 	 	 	 	 ddeeeef                  d	edz  d
ede	de
de
deeef         fdZ	 ddeeeef                  d
ede	dee         fdZ	 ddeeeef                  d
ede	fdZdeeef         defdZdS )LocalAssetChatClientlocal_modelc                     || _         d S r)   )r   )r,   r   s     r   rV   zLocalAssetChatClient.__init__   s    &r   Nr    r!   FTr"   r#   r$   r%   r&   r'   r   c           
        K   ddl m} g }d}	|D ]S}
|
                    d          }|
                    dd          }|dk    r|r|                    |           K|dk    r|}	T|                    | j        j        | j        j        |	||d                    |          	                                pd 	          }d
d|digi dS )Nr   local_chat_servicerm   rolerl   systemuser


identifier
model_pathpromptr%   r$   system_promptrk   	assistant)r   rl   )rj   ri   )
#app.services.llm.local_chat_servicer   ry   appendgenerate_responser   r   r   r   r   )r,   r"   r#   r$   r%   r&   r'   r   system_partsuser_promptrk   r   rl   response_texts                 r   r-   z$LocalAssetChatClient.chat_completion   s
      	KJJJJJ"$ 	& 	&G;;v&&Dkk)R00GxG##G,,,,%*<<'2'2!# ++l3399;;Ct = 
 
 #[]$S$STU
 
 	
r   c           
      n   ddl m} g }d}|D ]S}|                    d          }|                    dd          }	|dk    r|	r|                    |	           K|dk    r|	}T|                    | j        j        | j        j        |||d                    |          	                                pd 	          S 
Nr   r   rm   r   rl   r   r   r   r   )
r   r   ry   r   generate_response_streamr   r   r   r   r   )
r,   r"   r$   r%   r   r   r   rk   r   rl   s
             r   stream_completionz&LocalAssetChatClient.stream_completion  s     	KJJJJJ"$ 	& 	&G;;v&&Dkk)R00GxG##G,,,,%!::'2'2!# ++l3399;;Ct ; 
 
 	
r   c           
       K   ddl m} g }d}|D ]S}|                    d          }|                    dd          }	|dk    r|	r|                    |	           K|dk    r|	}T|                    | j        j        | j        j        |||d                    |          	                                pd 	          }
|
D ]!}|W V  t          j        d           d {V  "d S r   )r   r   ry   r   r   r   r   r   r   r   r~   r   )r,   r"   r$   r%   r   r   r   rk   r   rl   r&   chunks               r   r   z,LocalAssetChatClient.async_stream_completion  s0      	KJJJJJ #% 	& 	&G;;v&&Dkk)R00GxG##G,,,,%#<<'2'2!# ++l3399;;Ct = 
 
  	# 	#EKKKK-""""""""""	# 	#r   r.   c                 Z    	 |d         d         d         d         S # t           $ r Y dS w xY w)Nrj   r   rk   rl   rm   )r   r0   s     r   r1   z*LocalAssetChatClient.extract_response_text9  sC    		*1-i8CC 	 	 	22	s    
**r9   r   )r:   r;   r<   r	   rV   r=   r>   r?   r@   rA   rB   r   r-   r   r   r   r1   r7   r   r   r   r      sw       'J ' ' ' ' ! $(
 
tCH~&
 Tz
 	

 
 
 "
 
c3h
 
 
 
D [_
 
T#s(^,
;@
TW
	#
 
 
 
0 [_# #T#s(^,#;@#TW# # # #6$sCx. S      r   r   c                   <    e Zd ZdededefdZdedededz  fdZ	dS )ChatBackendFactorymodel_iddbr   c                 d   |                     t                                        t          j        |k                                              }|st          |          |j        }|st          dd|           |j        dv rt          ||          S t          |j
        d|j                   )NchatzProvider not found for model >   openaiopenai_compatible)rG   r#   zUnsupported chat protocol: )queryr
   filteridfirstr   rG   r   protocolrD   rJ   )r,   r   r   r#   rG   s        r   
get_clientzChatBackendFactory.get_clientB  s    &&ux8';<<BBDD 	/$X...> 	[&v/Yx/Y/YZZZ ???-xuMMMM"8=2cPXPa2c2cdddr   r   Nc                     |                     t                                        t          j        |k    t          j        dk    t          j                                                   }|sd S t          |          S )Nactive)r   r	   r   r   status
is_deletedr   r   )r,   r   r   r   s       r   get_local_asset_clientz)ChatBackendFactory.get_local_asset_clientM  sn     HHZ  V%3!X-)) 
 UWW 	  	4#K000r   )
r:   r;   r<   rA   r   r   r   r?   r   r   r7   r   r   r   r   @  su        	e3 	eG 	e 	e 	e 	e 	e11#*1		$1 1 1 1 1 1r   r   c                  :    t           t                      a t           S r)   )_chat_factoryr   r7   r   r   get_chat_factoryr   a  s    *,,r   )#r~   rh   collections.abcr   typingr   r   sqlalchemy.ormr   app.core.exceptionsr   r   r   app.models.local_modelr	   app.models.providerr
   r   common_loggingr   common_langfuser   r:   r|   r   r   __annotations__r@   r   r   rD   r   r   r   r   r7   r   r   <module>r      s     $ $ $ $ $ $        " " " " " " d d d d d d d d d d - - - - - - 4 4 4 4 4 4 4 4 % % % % % % * * * * * *	H		 15 U&- 4 4 4 %*;    J J J J J J J J(k8 k8 k8 k8 k8 k8 k8 k8\\ \ \ \ \> \ \ \~1 1 1 1 1 1 1 1< ,      r   