Ë
    tPêj—-  ã                   óÈ   — d Z ddlZddlZddlm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 	 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ÚFinal)Ú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    úc/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/opik/opik.pyÚ_should_skip_eventr      s'   € à‡z�zÐ+Ó,Ð4Ü×ÑÐZÔ[ØØó    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$                  «       | _        t.        �t/        j0                  «       | _        nd | _        t5        ‰| �l  di |¤d| j&                  i¤Ž y # t(        $ r'}t+        j,                  d|«       d | _        Y d }~Œpd }~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ÚauthorizationzaOpikLogger - Asynchronous processing not initialized as we are not running in an async context %sÚ
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   Ú	exceptionr   Úget_client_cachedÚ_opik_clientÚsuperÚ__init__)Úselfr   Úopik_base_urlr0   r/   ÚeÚ	__class__s         €r   r:   zOpikLogger.__init__'   sÂ  ø€ Ü"8ÔFZ×FjÑFjÔ"kˆÔÜ!2Ó!4ˆÔô ×*Ñ*ØØ!Ÿ:™: n°dÓ;Ø/ôò !ð
 !ð 	Ôô ×*Ñ*ØØ!Ÿ:™: e¨TÓ2Ø>ôò 0ð
 0ð 	ô +0×*HÑ*HØ &§*¡*¨Y¸Ó"=ÈTô+
ˆô -2×,JÑ,JØ F§J¡J¨{¸DÓ$AÐQUô-
ˆð "/ Ð/GÐHˆŒØ -˜Ð.EÐFˆŒà')ˆŒÙØ.<ˆD�L‰LÐ*Ñ+áØ,8ˆD�L‰L˜Ñ)à*8ˆÔØ(4ˆÔð	#Ü×Ñ × 3Ñ 3Ó 5Ô6Ü3:·<±<³>ˆDŒOô Ð"Ü +× =Ñ =Ó ?ˆDÕà $ˆDÔä‰ÑÑ>˜6Ñ>¨d¯o©oÔ>øô ò 	#Ü×$Ñ$ØsÐuvôð #ˆD�O‰Oûð		#ú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>                  «       tA        | j4                  «      | jB                  k\  r.t;        j<                  d«       | jE                  «       ƒ d {  –—†  y y 7 Œ# tF        $ r3}t;        jH                  d|tK        jL                  «       «       Y d }~y d }~ww xY w­w)N©r   r?   r@   rA   r   ©
ÚidÚnamer@   rA   ÚinputÚoutputÚmetadataÚtagsÚ	thread_idr   ©rE   Útrace_idÚparent_span_idrF   ÚtypeÚmodelr@   rA   rG   rH   rI   rJ   Úusager   ÚproviderÚ
total_costzAOpikLogger added event to log_queue - Will flush in %s seconds...zOpikLogger - Flushing batchú.OpikLogger failed to log success event - %s
%s)'r   r   Úbuild_opik_payloadr+   r8   ÚtracerE   rF   r   Úfromisoformatr@   rA   rG   rH   rI   rJ   rK   r   ÚspanrM   rN   rO   rP   rQ   rR   rS   Ú	log_queueÚappendÚ__dict__r   r   Úflush_intervalÚlenÚ
batch_sizeÚflush_queuer5   r6   Ú	tracebackÚ
format_exc©r;   r   r?   r@   rA   Útrace_payloadÚspan_payloadr=   s           r   Úasync_log_success_eventz"OpikLogger.async_log_success_event`   sc  è ø€ ð=	sÜ! &Ô)Øô +?×*QÑ*QØØ)Ø%Ø!Ø!×3Ñ3ô+Ñ'ˆM˜<ð × Ñ Ñ,à Ð,Ø×%Ñ%×+Ñ+Ø(×+Ñ+Ø*×/Ñ/Ü#+×#9Ñ#9¸-×:RÑ:RÓ#SÜ!)×!7Ñ!7¸×8NÑ8NÓ!OØ+×1Ñ1Ø,×3Ñ3Ø!.×!7Ñ!7Ø*×/Ñ/Ø"/×"9Ñ"9Ø%2×%?Ñ%?ð ,ô ð ×!Ñ!×&Ñ&Ø#—‘Ø)×2Ñ2Ø#/×#>Ñ#>Ø%×*Ñ*Ø%×*Ñ*Ø&×,Ñ,Ü'×5Ñ5°l×6MÑ6MÓNÜ%×3Ñ3°L×4IÑ4IÓJØ&×,Ñ,Ø'×.Ñ.Ø)×2Ñ2Ø%×*Ñ*Ø&×,Ñ,Ø!-×!:Ñ!:Ø)×2Ñ2Ø+×6Ñ6ð! 'õ ð( !Ð,Ø—N‘N×)Ñ)¨-×*@Ñ*@ÔAØ—‘×%Ñ% l×&;Ñ&;Ô<ä×$Ñ$ØWÐY]×YlÑYlôô �t—~‘~Ó&¨$¯/©/Ò9Ü"×(Ñ(Ð)FÔGØ×*Ñ*Ó,×,Ñ,ð :à,ùÜò 	sÜ×$Ñ$Ð%VÐXYÔ[d×[oÑ[oÓ[q×rÑrûð	süsX   ‚K%„J& �K%�GJ& Ç&K%Ç'B6J& ÊJ$ÊJ& Ê"K%Ê$J& Ê&	K"Ê/)KËK%ËK"Ë"K%r    r.   Úbatchc                 óH  — 	 | j                   j                  |||¬«      }|j                  «        |j                  dk7  r%t	        d|j                  › d|j
                  › �«      ‚y # t        $ r3}t        j                  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: z'OpikLogger failed to send batch - %s
