
    g1                         d Z ddlZddlZddlZddl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mZmZ  G d	 d
e
      Zy)z4
Opik Logger that logs LLM events to an Opik server
    N)DictList)verbose_logger)CustomBatchLogger)_get_httpx_clientget_async_httpx_clienthttpxSpecialProvider   )create_usage_objectcreate_uuid7get_opik_config_variable!get_traces_and_spans_from_payloadc                        e Zd ZdZ fdZd Zdedeeef   defdZd Z	dedeeef   defd	Z
d
 Zd Zdee   fdZ xZS )
OpikLoggerz:
    Opik Logger for logging events to an Opik Server
    c                 "   t        t        j                        | _        t	               | _        t        d|j                  dd       d      | _        t        d|j                  dd       d      }t        d|j                  dd       d       }t        d	|j                  d	d       d       }| d
| _	        | d| _
        i | _        |r|| j                  d<   |r|| j                  d<   || _        || _        	 t        j                  | j!                                t        j"                         | _        t/        | `  di |d| j$                  i y # t&        $ r2}t)        j*                  dt-        |              d | _        Y d }~Td }~ww xY w)N)llm_providerproject_namezDefault Project)
user_valuedefault_valueurl_overrideurlzhttps://www.comet.com/opik/apiapi_key	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_lock )r   r	   LoggingCallbackasync_httpx_clientr   sync_httpx_clientr   getopik_project_name	trace_urlspan_urlheadersopik_workspaceopik_api_keyasynciocreate_taskperiodic_flushLockr   	Exceptionr   	exceptionstrsuper__init__)selfkwargsopik_base_urlr'   r&   e	__class__s         S/var/www/openai/venv/lib/python3.12/site-packages/litellm/integrations/opik/opik.pyr0   zOpikLogger.__init__   s   "8-==#
 "3!4!9zz.$7+"
 1zz%.:

 0&**Y"=T
 2FJJ{D$AQU
 *?*BC(/)@A.<DLL*+,8DLL),(	# 3 3 56%llnDO 	>6>doo>  	#$$qruvwrxqyz #DOO		#s   9<E 	F(F		Fc                   K   	 | j                  ||||      }| j                  j                  |       t        j                  d| j
                   d       t        | j                        | j                  k\  r.t        j                  d       | j                          d {    y y 7 # t        $ r@}t        j                  dt        |       dt        j                                 Y d }~y d }~ww xY ww)Nr2   response_obj
start_timeend_timez4OpikLogger added event to log_queue - Will flush in z seconds...zOpikLogger - Flushing batch)OpikLogger failed to log success event - 
)_create_opik_payload	log_queueextendr   debugflush_intervallen
batch_sizeflush_queuer,   r-   r.   	traceback
format_exc)r1   r2   r9   r:   r;   opik_payloadr4   s          r6   async_log_success_eventz"OpikLogger.async_log_success_eventN   s     	44)%!	 5 L NN!!,/  FtGZGZF[[fg 4>>"doo5$$%BC&&((( 6( 	$$;CF82iFZFZF\E]^ 	sA   C6BB* !B("B* &C6(B* *	C336C.)C6.C33C6r   r%   batchc                 b   	 | j                   j                  |||      }|j                          |j                  dk7  r%t	        d|j                   d|j
                         y # t        $ r@}t        j                  dt        |       dt        j                                 Y d }~y d }~ww xY w)Nr   r%   json   z$Response from opik API status_code: z, text: "OpikLogger failed to send batch - r=   )r    postraise_for_statusstatus_coder,   textr   r-   r.   rF   rG   r1   r   r%   rJ   responser4   s         r6   
_sync_sendzOpikLogger._sync_sendd   s    	--22u 3 H %%'##s*:8;O;O:PPXYaYfYfXgh  +  	$$4SVHBy?S?S?U>VW 	s   A"A% %	B..6B))B.c                    	 | j                  ||||      }t        |      \  }}t        |      dkD  r*| j                  | j                  | j
                  d|i       t        |      dkD  r+| j                  | j                  | j
                  d|i       y y # t        $ r@}t        j                  dt        |       dt        j                                 Y d }~y d }~ww xY w)Nr8   r   tracesr   r%   rJ   spansr<   r=   )r>   r   rC   rV   r#   r%   r$   r,   r   r-   r.   rF   rG   )	r1   r2   r9   r:   r;   rH   rX   rZ   r4   s	            r6   log_success_eventzOpikLogger.log_success_events   s    	44)%!	 5 L >lKMFE6{QXvDV    5zA~t||GUCS      	$$;CF82iFZFZF\E]^ 	s   BB 	C  6CC c                   K   	 | j                   j                  |||       d {   }|j                          |j                  dk\  r0t	        j
                  d|j                   d|j                          y t	        j                  dt        | j                         d       y 7 # t        $ r@}t	        j                  dt        |       dt        j                                 Y d }~y d }~ww xY ww)	NrL   i,  zOpikLogger - Error: z - zOpikLogger - z Opik events submittedrO   r=   )r   rP   rQ   rR   r   errorrS   rA   rC   r?   r,   r-   r.   rF   rG   rT   s         r6   _submit_batchzOpikLogger._submit_batch   s     	!4499u :  H %%'##s*$$*8+?+?*@HMM?S $$#C$7#88NO  	$$4SVHBy?S?S?U>VW 	sK   C4!B( B&AB( 8C49,B( %C4&B( (	C116C,'C4,C11C4c                 v    i }| j                   r| j                   |d<   | j                  r| j                  |d<   |S )Nr   r   )r&   r'   )r1   r%   s     r6   _create_opik_headerszOpikLogger._create_opik_headers   s?    )-)<)<G%&'+'8'8GO$    c                   K   t        j                  d       | j                  sy t        | j                        \  }}t	        |      dkD  r2| j                  | j                  | j                  d|i       d {    t	        |      dkD  r3| j                  | j                  | j                  d|i       d {    y y 7 F7 w)NzCalling async_send_batchr   rX   rY   rZ   )	r   r-   r?   r   rC   r^   r#   r%   r$   )r1   rX   rZ   s      r6   async_send_batchzOpikLogger.async_send_batch   s       !;<~~ :$..I v;?$$NNDLL6@R %    u:>$$MM4<<?O %    s$   A6C8B?9?C8C9CCreturnc                    |j                  di       xs i }|j                  di       xs i }|j                  di       }t        j                  dt        j                  |t
                      |j                  d| j                        }|j                  dd       }	t        |	t              r%|	j                  dd       }
|	j                  d	d       }n|	r|	j                  }
|	j                  }nd }
d }|j                  d
g       }|j                  d      r|j                  |d          |j                  dd       }|t        j                  d       g S |j                  di       }|j                  di       }t        |d         }|j                  dd      d|j                  dd      d|j                  dd      }|j                  dd      }|}d|v r|d= d|d<   |j                  |j                  di              d|v r|d   |d<   d|v r|d   |d<   d|v r|d   dd |d!<   d"|v r|d"   |d"<   d#|v r|d#   |d#<   d|v r|d   |d<   d$|v r|d$   |d$<   d%|v r|d%   |d%<   d&|v r|d&   |d&<   d'|v r|d'   |d'<   d(|v r|d(   |d(<   d)|v r|d)   |d)<   d*|v r|d*   |d*<   d+|v r|d+   |d+<   g }|
_t               }
t        j                  d,|
        |j                  ||
