
    9i                         S SK r S SKrS SKrS SKrS SKrS SKJrJrJ	r	  S SK
JrJr  S SKJr  SSKJr  SSKJr  / SQr " S	 S
\5      rS r " S S5      rSqS rS rS rS rSS jr\" S5       " S S\5      5       rg)    N)AnyDictOptional)	BaseModelmodel_validator)Literal   )logging)class_requires_deps)fastdeploy-servervllm-serversglang-serverc                       \ rS rSr% Sr\S   \S'   Sr\\	   \S'   Sr
\\S'   Sr\\\	\4      \S	'   \" S
S9S 5       rSrg)GenAIConfig   native)r   r   r   r   backendN
server_url   max_concurrencyclient_kwargsafter)modec                     U R                   [        ;   a/  U R                  c"  [        S[	        U R                   5       S35      eU $ )Nz(`server_url` must not be `None` for the z	 backend.)r   SERVER_BACKENDSr   
ValueErrorreprselfs    e/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/paddlex/inference/models/common/genai.pycheck_server_urlGenAIConfig.check_server_url'   sA    <<?*t/F:4;M:NiX       )__name__
__module____qualname____firstlineno__r   r   __annotations__r   r   strr   intr   r   r   r   r!   __static_attributes__r$   r#   r    r   r      s_     WRS  !%J$OS.2M8DcN+2'" #r#   r   c                 4    U b  U R                   [        ;   a  gg)NFT)r   r   )genai_configs    r    need_local_modelr/   0   s    L$8$8O$Kr#   c                   2    \ rS rSrS rS rS rS rS rSr	g)	_AsyncThreadManager7   c                 b    S U l         S U l        SU l        [        R                  " 5       U l        g )NF)loopthreadstopped	threadingEvent_event_startr   s    r    __init___AsyncThreadManager.__init__8   s&    	%OO-r#   c                    ^  T R                  5       (       a  g U 4S jn[        R                  " USS9T l        T R                  R	                  5         T R
                  R                  5         g )Nc                  r  > [         R                  " 5       T l        [         R                  " T R                  5        T R                  R                  5          T R                  R                  5         T R                  R                  5         ST l        g ! T R                  R                  5         ST l        f = f)NT)	asyncionew_event_loopr4   set_event_loopr9   setrun_forevercloser6   r   s   r    	_run_loop,_AsyncThreadManager.start.<locals>._run_loopB   sz    ..0DI""499-!!#$		%%'		!# 		!#s   B #B6T)targetdaemon)
is_runningr7   Threadr5   startr9   wait)r   rD   s   ` r    rJ   _AsyncThreadManager.start>   sP    ??	$  &&iE r#   c                 F   U R                  5       (       d  g U R                  R                  U R                  R                  5        U R                  R                  SS9  U R                  R                  5       (       a  [        R                  " S5        S U l        S U l        g )N   timeoutz+Background thread did not terminate in time)	rH   r4   call_soon_threadsafestopr5   joinis_aliver
   warningr   s    r    rR   _AsyncThreadManager.stopP   so      		&&tyy~~6#;;!!OOIJ	r#   c                     U R                  5       (       d  [        S5      e[        R                  " XR                  5      nU$ )NzEvent loop is not running)rH   RuntimeErrorr>   run_coroutine_threadsafer4   )r   corofutures      r    	run_async_AsyncThreadManager.run_async[   s4      :;;11$		Br#   c                     U R                   S L=(       a7    U R                   R                  5       (       + =(       a    U R                  (       + $ N)r4   	is_closedr6   r   s    r    rH   _AsyncThreadManager.is_runningb   s2    yy$WTYY-@-@-B)BW4<<GWWr#   )r9   r4   r6   r5   N)
r%   r&   r'   r(   r:   rJ   rR   r\   rH   r,   r$   r#   r    r1   r1   7   s    .!$	Xr#   r1   c                  0    [         c
  [        5       q [         $ r_   )_async_thread_managerr1   r$   r#   r    get_async_managerrd   i   s    $ 3 5  r#   c                  n    [        5       n U R                  5       =(       a    U R                  5       (       + $ r_   )rd   rH   r`   managers    r    is_aio_loop_readyrh   p   s*    !G;(9(9(;$;;r#   c                      [        5       n U R                  5       (       d1  U R                  5         [        R                  " U R
                  5        g g r_   )rd   rH   rJ   atexitregisterrR   rf   s    r    start_aio_looprl   u   s7    !G%  r#   c                  d    [        5       n U R                  5       (       a  U R                  5         g g r_   )rd   rH   rR   rf   s    r    close_aio_looprn   |   s'    !G r#   c                    [        5       nUR                  5       (       d   [        5         [        R                  " S5        UR                  5       (       d  [        S5      eUR                  U 5      nU(       a  U$  UR                  US9$ ! [        R                  R                   a    [        R                  " SU S35        e [         a  n[        R                  " SU 35        e S nAff = f)Ng?zFailed to start event looprO   zTask timed out after z secondszTask failed with error: )rd   rH   rl   timesleeprX   r\   result
concurrentfuturesTimeoutErrorr
   rU   	Exceptionerror)rZ   return_futurerP   rg   r[   es         r    r\   r\      s    !G

3788t$F}}W}--** /yAB 045s   ;B
 
