o
    ưi0                     @   s|   d dl m Z mZ d dlmZmZmZmZ d dlZd dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ G dd	 d	eZdS )
    )datetime	timedelta)DictListOptionalUnionN)ModelResponsetoken_counterverbose_logger)verbose_router_logger)	DualCache)CustomLoggerc                   @   s   e Zd ZU dZeed< dZeed< dZeed< i fde	de
fdd	Zd
d Zdd Z			ddededeeeeef   deeeef  dee f
ddZdS )LowestCostLoggingHandlerF	test_flagr   logged_successlogged_failurerouter_cacherouting_argsc                 C   s
   || _ d S )N)r   )selfr   r    r   Z/home/app/Keep/.python/lib/python3.10/site-packages/litellm/router_strategy/lowest_cost.py__init__   s   
z!LowestCostLoggingHandler.__init__c              
   C   s  z	 |d  dd u rW d S |d d  dd }|d  di  dd }|d u s,|d u r/W d S t|tr8t|}	 t d}t d}t d}	| d	| d	|	 }
| d
}|| }d}t|trt|dd }|d urt|t	j
r|j}|j}t| |  | jj|dpi }||vri ||< |
|| vri || |
< || |
  dd| || |
 d< || |
  ddd || |
 d< | jj||d | jr|  jd7  _W d S W d S  ty } ztdt| W Y d }~d S d }~ww )Nlitellm_paramsmetadatamodel_group
model_infoid%Y-%m-%d%H%M-_mapr   usagekeytpmrpm   r$   valuezSlitellm.router_strategy.lowest_cost.py::log_success_event(): Exception occured - {})get
isinstanceintstrr   nowstrftimer   getattrlitellmUsagecompletion_tokenstotal_tokensfloattotal_secondsr   Z	get_cacheZ	set_cacher   r   	Exceptionr
   	exceptionformat)r   kwargsresponse_obj
start_timeend_timer   r   current_datecurrent_hourcurrent_minuteprecise_minutecost_keyresponse_msr4   _usager3   request_count_dicter   r   r   log_success_event   s`   
	

z*LowestCostLoggingHandler.log_success_eventc              
      s  z	 |d  dd u rW d S |d d  dd }|d  di  dd }|d u s-|d u r0W d S t|tr9t|}	 | d}t d}t d}	t d	}
| d
|	 d
|
 }|| }d}t|trt|dd }|d urt|t	j
r|j}|j}t| |  | jj|dI d H pi }||vri ||< ||| vri || |< || |  dd| || | d< || |  ddd || | d< | jj||dI d H  | jr|  jd7  _W d S W d S  ty } ztdt| W Y d }~d S d }~ww )Nr   r   r   r   r   r!   r   r   r   r    r   r"   r#   r%   r&   r'   r(   z`litellm.proxy.hooks.prompt_injection_detection.py::async_pre_call_hook(): Exception occured - {})r*   r+   r,   r-   r   r.   r/   r   r0   r1   r2   r3   r4   r5   r6   r   async_get_cacheZasync_set_cacher   r   r7   r
   r8   r9   )r   r:   r;   r<   r=   r   r   rB   r>   r?   r@   rA   rC   r4   rD   r3   rE   rF   r   r   r   async_log_success_eventk   sh   



z0LowestCostLoggingHandler.async_log_success_eventNr   healthy_deploymentsmessagesinputrequest_kwargsc           !         s$  | d}| j j|dI dH pi }td t d}t d}	t d}
| d|	 d|
 }|du r;dS |}|D ]}|d	 d
 |vrV|dddi||d	 d
 < q?zt||d}W n tyj   d}Y nw | }g }i }| D ] \}}d}|D ]}||d	 d
 kr|}q|du rqw|	ddp|	di 	ddp|	d	i 	ddptd}|	ddp|	di 	ddp|	d	i 	ddptd}|	di 	d}t
j	|i }d}d}|	di 	ddr|	di 	d}|	di 	ddr	|	di 	d}|du r|	dd}|du r|	dd}|| }|	|i 	dd}|	|i 	dd}td| d| d| d|	d	i 	d
  |	di 	dd}|durb|||< || |ksp|d |krqqw|||f qwt|dkrdS t|dd d}|d d } | S )z;
        Returns a deployment with the lowest cost
        r!   r#   Ninfr   r   r   r    r   r   r   )r%   r&   )rK   textr%   r   r&   modelZinput_cost_per_tokenZoutput_cost_per_tokeng      @zitem_cost: z, item_tpm: z, item_rpm: z, model_id: Zapi_base r'   c                 S   s   | d S )Nr'   r   )xr   r   r   <lambda>I  s    zJLowestCostLoggingHandler.async_get_available_deployments.<locals>.<lambda>)r   rH   r5   r   r.   r/   r	   r7   itemsr*   r1   Z
model_costr   debugappendlensorted)!r   r   rJ   rK   rL   rM   rB   rE   r>   r?   r@   rA   Zall_deploymentsdZinput_tokensZ_itemsZpotential_deploymentsZ_cost_per_deploymentitemZitem_mapZ_deploymentmZ_deployment_tpmZ_deployment_rpmZitem_litellm_model_nameZitem_litellm_model_cost_mapZitem_input_costZitem_output_costZ	item_costZitem_rpmZitem_tpmZ_deployment_api_baseZselected_deploymentr   r   r   async_get_available_deployments   s   



(	
z8LowestCostLoggingHandler.async_get_available_deployments)NNN)__name__
__module____qualname__r   bool__annotations__r   r,   r   r   dictr   rG   rI   r-   listr   r   r   r   r\   r   r   r   r   r      s4   
 
T\r   )r   r   typingr   r   r   r   r1   r   r	   r
   Zlitellm._loggingr   Zlitellm.caching.cachingr   Z"litellm.integrations.custom_loggerr   r   r   r   r   r   <module>   s   