o
    yqi                     @   s   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mZm	Z	 d dl
mZmZ d dlmZ ddlmZ ddlmZ g dZG d	d
 d
eZdd ZG dd dZdadd Zdd Zdd Zdd ZdddZedG dd deZdS )    N)AnyDictOptional)	BaseModelmodel_validator)Literal   )logging)class_requires_deps)fastdeploy-servervllm-serversglang-serverc                   @   sd   e Zd ZU dZed ed< dZee ed< dZ	e
ed< dZeeeef  ed< ed	d
dd ZdS )GenAIConfignative)r   r   r   r   backendN
server_url   max_concurrencyclient_kwargsafter)modec                 C   s.   | j tv r| jd u rtdt| j  d| S )Nz(`server_url` must not be `None` for the z	 backend.)r   SERVER_BACKENDSr   
ValueErrorreprself r   l/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddlex/inference/models/common/genai.pycheck_server_url'   s
   zGenAIConfig.check_server_url)__name__
__module____qualname__r   r   __annotations__r   r   strr   intr   r   r   r   r   r   r   r   r   r      s   
 r   c                 C   s   | d ur| j tv rdS dS )NFT)r   r   )Zgenai_configr   r   r   need_local_model0   s   r%   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_AsyncThreadManagerc                 C   s    d | _ d | _d| _t | _d S )NF)loopthreadstopped	threadingEvent_event_startr   r   r   r   __init__8   s   z_AsyncThreadManager.__init__c                    s@      rd S  fdd}tj|dd _ j   j  d S )Nc                      sT   t   _t  j  j  z j  W  j  d _d S  j  d _w )NT)	asyncionew_event_loopr'   set_event_loopr,   setrun_forevercloser)   r   r   r   r   	_run_loopB   s   




z,_AsyncThreadManager.start.<locals>._run_loopT)targetdaemon)
is_runningr*   Threadr(   startr,   wait)r   r4   r   r   r   r9   >   s   

z_AsyncThreadManager.startc                 C   sN   |   sd S | j| jj | jjdd | j rtd d | _d | _d S )N   timeoutz+Background thread did not terminate in time)	r7   r'   call_soon_threadsafestopr(   joinis_aliver	   warningr   r   r   r   r?   P   s   


z_AsyncThreadManager.stopc                 C   s"   |   stdt|| j}|S )NzEvent loop is not running)r7   RuntimeErrorr.   run_coroutine_threadsafer'   )r   corofuturer   r   r   	run_async[   s   z_AsyncThreadManager.run_asyncc                 C   s   | j d uo| j   o| j S N)r'   	is_closedr)   r   r   r   r   r7   b   s   z_AsyncThreadManager.is_runningN)r   r    r!   r-   r9   r?   rG   r7   r   r   r   r   r&   7   s    r&   c                   C   s   t d u rt a t S rH   )_async_thread_managerr&   r   r   r   r   get_async_manageri   s   rK   c                  C   s   t  } |  o|   S rH   )rK   r7   rI   managerr   r   r   is_aio_loop_readyp   s   rN   c                  C   s*   t  } |  s|   t| j d S d S rH   )rK   r7   r9   atexitregisterr?   rL   r   r   r   start_aio_loopu   s
   rQ   c                  C   s   t  } |  r|   d S d S rH   )rK   r7   r?   rL   r   r   r   close_aio_loop|   s   rR   Fc              
   C   s   t  }| st  td | std|| }|r |S z|j|dW S  tj	j
y:   td| d   tyN } z	td|   d }~ww )Ng?zFailed to start event loopr<   zTask timed out after z secondszTask failed with error: )rK   r7   rQ   timesleeprC   rG   result
concurrentfuturesTimeoutErrorr	   rB   	Exceptionerror)rE   return_futurer=   rM   rF   er   r   r   rG      s&   

rG   openaic                       sJ   e Zd Z	d fdd	Zedd Zddd	d
Zdd Zdd Z  Z	S )GenAIClientr   Nc                    sv   ddl m} t   || _|| _|d u rt|  dd}|| _d|vr(d|d< |dd|i|| _	t
| j| _d S )	Nr   )AsyncOpenAI
   r<   Zapi_keynullbase_urlr   )r]   r_   superr-   r   Z_max_concurrencyrG   _get_model_name_model_name_clientr.   	Semaphore
_semaphore)r   r   rb   r   Z
model_namekwargsr_   	__class__r   r   r-      s   
zGenAIClient.__init__c                 C   s   | j S rH   )rf   r   r   r   r   openai_client   s   zGenAIClient.openai_clientFr[   c                   s*    fdd}t |d j|d||dS )Nc               	      s\    j 4 I d H   jjjj| i |I d H W  d   I d H  S 1 I d H s'w   Y  d S rH   )rh   rf   ZchatZcompletionscreate)argsri   r   r   r   &_create_chat_completion_with_semaphore   s   

0zRGenAIClient.create_chat_completion.<locals>._create_chat_completion_with_semaphore)modelmessagesrm   r   )rG   re   )r   rr   r[   ri   rp   r   r   r   create_chat_completion   s   z"GenAIClient.create_chat_completionc                 C   s   t | j dd d S )N   r<   )rG   rf   r3   r   r   r   r   r3      s   zGenAIClient.closec              
      sN   z| j j I d H }W n ty  } ztd| |d }~ww |jd jS )Nz@Failed to get the model list from the OpenAI-compatible server: r   )rf   modelslistrY   rC   dataid)r   ru   r\   r   r   r   rd      s   zGenAIClient._get_model_name)r   N)
r   r    r!   r-   propertyrl   rs   r3   rd   __classcell__r   r   rj   r   r^      s    
r^   )FN)r.   rO   concurrent.futuresrV   r*   rS   typingr   r   r   Zpydanticr   r   Ztyping_extensionsr   utilsr	   Z
utils.depsr
   r   r   r%   r&   rJ   rK   rN   rQ   rR   rG   objectr^   r   r   r   r   <module>   s,   /
