o
    Q5i                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZ d dlmZmZmZ d dlmZ e	rFd dlmZ dd	 Zed
ZG dd dZG dd dZeejG dd deZdS )    N)Future)partial)TYPE_CHECKING	AwaitableCallableIteratorOptionalTypeVarUnion)AsyncEmbeddingEngineAsyncEngineArray
EngineArgs)logger)r   c                     s    fdd}|S )Nc                    s$   d  | jd ur| jnd | _| S )N )join__doc__)fndocstr f/lsinfo/ai/hellotax_ai/llm_service/venv_embed/lib/python3.10/site-packages/infinity_emb/sync_engine.pydocstring_decorator   s    z1add_start_docstrings.<locals>.docstring_decoratorr   )r   r   r   r   r   add_start_docstrings   s   r   Tc                   @   s^   e Zd ZdddZdefddZdd	 Zd
d Zdd Zde	de
e f dee fddZdS )_AsyncLifeMixinreturnNc                 C   s:   t  | _t  | _d | _t | _| jd  | 	  d S N)
	threadingLock_AsyncLifeMixin__lockEvent_AsyncLifeMixin__stop_signal_AsyncLifeMixin__loopr   _AsyncLifeMixin__is_closed
set_result
start_loopselfr   r   r   __init__(   s   

z_AsyncLifeMixin.__init__start_eventc                    sV   t   _t  j  fdd} j|   j   jd t	d dS )z=private function, takes care of starting, stopping event loopc                      sB   t d d   j stdI d H   j rd S d S )NzStarted Background Event Loopg?)r   infor$   r!   is_setasynciosleepr   r'   r)   r   r   block_until_engine_stop6   s   


zA_AsyncLifeMixin.__async_lifetime.<locals>.block_until_engine_stopNzClosed Background Event Loop)
r,   new_event_loopr"   set_event_looprun_until_completecloser#   r$   r   r*   )r'   r)   r/   r   r.   r   __async_lifetime1   s   

z _AsyncLifeMixin.__async_lifetimec                 C   s    | j   o| jd uo| j S r   )r!   r+   r"   
is_runningr&   r   r   r   is_async_loop_runningA   s
   z%_AsyncLifeMixin.is_async_loop_runningc                 C   sp   |    | j' t }| j  t | _tjt| j	|ddd
  |  W d    d S 1 s1w   Y  d S )N)r)   T)targetdaemon)
close_loopr   r   r!   clearr#   r   Threadr   _AsyncLifeMixin__async_lifetimestartresultr.   r   r   r   r%   H   s   

"z_AsyncLifeMixin.start_loopc                 C   s@   | j  | j  | j  W d   dS 1 sw   Y  dS )z.closes the event loop. This is a blocking callN)r   r!   setr#   r>   r&   r   r   r   r9   T   s   
"z_AsyncLifeMixin.close_loopasync_function.c                 O   s,   |   stdt||i || j}|S )`  run an async function in the background event loop.

        Args:
            async_function: the async function to run
            funcion_args: args to pass to the async function
            function_kwargs: kwargs to pass to the async function

        Returns:
            concurrent.futures.Future returning the result of async_function.
        zEvent loop is not running)r6   RuntimeErrorr,   run_coroutine_threadsafer"   )r'   r@   funcion_argsfunction_kwargsfuturer   r   r   	async_runZ   s   z_AsyncLifeMixin.async_runr   N)__name__
__module____qualname__r(   r   r<   r6   r%   r9   r   r   r   rG   r   r   r   r   r   '   s    
	r   c                   @   s8   e Zd Zd	ddZdedee f dee fddZdS )
WeakAsyncLifeMixinr   Nc                 C   s   t  | _t| | jj d S r   )r   "_WeakAsyncLifeMixin__asynlifemixinweakreffinalizer9   r&   r   r   r   r(   s   s   zWeakAsyncLifeMixin.__init__r@   .c                 O   s   | j j|g|R i |S )rA   )rM   rG   )r'   r@   rD   rE   r   r   r   rG   w   s   zWeakAsyncLifeMixin.async_runrH   )	rI   rJ   rK   r(   r   r   r   r   rG   r   r   r   r   rL   r   s    
rL   c                       st  e Zd Zdee f fddZedee dd fddZedd	 Z	de
d
 fddZdd Zeejjdddedee dee fddZeejjddddededee dedee f
ddZeejjdddedee defdd Zeejjddded!eeeef  dee fd"d#Zeejjddded$eeeef  dee fd%d&Zd'd( Z  ZS ))SyncEngineArray_engine_args_arrayc                    s`   t    t|| _| | jj  t	| jt	| j  fdd}t
| j| d S )Nc                     s4    }   }| d ur|| j   td d S d S )Ng      ?)astopr>   timer-   )enginerun_refasync_run_ref
engine_refr   r   finalize_fn   s   z-SyncEngineArray.__init__.<locals>.finalize_fn)superr(   r   	from_argsasync_engine_arrayrG   astartr>   rN   refrO   )r'   rQ   rY   	__class__rV   r   r(      s   
zSyncEngineArray.__init__engine_args_arrayr   c                 C   s
   | |dS )N)rQ   r   )clsra   r   r   r   r[      s   
zSyncEngineArray.from_argsc                 C   s   | j jS r   )r\   r5   r&   r   r   r   r5      s   zSyncEngineArray.is_runningr   c                 C   s
   t | jS r   )iterr\   r&   r   r   r   __iter__   s   
zSyncEngineArray.__iter__c                 C   s   |  | jj  dS )z"blocks until the engine is stoppedN)rG   r\   rR   r>   r&   r   r   r   stop   s   zSyncEngineArray.stopN)matryoshka_dimmodel	sentencesrf   c                C      | j | jj|||dS )"sync interface of AsyncEngineArray)rg   rh   rf   )rG   r\   embed)r'   rg   rh   rf   r   r   r   rk         zSyncEngineArray.embedF)
raw_scorestop_nquerydocsrm   rn   c                C   s   | j | jj|||||dS )rj   )rg   ro   rp   rm   rn   )rG   r\   rerank)r'   rg   ro   rp   rm   rn   r   r   r   rq      s   zSyncEngineArray.rerank)rm   c                C   ri   )rj   )rg   rh   rm   )rG   r\   classify)r'   rg   rh   rm   r   r   r   rr      rl   zSyncEngineArray.classifyimagesc                C   ri   )rj   )rg   rs   rf   )rG   r\   image_embed)r'   rg   rs   rf   r   r   r   rt         zSyncEngineArray.image_embedaudiosc                C   ri   )rj   )rg   rv   rf   )rG   r\   audio_embed)r'   rg   rv   rf   r   r   r   rw      ru   zSyncEngineArray.audio_embedc                 C   s   |    d S r   )re   r&   r   r   r   __del__   s   zSyncEngineArray.__del__)rI   rJ   rK   listr   r(   classmethodr[   propertyr5   r   rd   re   r   r   rk   r   strr   intrq   boolrr   rt   r
   bytesrw   rx   __classcell__r   r   r_   r   rP      sZ    

&
	
"
	
rP   )r,   r   rS   rN   concurrent.futuresr   	functoolsr   typingr   r   r   r   r   r	   r
   infinity_emb.enginer   r   r   infinity_emb.log_handlerr   infinity_embr   r   r   rL   r   rP   r   r   r   r   <module>   s"   $K