
    g                         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
  G d de j                        Z G d d	e j                        Z G d
 de      Z G d d      Zy)    N)Optional)	BaseModel)print_verbose)	DualCache
RedisCachec                       e Zd ZdZdZy)SchedulerCacheKeyszscheduler:queue   N)__name__
__module____qualname__queuedefault_in_memory_ttl     F/var/www/openai/venv/lib/python3.12/site-packages/litellm/scheduler.pyr	   r	      s    Er   r	   c                       e Zd ZdZdZdZy)DefaultPrioritiesr         N)r   r   r   HighMediumLowr   r   r   r   r      s    DF
Cr   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 d| _        y)z_
        polling_interval: float or null - frequency of polling queue. Default is 3ms.
        N)r&   r   gQ?)r   r	   r   valuer   r$   r%   )selfr%   r&   r   s       r   __init__zScheduler.__init__   sJ     
15"$6$L$L$R$R!#;P

 !1 8D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_request1   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)   r3   r   r4   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-   Nr7   r   r8   TF)r.   r9   r:   r=   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_statusq   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$   r:   r	   r   r(   async_get_cache
isinstancelist)r)   r   
_cache_keyresponses       r   r.   zScheduler.get_queueu   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
        NrD   )rE   r(   )r$   r:   r	   r   r(   async_set_cache)r)   r   r   rI   s       r   r1   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   r2   r!   rH   boolr>   r@   rB   r.   r1   r   r   r   r#   r#      s     -1,09"5/9 j)9$J J"S "c "t "PT "HS c t PT $# $ d   r   r#   )enumr/   typingr   pydanticr   litellmr   litellm.caching.cachingr   r   Enumr	   r   r   r#   r   r   r   <module>rU      sO        ! 9 
		 y m mr   