%s)
r)   ÚpostÚraise_for_statusÚstatus_coder5   Útextr   r6   r`   ra   ©r;   r    r.   rf   Úresponser=   s         r   Ú
_sync_sendzOpikLogger._sync_send¦   s©   € ð
	lØ"×4Ñ4×9Ñ9ØØØð :ó ˆHð
 ×%Ñ%Ô'Ø×#Ñ# sÒ*ÜÐ"FÀx×G[ÑG[ÐF\Ð\dÐem×erÑerÐdsÐ tÓuÐuð +øäò 	lÜ×$Ñ$Ð%OÐQRÔT]×ThÑThÓTj×kÑkûð	lús   ‚A"A% Á%	B!Á.)BÂ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>        $ r3}tA        jB                  d|tE        jF                  «       «       Y d }~y d }~ww xY w)NrC   rD   rL   Útraces©r    r.   rf   ÚspansrT   )$r   r   rU   r+   r8   rV   rE   rF   r   rW   r@   rA   rG   rH   rI   rJ   rK   r   rX   rM   rN   rO   rP   rQ   rR   rS   rq   r,   r.   r[   r-   r5   r   r6   r`   ra   rb   s           r   Úlog_success_eventzOpikLogger.log_success_event³   s:  € ð>	sÜ! &Ô)Øô +?×*QÑ*QØØ)Ø%Ø!Ø!×3Ñ3ô+Ñ'ˆM˜<ð × Ñ Ñ,à Ð,Ø×%Ñ%×+Ñ+Ø(×+Ñ+Ø*×/Ñ/Ü#+×#9Ñ#9¸-×:RÑ:RÓ#SÜ!)×!7Ñ!7¸×8NÑ8NÓ!OØ+×1Ñ1Ø,×3Ñ3Ø!.×!7Ñ!7Ø*×/Ñ/Ø"/×"9Ñ"9Ø%2×%?Ñ%?ð ,ô ð ×!Ñ!×&Ñ&Ø#—‘Ø)×2Ñ2Ø#/×#>Ñ#>Ø%×*Ñ*Ø%×*Ñ*Ø&×,Ñ,Ü'×5Ñ5°l×6MÑ6MÓNÜ%×3Ñ3°L×4IÑ4IÓJØ&×,Ñ,Ø'×.Ñ.Ø)×2Ñ2Ø%×*Ñ*Ø&×,Ñ,Ø!-×!:Ñ!:Ø)×2Ñ2Ø+×6Ñ6ð! 'õ ð( !Ð,Ø—O‘OØ ŸN™NØ $§¡Ø'¨-×*@Ñ*@Ð)AÐBð $ô ð —‘ØŸ™Ø ŸL™LØ" \×%:Ñ%:Ð$;Ð<ð  õ øô
 ò 	sÜ×$Ñ$Ð%VÐXYÔ[d×[oÑ[oÓ[q×rÑrûð	sús$   ‚I ŽGI Ç%A,I É	JÉ)J	Ê	Jc              ƒ   óž  K  — 	 | j                   j                  |||¬«      ƒ d {  –—† }|j                  «        |j                  dk\  r,t	        j
                  d|j                  |j                  «       y t	        j                  dt        | j                  «      «       y 7 Œy# t        $ r }t	        j                  d|«       Y d }~y d }~ww xY w­w)Nrh   i,  zOpikLogger - Error: %s - %sz%OpikLogger - %s Opik events submittedz$OpikLogger failed to send batch - %s)r(   rk   rl   rm   r   Úerrorrn   Úinfor]   rY   r5   r6   ro   s         r   Ú_submit_batchzOpikLogger._submit_batchú   s»   è ø€ ð	PØ$(×$;Ñ$;×$@Ñ$@ØØØð %Aó %÷ ˆHð
 ×%Ñ%Ô'à×#Ñ# sÒ*Ü×$Ñ$Ð%BÀH×DXÑDXÐZb×ZgÑZgÕhä×#Ñ#Ð$KÌSÐQU×Q_ÑQ_ÓM`Õaðùô ò 	PÜ×$Ñ$Ð%KÈQ×OÑOûð	PüsK   ‚C„!B! ¥B¦AB! Á4CÁ5)B! ÂCÂB! Â!	C
Â*CÃ CÃC
Ã
Cc                 óv   — i }| j                   r| j                   |d<   | j                  r| j                  |d<   |S )Nr#   r$   )r/   r0   )r;   r.   s     r   Ú_create_opik_headerszOpikLogger._create_opik_headers
  s?   € Ø)+ˆØ×ÒØ)-×)<Ñ)<ˆGÐ%Ñ&à×ÒØ'+×'8Ñ'8ˆG�OÑ$Øˆr   c              ƒ   ó  K  — t        j                  d«       | j                  sy t        j                  | j                  «      \  }}t        |«      dkD  rQ| j                  | j                  | j                  d|i¬«      ƒ d {  –—†  t        j                  dt        |«      «       t        |«      dkD  rR| j                  | j                  | j                  d|i¬«      ƒ d {  –—†  t        j                  dt        |«      «       y y 7 Œ„7 Œ'­w)NzCalling async_send_batchr   rs   rt   zSent %s tracesru   zSent %s spans)
