
    ^h1                         S r SSKrSSKrSSKrSSKJrJr  SSKJr  SSK	J
r
  SSKJrJrJr  SSKJrJrJrJr   " S	 S
\
5      rg)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                      ^  \ rS rSrSrU 4S jrS rS\S\\\4   S\4S jr	S	 r
S\S\\\4   S\4S
 jrS rS rS\\   4S jrSrU =r$ )
OpikLogger   z2
Opik Logger for logging events to an Opik Server
c                   > [        [        R                  S9U l        [	        5       U l        [        SUR                  SS 5      SS9U l        [        SUR                  SS 5      SS9n[        SUR                  SS 5      S S9n[        S	UR                  S	S 5      S S9nU S
3U l	        U S3U l
        0 U l        U(       a  X@R                  S'   U(       a  X0R                  S'   X@l        X0l         [        R                  " U R!                  5       5        [        R"                  " 5       U l        [.        TU ]`  " S0 UDSU R$                  0D6  g ! [&         a3  n[(        R*                  " S[-        U5       35        S U l         S nANWS nAff = f)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         X/home/james-whalen/.local/lib/python3.13/site-packages/litellm/integrations/opik/opik.pyr1   OpikLogger.__init__   sw   "8-==#
 "3!4!9zz.$7+"
 1zz%.:

 0&**Y"=T
 2FJJ{D$AQU
 *?*BC(/)@A.<LL*+,8LL),(	# 3 3 56%llnDO 	>6>doo>  	#$$qruvwrxqyz #DOO		#s   0>E 
F
)FF
c                   #     U R                  UUUUS9nU R                  R                  U5        [        R                  " SU R
                   S35        [        U R                  5      U R                  :  a/  [        R                  " S5        U R                  5       I S h  vN   g g  N! [         aB  n[        R                  " S[        U5       S[        R                  " 5        35         S nAg S nAff = f7f)Nr3   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)r2   r3   r;   r<   r=   opik_payloadr5   s          r7   async_log_success_event"OpikLogger.async_log_success_eventN   s     	44)%!	 5 L NN!!,/  FtGZGZF[[fg 4>>"doo5$$%BC&&((( 6( 	$$;CF82iFZFZF\E]^ 	sA   C9BB* !B("B* &C9(B* *
C648C1,C91C66C9r   r&   batchc                 b    U R                   R                  XUS9nUR                  5         UR                  S:w  a%  [	        SUR                   SUR
                   35      eg ! [         aB  n[        R                  " S[        U5       S[        R                  " 5        35         S nAg S nAff = f)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/   rH   rI   r2   r   r&   rM   responser5   s         r7   
_sync_send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.,8B))B.c                     U R                  UUUUS9n[        U5      u  pg[        U5      S:  a'  U R                  U R                  U R
                  SU0S9  [        U5      S:  a(  U R                  U R                  U R
                  SU0S9  g g ! [         aB  n[        R                  " S[        U5       S[        R                  " 5        35         S nAg S nAff = f)Nr:   r   tracesr   r&   rM   spansr>   r?   )r@   r   rE   rY   r$   r&   r%   r-   r   r.   r/   rH   rI   )	r2   r3   r;   r<   r=   rJ   r\   r^   r5   s	            r7   log_success_eventOpikLogger.log_success_events   s    	44)%!	 5 L >lKMF6{QXvDV    5zA~t||GUCS      	$$;CF82iFZFZF\E]^ 	s   BB 
C8CCc                   #     U R                   R                  XUS9I S h  vN nUR                  5         UR                  S:  a1  [        R
                  " SUR                   SUR                   35        g [        R                  " S[        U R                  5       S35        g  N! [         aB  n[        R                  " S[        U5       S[        R                  " 5        35         S nAg S nAff = f7f)	NrO   i,  zOpikLogger - Error: z - zOpikLogger - z Opik events submittedrR   r?   )r    rS   rT   rU   r   errorrV   rC   rE   rA   r-   r.   r/   rH   rI   rW   s         r7   _submit_batch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   C6B' B%AB' 6C67-B' $C6%B' '
C318C.)C6.C33C6c                     0 nU R                   (       a  U R                   US'   U R                  (       a  U R                  US'   U$ )Nr   r   )r'   r(   )r2   r&   s     r7   _create_opik_headersOpikLogger._create_opik_headers   s?    )-)<)<G%&'+'8'8GO$    c                   #    [         R                  " S5        U R                  (       d  g [        U R                  5      u  p[	        U5      S:  a/  U R                  U R                  U R                  SU0S9I S h  vN   [	        U5      S:  a0  U R                  U R                  U R                  SU0S9I S h  vN   g g  ND N7f)NzCalling async_send_batchr   r\   r]   r^   )	r   r.   rA   r   rE   rc   r$   r&   r%   )r2   r\   r^   s      r7   async_send_batchOpikLogger.async_send_batch   s       !;<~~ :$..I v;?$$NNDLL6@R %    u:>$$MM4<<?O %    s$   A9C;C <=C9C:CCreturnc                    UR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  S0 5      n[        R                  " S[        R                  " U[
        S9 35        UR                  SU R                  5      nUR                  SS 5      n	[        U	[        5      (       a%  U	R                  SS 5      n
U	R                  S	S 5      nO$U	(       a  U	R                  n
U	R                  nOS n
S nUR                  S
/ 5      nUR                  S5      (       a  UR                  US   5        UR                  SS 5      nUc  [        R                  " S5        / $ UR                  S0 5      nUR                  S0 5      n[        US   5      nUR                  SS5      < SUR                  SS5      < SUR                  SS5      < 3nUR                  SS5      nUnSU;   a  US	 SUS'   UR                  UR                  S0 5      5        SU;   a  US   US'   SU;   a  US   US'   SU;   a  US   SS .US!'   S"U;   a  US"   US"'   S#U;   a  US#   US#'   SU;   a  US   US'   S$U;   a  US$   US$'   S%U;   a  US%   US%'   S&U;   a  US&   US&'   S'U;   a  US'   US''   S(U;   a  US(   US('   S)U;   a  US)   US)'   S*U;   a  US*   US*'   S+U;   a  US+   US+'   / nU
c`  [        5       n
[        R                  " S,U
 35        UR                  UU
UUR                  5       S--   UR                  5       S--   UUUUS..	5        [        5       n[        R                  " S,U
 S/U 35        UR                  UUU
UUS0UR                  5       S--   UR                  5       S--   UUUUUS1.5        [        R                  " S2U 35        U$ )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messagesrX   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   rt   namer<   r=   inputoutputro   ru   z and span with id llm)rt   r   rs   parent_span_idr   r   r<   r=   r   r   ro   ru   ry   z	Payload: )r"   r   rC   rP   dumpsr/   r#   
isinstancedictrs   rt   appendr   updater   	isoformat)r2   r3   r;   r<   r=   _litellm_paramslitellm_params_metadatalitellm_opik_metadatar   rr   rs   r   	opik_tagsrw   
input_dataoutput_datary   	span_name
trace_namero   payloadspan_ids                         r7   r@   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rh   )	r    r   r&   r(   r#   r'   r%   r!   r$   )__name__
__module____qualname____firstlineno____doc__r1   rK   r/   r   rY   r_   rc   rf   rj   r   r@   __static_attributes____classcell__)r6   s   @r7   r   r      s    -?^,c DcN 4 .s T#s(^ D ($M	dM Mrh   r   )r   r)   rP   rH   typingr   r   litellm._loggingr   (litellm.integrations.custom_batch_loggerr   &litellm.llms.custom_httpx.http_handlerr   r   r	   utilsr   r   r   r   r   r   rh   r7   <module>r      sA        + F  l" lrh   