AC+C&&C+openaic                   X   ^  \ rS rSr S
U 4S jjr\S 5       rSS.S jrS rS r	S	r
U =r$ )GenAIClient   c                   > SSK Jn  [        TU ]  5         Xl        X0l        Uc  [        U R                  5       SS9nX@l        SU;  a  SUS'   U" SSU0UD6U l	        [        R                  " U R
                  5      U l        g )	Nr   )AsyncOpenAI
   rO   api_keynullbase_urlr$   )rz   r   superr:   r   _max_concurrencyr\   _get_model_name_model_name_clientr>   	Semaphore
_semaphore)r   r   r   r   
model_namekwargsr   	__class__s          r    r:   GenAIClient.__init__   s}     	' /"4#7#7#92FJ%F" &F9"?H??!++D,A,ABr#   c                     U R                   $ r_   )r   r   s    r    openai_clientGenAIClient.openai_client   s    ||r#   Frx   c                J   ^  U 4S jn[        U" ST R                  US.UD6US9$ )Nc                    >#    TR                    IS h  vN   TR                  R                  R                  R                  " U 0 UD6I S h  vN sS S S 5      IS h  vN   $  NM N N	! , IS h  vN  (       d  f       g = f7fr_   )r   r   chatcompletionscreate)argsr   r   s     r    &_create_chat_completion_with_semaphoreRGenAIClient.create_chat_completion.<locals>._create_chat_completion_with_semaphore   sV     !\\..::AA  ' 'sV   BA"B4A(A$A(BA&B$A(&B(A?.A1/A?;B)modelmessagesr   r$   )r\   r   )r   r   rx   r   r   s   `    r    create_chat_completion"GenAIClient.create_chat_completion   s?    	 2 &&! 
 (
 	
r#   c                 H    [        U R                  R                  5       SS9  g )N   rO   )r\   r   rC   r   s    r    rC   GenAIClient.close   s    $,,$$&2r#   c                    #     U R                   R                  R                  5       I S h  vN nUR
                  S   R                  $  N! [         a  n[	        SU 35      UeS nAff = f7f)Nz@Failed to get the model list from the OpenAI-compatible server: r   )r   modelslistrv   rX   dataid)r   r   ry   s      r    r   GenAIClient._get_model_name   sk     	<<..3355F
 {{1~    6 	RSTRUV	s7   A,'A A	A A,	A 
A)A$$A))A,)r   r   r   r   r   )r   N)r%   r&   r'   r(   r:   propertyr   r   rC   r   r,   __classcell__)r   s   @r    r|   r|      s?     BFC&   AF 
"3! !r#   r|   )FN)r>   rj   concurrent.futuresrs   r7   rp   typingr   r   r   pydanticr   r   typing_extensionsr   utilsr
   
utils.depsr   r   r   r/   r1   rc   rd   rh   rl   rn   r\   objectr|   r$   r#   r    <module>r      s         & & / %  .G) ",X ,X^  !<
&2 X4!& 4! 4!r#   