r   ry   rY   r   Ú!get_traces_and_spans_from_payloadr]   rz   r,   r.   r-   )r;   rs   ru   s      r   Úasync_send_batchzOpikLogger.async_send_batch  sà   è ø€ Ü×ÑÐ6Ô7Ø�~Š~Øô ×?Ñ?ÀÇÁÓO‰ˆ�ô ˆv‹;˜Š?Ø×$Ñ$¨¯©ÀÇÁÐV^Ð`fÐUgÐ$Óh×hÐhÜ×ÑÐ 0´#°f³+Ô>Üˆu‹:˜Š>Ø×$Ñ$¨¯©ÀÇÁÐU\Ð^cÐTdÐ$Óe×eÐeÜ×Ñ ´°U³Õ<ð ð iøð fús%   ‚B DÂDÂADÃ!D	Ã"&DÄ	D)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r:   ÚdictÚstrr   re   rq   rv   rz   r|   r   Ú__classcell__)r>   s   @r   r   r   "   s:  ø„ ñð7? ð 7?¨õ 7?ðrDsà�S˜#�X‘ðDsð ðDsð ð	Dsð
 ðDsð 
óDsðLl˜cð l¨D°°c°©Nð lÀ4ÈÈSÈÁ>ð lÐVZó lðEsà�S˜#�X‘ðEsð ðEsð ð	Esð
 ðEsð 
óEsðNP sð P°T¸#¸s¸(±^ð PÈDÐQTÐVYÐQYÉNð PÐ_có Pð  d¨3°¨8¡nó ÷=r   r   )rƒ   r1   r`   r   Útypingr   r   Úlitellm._loggingr   Ú(litellm.integrations.custom_batch_loggerr   Ú&litellm.llms.custom_httpx.http_handlerr   r	   r
   Ú r   r   Úopik.api_objectsr   r5   r„   r…   Úboolr   r   r&   r   r   ú<module>rŽ      su   ðñó Û Ý ß å +Ý F÷ñ ÷ *ðÝ,ð
˜t C¨ H™~ð °$ó ô=Ð"õ =øð ò Ø‚Kðús   ¸A ÁA!Á A!