
    AHj.                         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 	 dd
lmZ deeef   defdZ G d de      Zy# e$ r dZY "w xY w)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                 R    | j                  d      t        j                  d       yy)zHCheck if event should be skipped due to missing standard_logging_object.standard_logging_objectz;OpikLogger skipping event; no standard_logging_object foundTF)getr   debug)r   s    V/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/integrations/opik/opik.py_should_skip_eventr      s+    zz+,4I	
     c            
            e Zd ZdZdeddf fdZdeeef   dedededdf
d	Z	d
edeeef   deeef   ddfdZ
deeef   dedededdf
dZd
edeeef   deeef   ddfdZdeeef   fdZddZ xZS )
OpikLoggerz:
    Opik Logger for logging events to an Opik Server
    r   r   Nc                    t        t        j                        | _        t	               | _        t        j                  d|j                  dd       d      xs d| _	        t        j                  d|j                  dd       d      xs d}t        j                  d|j                  dd       d       }t        j                  d	|j                  d	d       d       }| d
| _
        | d| _        i | _        |r|| j                  d<   |r|| j                  d<   || _        || _        	 t        j                   | j#                                t        j$                         | _        t0        t1        j2                         | _        nd | _        t7        | p  di |d| j&                  i y # t(        $ r2}t+        j,                  dt/        |              d | _        Y d }~{d }~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_config_variabler   opik_project_name	trace_urlspan_urlheadersopik_workspaceopik_api_keyasynciocreate_taskperiodic_flushLockr&   	Exceptionr   	exceptionstrr   get_client_cached_opik_clientsuper__init__)selfr   opik_base_urlr1   r0   e	__class__s         r   r<   zOpikLogger.__init__)   s   "8-==#
 "3!4 **!::nd;/ !
 ! 	 **!::eT2> 0
 0 	 ',&D&D&**Y"=T'
 ).(F(FFJJ{D$AQU)
 "//GH -.EF').<DLL*+,8DLL)-;+7	# 3 3 566=llnDO " + = = ?D $D>6>doo>  	#$$qruvwrxqyz #DOO		#s   )<F* *	G%3(G  G%response_obj
start_timeend_timec                   K   	 t        |      ry t        j                  ||||| j                        \  }}| j                  || j                  j                  |j                  |j                  t        j                  |j                        t        j                  |j                        |j                  |j                  |j                  |j                  |j                   |j"                  
       | j                  j%                  |j                  |j&                  |j(                  |j                  |j*                  |j,                  t        j                  |j                        t        j                  |j                        |j                  |j                  |j                  |j                  |j.                  |j"                  |j0                  |j2                         y |%| j4                  j7                  |j8                         | j4                  j7                  |j8                         t;        j<                  d| j>                   d       tA        | j4                        | jB                  k\  r.t;        j<                  d       | jE                          d {    y y 7 # tF        $ r@}t;        jH                  dtK        |       dtM        jN                                 Y d }~y d }~ww xY ww)	Nr   rA   rB   rC   r   
idnamerB   rC   inputoutputmetadatatags	thread_idr   rG   trace_idparent_span_idrH   typemodelrB   rC   rI   rJ   rK   rL   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   build_opik_payloadr,   r:   tracerG   rH   r   fromisoformatrB   rC   rI   rJ   rK   rL   rM   r   spanrO   rP   rQ   rR   rS   rT   rU   	log_queueappend__dict__r   r   flush_intervallen
batch_sizeflush_queuer6   r7   r8   	traceback
format_excr=   r   rA   rB   rC   trace_payloadspan_payloadr?   s           r   async_log_success_eventz"OpikLogger.async_log_success_eventd   sx    ?	!&) +?*Q*Q)%!!33+'M<   , ,%%++(++*//#+#9#9-:R:R#S!)!7!78N8N!O+11,33!.!7!7*//"/"9"9%2%?%? ,  !!&&#)22#/#>#>%**%**&,,'55l6M6MN%33L4I4IJ&,,'..)22%**&,,!-!:!:)22+66! ' ( !,NN))-*@*@A%%l&;&;<$$J4K^K^J__jk t~~&$//9"(()FG**,,, :, 	$$;CF82iFZFZF\E]^ 	sX   K5J) K5GJ) &K5'B9J)  J'!J) %K5'J) )	K226K-(K5-K22K5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 - rW   )r*   postraise_for_statusstatus_coder6   textr   r7   r8   rc   rd   r=   r!   r/   ri   responser?   s         r   
_sync_sendzOpikLogger._sync_send   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                 <   	 t        |      ry t        j                  ||||| j                        \  }}| j                  || j                  j                  |j                  |j                  t        j                  |j                        t        j                  |j                        |j                  |j                  |j                  |j                  |j                   |j"                  
       | j                  j%                  |j                  |j&                  |j(                  |j                  |j*                  |j,                  t        j                  |j                        t        j                  |j                        |j                  |j                  |j                  |j                  |j.                  |j"                  |j0                  |j2                         y |5| j5                  | j6                  | j8                  d|j:                  gi       | j5                  | j<                  | j8                  d|j:                  gi       y # t>        $ r@}tA        jB                  dtE        |       dtG        jH                                 Y d }~y d }~ww xY w)	NrE   rF   rN   tracesr!   r/   ri   spansrV   rW   )%r   r   rX   r,   r:   rY   rG   rH   r   rZ   rB   rC   rI   rJ   rK   rL   rM   r   r[   rO   rP   rQ   rR   rS   rT   rU   ru   r-   r/   r^   r.   r6   r   r7   r8   rc   rd   re   s           r   log_success_eventzOpikLogger.log_success_event   sH   @	!&) +?*Q*Q)%!!33+'M<   , ,%%++(++*//#+#9#9-:R:R#S!)!7!78N8N!O+11,33!.!7!7*//"/"9"9%2%?%? ,  !!&&#)22#/#>#>%**%**&,,'55l6M6MN%33L4I4IJ&,,'..)22%**&,,!-!:!:)22+66! ' ( !,OO NN $'-*@*@)AB $   LL"\%:%:$;<   
  	$$;CF82iFZFZF\E]^ 	s$   I GI %A,I 	J6JJ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        |              Y d }~y d }~ww xY ww)Nrk   i,  zOpikLogger - Error: z - zOpikLogger - z Opik events submittedrn   )r)   ro   rp   rq   r   errorrr   infor`   r\   r6   r7   r8   rs   s         r   _submit_batchzOpikLogger._submit_batch  s     	T!4499u :  H %%'##s*$$*8+?+?*@HMM?S ###C$7#88NO  	T$$'I#a&%RSS	TsK   C!B( B&AB( 8C9,B( %C&B( (	C1!CCCCc                 v    i }| j                   r| j                   |d<   | j                  r| j                  |d<   |S )Nr$   r%   )r0   r1   )r=   r/   s     r   _create_opik_headerszOpikLogger._create_opik_headers  s?    "$)-)<)<G%&'+'8'8GO$r   c                 &  K   t        j                  d       | j                  sy t        j                  | j                        \  }}t        |      dkD  rT| j                  | j                  | j                  d|i       d {    t        j                  dt        |       d       t        |      dkD  rU| j                  | j                  | j                  d|i       d {    t        j                  dt        |       d       y y 7 7 *w)	NzCalling async_send_batchr   rw   rx   zSent z tracesry   z spans)
r   r}   r\   r   !get_traces_and_spans_from_payloadr`   r~   r-   r/   r.   )r=   rw   ry   s      r   async_send_batchzOpikLogger.async_send_batch#  s     67~~ ??O v;?$$NNDLL6@R %    %F}G <=u:>$$MM4<<?O %    %E
|6 :;	 	
s%   B DDA!D$D%)DD)r   N)__name__
__module____qualname____doc__r   r<   r   r8   r   rh   ru   rz   r~   r   r   __classcell__)r@   s   @r   r   r   $   s,   9? 9? 9?vFS#XF F 	F
 F 
FP!%c3h8<S#X	"GS#XG G 	G
 G 
GRTT!%c3hT8<S#XT	T(d38n <r   r   )r   r2   rc   r   typingr   r   r   litellm._loggingr   (litellm.integrations.custom_batch_loggerr   &litellm.llms.custom_httpx.http_handlerr	   r
   r    r   r   opik.api_objectsr   r6   r8   boolr   r   r'   r   r   <module>r      sx       & & + F  *,
tCH~ $ Q<" Q<  Ks   A A#"A#