||j                         d-z   |j                         d-z   ||||d.	       t               }t        j                  d,|
 d/|        |j                  |||
||d0|j                         d-z   |j                         d-z   |||||d1       t        j                  d2|        |S )3Nlitellm_paramsmetadataopikzlitellm_opik_metadata - )defaultr   current_span_datatrace_ididtagscustom_llm_providerstandard_logging_objectz;OpikLogger skipping event; no standard_logging_object foundmessagesrU   usagemodelzunknown-model_objectzunknown-objectcreatedr   zunknown typelitellmcreated_from	call_typetypestatusresponse_costUSD)total_tokenscurrencycost response_cost_failure_debug_infomodel_map_informationmodel_idmodel_groupapi_base	cache_hitsaved_cache_cost	error_strmodel_parametershidden_paramsz.OpikLogger creating payload for trace with id Z)	r   rl   namer:   r;   inputoutputrg   rm   z and span with id llm)rl   r   rk   parent_span_idr   ry   r:   r;   r   r   rg   rm   rq   z	Payload: )r!   r   rA   rM   dumpsr.   r"   
isinstancedictrk   rl   appendr   updater   	isoformat)r1   r2   r9   r:   r;   _litellm_paramslitellm_params_metadatalitellm_opik_metadatar   rj   rk   r   	opik_tagsro   
input_dataoutput_datarq   	span_name
trace_namerg   payloadspan_ids                         r6   r>   zOpikLogger._create_opik_payload   s   
 !**%5r:@b"1"5"5j""E"K !8 ; ;FB G&tzz2GQT'U&VW	
 -00AWAWX 2556I4P'.(,,Z>H.224>N(11H.11NH!N)--fb9	::+,V$9:; #)**-F"M"*  M I -00R@
-11*bA $L$9: Wo6X'78Y*
	
 "%%h?
 )(*,-#, /33JCD116{CHV..!8!BHXf$ & 7! HV .7;A2<H78 #&==0G'1H,- -- 7 @HW00#::#FHZ 33&=m&LH]#00#::#FHZ 11$;K$HH[!!88+BCU+VH'(11$;K$HH[!!88+BCU+VH'(55(?(PH_%#~H  @
K NN$0"&","6"6"83"> ( 2 2 4s :') (%
 .<XJFXY`Xab	
 	 ,$"0!(224s:$..036#%$!	
" 	y	23ra   )__name__
__module____qualname____doc__r0   rI   r.   r   rV   r[   r^   r`   rc   r   r>   __classcell__)r5   s   @r6   r   r      sy    -?^,c DcN 4 .s T#s(^ D ($M	dMra   r   )r   r(   rM   rF   typingr   r   litellm._loggingr   (litellm.integrations.custom_batch_loggerr   &litellm.llms.custom_httpx.http_handlerr   r   r	   utilsr   r   r   r   r   r   ra   r6   <module>r      sA        + F  l" lra   