o
    ưi                     @   s   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 de jZG d	d
 d
eZG dd dZdS )    N)Optional)	BaseModel)print_verbose)	DualCache
RedisCache)DEFAULT_IN_MEMORY_TTLDEFAULT_POLLING_INTERVALc                   @   s   e Zd ZdZeZdS )SchedulerCacheKeyszscheduler:queueN)__name__
__module____qualname__queuer   default_in_memory_ttl r   r   H/home/app/Keep/.python/lib/python3.10/site-packages/litellm/scheduler.pyr	      s    r	   c                   @   s&   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   
 r   c                   @   s   e Zd ZU eed< 		ddee dee fddZde	fdd	Z
d
edededefddZdededdfddZd
edededefddZdd ZdedefddZdededdfddZdS )	SchedulercacheNpolling_intervalredis_cachec                 C   s6   g | _ d}|durtjj}t||d| _|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   r   r   r   __init__   s   zScheduler.__init__requestc                    sD   | j |jdI d H }t||j|jf | j||jdI d H  d S )Nr   r   r   )	get_queuer   heapqheappushr   r   
save_queue)r   r   r   r   r   r   add_request0   s   zScheduler.add_requestidr   health_deploymentsreturnc                    s   | j |dI dH }|std|tdt|  t|dkrNtd| d|  |d d |krLt| | j||d	I dH  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=   r!   zPopped id: TF)r"   	Exceptionformatr   lenr#   heappopr%   r   r'   r   r(   r   r   r   r   poll:   s    
zScheduler.pollr   c                    s\   | j |dI dH } fdd|D }t| | j||dI dH  td  d|  dS )z
        Remove a specific request from the priority queue for a model.
        Used when a request times out while waiting in the queue.
        r    Nc                    s   g | ]
}|d   kr|qS )r+   r   ).0itemr   r   r   
<listcomp>e   s    z,Scheduler.remove_request.<locals>.<listcomp>r!   zRemoved request_id: z from queue for model: )r"   r#   heapifyr%   r   )r   r   r   r   Zfiltered_queuer   r4   r   remove_request_   s   
zScheduler.remove_requestc                    s>   | j |dI dH }|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    Nr*   r   r+   TF)r"   r,   r-   r0   r   r   r   peekj   s   	zScheduler.peekc                 C   s   | j S )z$Get the status of items in the queue)r   )r   r   r   r   get_queue_status|   s   zScheduler.get_queue_statusc                    sZ   | j dur*dtjj|}| j j|dI dH }|du s!t|ts#g S t|tr*|S | jS )z>
        Return a queue for that specific model group
        N{}:{})key)r   r-   r	   r   r   Zasync_get_cache
isinstancelist)r   r   
_cache_keyresponser   r   r   r"      s   

zScheduler.get_queuer   c                    s6   | j durdtjj|}| j j||dI dH  dS )z;
        Save the updated queue of the model group
        Nr:   )r;   r   )r   r-   r	   r   r   Zasync_set_cache)r   r   r   r>   r   r   r   r%      s
   
zScheduler.save_queue)NN)r
   r   r   r   r   r   floatr   r   r   r&   r   r=   boolr1   r7   r8   r9   r"   r%   r   r   r   r   r      s    
 

%r   )enumr#   typingr   Zpydanticr   Zlitellmr   Zlitellm.caching.cachingr   r   Zlitellm.constantsr   r   Enumr	   r   r   r   r   r   r   <module>   s    