
    mh                         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dS )    N)Optional)	BaseModel)print_verbose)	DualCache
RedisCache)DEFAULT_IN_MEMORY_TTLDEFAULT_POLLING_INTERVALc                       e Zd ZdZeZdS )SchedulerCacheKeyszscheduler:queueN)__name__
__module____qualname__queuer   default_in_memory_ttl     </usr/local/lib/python3.11/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<   dS )FlowItempriority
request_id
model_nameN)r   r   r   int__annotations__strr   r   r   r   r      s+         MMMOOOOOOOOr   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dS )	SchedulercacheNpolling_intervalredis_cachec                     g | _         d}|t          j        j        }t	          ||          | _        |pt          | _        dS )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__   sX     
15"$6$L$R!#;P
 
 

 8 8 	r   requestc                    K   |                      |j                   d {V }t          j        ||j        |j        f           |                     ||j                   d {V  d S )Nr   )r   r   )	get_queuer   heapqheappushr   r   
save_queue)r#   r%   r   s      r   add_requestzScheduler.add_request0   s       nn0BnCCCCCCCCuw/1CDEEE ooEg6HoIIIIIIIIIIIr   idr   health_deploymentsreturnc                   K   |                      |           d{V }|s"t          d                    |                    t          dt	          |                      t	          |          dk    rQt          d| d|            |d         d         |k    r(t          j        |           t          d	|            d
S dS d
S )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M   	K#6H2I2IKKLLL!""a''<E<<<<===Qx{b  e$$$0B00111tutr   c                    K   |                      |           d{V }|s"t          d                    |                    |d         d         |k    rdS dS )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^   su      nn
n;;;;;;;; 	?FFuMM   8A;"4ur   c                     | j         S )z$Get the status of items in the queue)r   )r#   s    r   get_queue_statuszScheduler.get_queue_statusp   s
    zr   c                   K   | j         vd                    t          j        j        |          }| j                             |           d{V }|t          |t                    sg S t          |t                    r|S | j        S )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
SSJ!Z77J7GGGGGGGGHz(D'A'A	Hd++  zr   r   c                    K   | j         Gd                    t          j        j        |          }| j                             ||           d{V  dS )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   s\       :! (:(@(F
SSJ*,,5,IIIIIIIIItr   )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 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      s                 ! ! ! ! ! ! 9 9 9 9 9 9 9 9 M M M M M M M M           y   o o o o o o o o o or   