o
    ưi.                     @   s   d 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lm	Z	 ddl
mZ ddlmZmZmZ dd	lmZmZ zdd
lmZ W n eyK   dZY nw deeef defddZG dd deZdS )z4
Opik Logger that logs LLM events to an Opik server
    N)datetime)AnyDictOptional)verbose_logger)CustomBatchLogger)_get_httpx_clientget_async_httpx_clienthttpxSpecialProvider   )opik_payload_builderutils)opik_clientkwargsreturnc                 C   s    |  ddu rtd dS dS )zHCheck if event should be skipped due to missing standard_logging_object.Zstandard_logging_objectNz;OpikLogger skipping event; no standard_logging_object foundTF)getr   debug)r    r   U/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/opik/opik.py_should_skip_event   s   r   c                
       s   e Zd ZdZdeddf fddZdeeef deded	eddf
d
dZ	dedeeef deeef ddfddZ
deeef deded	eddf
ddZdedeeef deeef ddfddZdeeef fddZdddZ  ZS )
OpikLoggerz:
    Opik Logger for logging events to an Opik Server
    r   r   Nc              
      s\  t tjd| _t | _tjd|dd ddpd| _	tjd|dd ddp'd}tjd|dd d d}tjd	|d	d d d}| d
| _
| d| _i | _|rV|| jd< |r]|| jd< || _|| _zt|   t | _W n ty } ztdt|  d | _W Y d }~nd }~ww td urt | _nd | _t jdi |d| ji d S )N)Zllm_providerproject_namezDefault Project)Z
user_valuedefault_valueZurl_overrideurlzhttps://www.comet.com/opik/apiZapi_keyZ	workspacez/v1/private/traces/batchz/v1/private/spans/batchComet-Workspaceauthorizationz_OpikLogger - Asynchronous processing not initialized as we are not running in an async context 
flush_lockr   )r	   r
   ZLoggingCallbackasync_httpx_clientr   sync_httpx_clientr   Zget_opik_config_variabler   opik_project_name	trace_urlspan_urlheadersopik_workspaceopik_api_keyasynciocreate_taskZperiodic_flushLockr   	Exceptionr   	exceptionstrr   Zget_client_cached_opik_clientsuper__init__)selfr   Zopik_base_urlr$   r#   e	__class__r   r   r-   )   s^   




 zOpikLogger.__init__response_obj
start_timeend_timec                    s  zt |r	W d S tj||||| jd\}}| jd ur|d ur?| jj|j|jt	|j
t	|j|j|j|j|j|j|jd
 | jjdi d|jd|jd|jd|jd|jd|jd	t	|j
d
t	|jd|jd|jd|jd|jd|jd|jd|jd|j W d S |d ur| j|j | j|j td| j d t | j| j!krtd | " I d H  W d S W d S  t#y } zt$dt%| dt&'   W Y d }~d S d }~ww )Nr   r2   r3   r4   r   
idnamer3   r4   inputoutputmetadatatags	thread_idr   r7   trace_idparent_span_idr8   typemodelr3   r4   r9   r:   r;   r<   usager   provider
total_costz4OpikLogger added event to log_queue - Will flush in z seconds...zOpikLogger - Flushing batch)OpikLogger failed to log success event - 
r   )(r   r   build_opik_payloadr   r+   tracer7   r8   r   fromisoformatr3   r4   r9   r:   r;   r<   r=   r   spanr>   r?   r@   rA   rB   rC   rD   	log_queueappend__dict__r   r   Zflush_intervallenZ
batch_sizeZflush_queuer(   r)   r*   	traceback
format_excr.   r   r2   r3   r4   Ztrace_payloadZspan_payloadr/   r   r   r   async_log_success_eventd   s   



	


z"OpikLogger.async_log_success_eventr   r"   batchc              
   C   s   z!| j j|||d}|  |jdkrtd|j d|j W d S  tyC } ztdt| dt	
   W Y d }~d S d }~ww )Nr   r"   json   z$Response from opik API status_code: z, text: "OpikLogger failed to send batch - rF   )r   postraise_for_statusstatus_coder(   textr   r)   r*   rO   rP   r.   r   r"   rS   responser/   r   r   r   
_sync_send   s    
zOpikLogger._sync_sendc                 C   s  zt |rW d S tj||||| jd\}}| jd ur|d ur>| jj|j|jt	|j
t	|j|j|j|j|j|j|jd
 | jjdi d|jd|jd|jd|jd|jd|jd	t	|j
d
t	|jd|jd|jd|jd|jd|jd|jd|jd|j W d S |d ur| j| j| jd|jgid | j| j| jd|jgid W d S  ty } zt !dt"| dt#$   W Y d }~d S d }~ww )Nr5   r6   r7   r>   r?   r8   r@   rA   r3   r4   r9   r:   r;   r<   rB   r   rC   rD   tracesr   r"   rS   spansrE   rF   r   )%r   r   rG   r   r+   rH   r7   r8   r   rI   r3   r4   r9   r:   r;   r<   r=   r   rJ   r>   r?   r@   rA   rB   rC   rD   r^   r    r"   rM   r!   r(   r   r)   r*   rO   rP   rQ   r   r   r   log_success_event   s   



	



zOpikLogger.log_success_eventc              
      s   z4| j j|||dI d H }|  |jdkr'td|j d|j  W d S tdt| j	 d W d S  t
yR } ztdt|  W Y d }~d S d }~ww )NrT   i,  zOpikLogger - Error: z - zOpikLogger - z Opik events submittedrW   )r   rX   rY   rZ   r   errorr[   inforN   rK   r(   r)   r*   r\   r   r   r   _submit_batch  s"   


"zOpikLogger._submit_batchc                 C   s(   i }| j r
| j |d< | jr| j|d< |S )Nr   r   )r#   r$   )r.   r"   r   r   r   _create_opik_headers  s   

zOpikLogger._create_opik_headersc                    s   t d | jsd S t| j\}}t|dkr3| j| j| jd|idI d H  t dt| d t|dkrU| j| j	| jd|idI d H  t dt| d d S d S )	NzCalling async_send_batchr   r_   r`   zSent z tracesra   z spans)
r   rd   rK   r   Z!get_traces_and_spans_from_payloadrN   re   r    r"   r!   )r.   r_   ra   r   r   r   async_send_batch#  s    
zOpikLogger.async_send_batch)r   N)__name__
__module____qualname____doc__r   r-   r   r*   r   rR   r^   rb   re   rf   rg   __classcell__r   r   r0   r   r   $   sZ    ;

H




I


	r   )rk   r%   rO   r   typingr   r   r   Zlitellm._loggingr   Z(litellm.integrations.custom_batch_loggerr   Z&litellm.llms.custom_httpx.http_handlerr   r	   r
    r   r   Zopik.api_objectsr   r(   r*   boolr   r   r   r   r   r   <module>   s     
