
    h                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZ  G d de j                        Z G d	 d
e      Z G d d      Zy)    N)Optional)	BaseModel)print_verbose)	DualCache
RedisCache)DEFAULT_IN_MEMORY_TTLDEFAULT_POLLING_INTERVALc                       e Zd ZdZeZy)SchedulerCacheKeyszscheduler:queueN)__name__
__module____qualname__queuer   default_in_memory_ttl     M/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/scheduler.pyr   r      s    E r   r   c                   ,    e Zd ZU eed<   eed<   eed<   y)FlowItempriority
request_id
model_nameN)r   r   r   int__annotations__strr   r   r   r   r      s    MOOr   r   c                       e Zd ZU eed<   	 	 ddee   dee   fdZde	fdZ
ded	ed
edefdZded	ed
edefdZd Zd	edefdZded	eddfdZy)	SchedulercacheNpolling_intervalredis_cachec                     g | _         d}|t        j                  j                  }t	        ||      | _        |xs t        | _        y)z_
        polling_interval: float or null - frequency of polling queue. Default is 3ms.
        N)r    r   )r   r   r   valuer   r   r	   r   )selfr   r    r   s       r   __init__zScheduler.__init__   sN     
15"$6$L$L$R$R!#;P

 8 8 	r   requestc                    K   | j                  |j                         d {   }t        j                  ||j                  |j
                  f       | j                  ||j                         d {    y 7 V7 w)Nr   )r   r   )	get_queuer   heapqheappushr   r   
save_queue)r#   r%   r   s      r   add_requestzScheduler.add_request0   sk      nn0B0BnCCuw//1C1CDE ooEg6H6HoIII D
 	Js"    A=A9AA=3A;4A=;A=idr   health_deploymentsreturnc                 H  K   | j                  |       d{   }|st        dj                  |            t        dt	        |              t	        |      dk(  rAt        d| d|        |d   d   |k(  r$t        j                  |       t        d	|        y
yy
7 w)a/  
        Return if request can be processed.

        Returns:
        - True:
            * If healthy deployments are available
            * OR If request at the top of queue
        - False:
            * If no healthy deployments available
            * AND request not at the top of queue
        r'   N-Incorrectly setup. Queue is invalid. Queue={}zlen(health_deployments): r   zqueue: z, seeking id=   zPopped id: TF)r(   	Exceptionformatr   lenr)   heappopr#   r-   r   r.   r   s        r   pollzScheduler.poll:   s      nn
n;;?FFuM  	1#6H2I1JKL!"a'GE7-t<=Qx{b e$B401- <s   B"B BB"c                    K   | j                  |       d{   }|st        dj                  |            |d   d   |k(  ryy7 -w)zKReturn if the id is at the top of the queue. Don't pop the value from heap.r'   Nr1   r   r2   TF)r(   r3   r4   r7   s        r   peekzScheduler.peek^   sT     nn
n;;?FFuM  8A;" <s   AA.Ac                     | j                   S )z$Get the status of items in the queue)r   )r#   s    r   get_queue_statuszScheduler.get_queue_statusp   s    zzr   c                 &  K   | j                   tdj                  t        j                  j                  |      }| j                   j                  |       d{   }|t        |t              sg S t        |t              r|S | j                  S 7 6w)z>
        Return a queue for that specific model group
        N{}:{})key)r   r4   r   r   r"   async_get_cache
isinstancelist)r#   r   
_cache_keyresponses       r   r(   zScheduler.get_queuet   s|      ::! (:(@(@(F(F
SJ!ZZ77J7GGHz(D'A	Hd+zz Hs   ABB7Br   c                    K   | j                   Odj                  t        j                  j                  |      }| j                   j                  ||       d{    y7 w)z;
        Save the updated queue of the model group
        Nr>   )r?   r"   )r   r4   r   r   r"   async_set_cache)r#   r   r   rC   s       r   r+   zScheduler.save_queue   sU      ::! (:(@(@(F(F
SJ**,,5,III Js   AA!AA!)NN)r   r   r   r   r   r   floatr   r$   r   r,   r   rB   boolr8   r:   r<   r(   r+   r   r   r   r   r      s     -1,0
"5/
 j)
(J J"S "c "t "PT "HS c t PT $# $ d   r   r   )enumr)   typingr   pydanticr   litellmr   litellm.caching.cachingr   r   litellm.constantsr   r	   Enumr   r   r   r   r   r   <module>rP      sB        ! 9 M y o or   