o
    ưi=                     @   s\   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	 dd Z
G dd deZdS )    N)CustomLogger)HTTPHandlerget_async_httpx_clienthttpxSpecialProviderc                  C   s2   dd l } ddl m } t| dr|| jS | S )Nr   )datetimeUTC)r   hasattrnowr   utcnow)dtr    r   U/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/openmeter.pyget_utc_datetime   s
   
r   c                       sD   e Zd Zd fddZdd Zdefdd	Zd
d Zdd Z  Z	S )OpenMeterLoggerreturnNc                    s,   t    |   ttjd| _t | _d S )N)Zllm_provider)	super__init__validate_environmentr   r   ZLoggingCallbackasync_http_handlerr   sync_http_handler)self	__class__r   r   r      s   
zOpenMeterLogger.__init__c                 C   s<   g }t dddu r|d t|dkrtd|dS )zp
        Expects
        OPENMETER_API_ENDPOINT,
        OPENMETER_API_KEY,

        in the environment
        OPENMETER_API_KEYNr   zMissing keys={} in environment.)osgetenvappendlen	Exceptionformat)r   Zmissing_keysr   r   r   r   %   s   
z$OpenMeterLogger.validate_environmentkwargsc              	   C   s  | d| d}t  }| dd }| d}i }t|tjs't|tjrCt|drC|d  dd|d  dd|d  d	d
}| dd }|d u rj| di }	|	 di }
|
 dd }|d urf|}ntdt	|}dt
dd|||d||d|dS )NidZlitellm_call_idZresponse_costmodelusageprompt_tokensr   completion_tokenstotal_tokens)r$   r%   r&   userlitellm_paramsmetadatauser_api_key_user_idzOpenMeter: user is requiredz1.0ZOPENMETER_EVENT_TYPEZlitellm_tokenszlitellm-proxy)r"   cost)Zspecversiontyper!   timesubjectsourcedata)getr   	isoformat
isinstancelitellmZModelResponseZEmbeddingResponser   r   strr   r   )r   r    response_objZcall_idr   r+   r"   r#   Z
user_paramr(   r)   r*   r.   r   r   r   _common_logic4   s@   




zOpenMeterLogger._common_logicc           
   
   C   s   t dd}|dr|d7 }n|d7 }t d}| j||d}dd	|d
}z| jj|t||d W d S  t	j
yM }	 z	td|	jj d }	~	w tyZ }	 z|	d }	~	ww NZOPENMETER_API_ENDPOINTzhttps://openmeter.cloud/zapi/v1/eventsz/api/v1/eventsr   )r    r6   zapplication/cloudevents+jsonz	Bearer {})zContent-TypeAuthorization)urlr0   headerszOpenMeter logging error: )r   r   endswithr7   r   r   postjsondumpshttpxHTTPStatusErrorr   responsetext
r   r    r6   
start_timeend_time_urlZapi_key_data_headerser   r   r   log_success_event_   s,   


z!OpenMeterLogger.log_success_eventc           
   
      s   t dd}|dr|d7 }n|d7 }t d}| j||d}dd	|d
}z| jj|t||dI d H  W d S  t	j
yQ }	 z	td|	jj d }	~	w ty^ }	 z|	d }	~	ww r8   )r   r   r=   r7   r   r   r>   r?   r@   rA   rB   r   rC   rD   rE   r   r   r   async_log_success_eventy   s.   


z'OpenMeterLogger.async_log_success_event)r   N)
__name__
__module____qualname__r   r   dictr7   rL   rM   __classcell__r   r   r   r   r      s    +r   )r?   r   rA   r4   Z"litellm.integrations.custom_loggerr   Z&litellm.llms.custom_httpx.http_handlerr   r   r   r   r   r   r   r   r   <module>   s   
