Ë
    tPêjß  ã            
       ó"  — U d dl Z d dlZd dlZd dlZd dlmZmZ dZee   e	d<   defd„Z
deeef   fd„Zdededz  fd	„Zdded
edz  dedz  dedz  fd„Zd„ Zdeeef   deeef   fd„Zdeeeef      deeeeef      eeeef      f   fd„Zy)é    N)ÚAnyÚFinalz~/.opik.configÚCONFIG_FILE_PATH_DEFAULTÚreturnc                  ó2  — t        t        j                  «       dz  «      } t        t        j                  d«      «      }| j                  dd¬«      |dd d|d   dz  z  |d<   d	|d
   dz  z  |d
<   t        t        j                  t        |«      ¬«      «      S )aØ  Generate an RFC 9562 conformant UUIDv7 string.

    The top 48 bits encode the Unix timestamp in milliseconds. Opik's backend
    validates this embedded timestamp on ingestion (it must fall within a window
    around "now"), so the encoding has to be correct or trace/span batches are
    rejected with HTTP 400. Implemented with the standard library only, so no
    extra dependency is added to litellm. See ``opik.id_helpers`` for the
    reference implementation.
    iè  é   é   Úbig)Ú	byteorderr   ép   é   é€   é   é?   )Úbytes)
ÚintÚtimeÚ	bytearrayÚosÚurandomÚto_bytesÚstrÚuuidÚUUIDr   )Ú
unix_ts_msÚ
uuid_bytess     úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/opik/utils.pyÚcreate_uuid7r   
   s•   € ô œDŸI™I›K¨$Ñ.Ó/€Jô "¤"§*¡*¨R£.Ó1€Jð !×)Ñ)¨!°uÐ)Ó=€Jˆq�€Oð ˜J q™M¨DÑ0Ñ1€Jˆq�Mð ˜J q™M¨DÑ0Ñ1€Jˆq�MäŒt�y‰yœu ZÓ0Ô1Ó2Ð2ó    c            	      ó  — t         j                  j                  t        «      } t	        j
                  «       }|j                  | «       |j                  «       D �ci c]  }|t        |j                  |«      «      “Œ }}d|v r|d   S i S c c}w )NÚopik)
r   ÚpathÚ
expanduserr   ÚconfigparserÚConfigParserÚreadÚsectionsÚdictÚitems)Úconfig_pathÚconfigÚsectionÚconfig_valuess       r   Ú_read_opik_config_filer.   &   s~   € ÜŸ™×+Ñ+Ô,DÓE€Kä ×-Ñ-Ó/€FØ
‡K�K�ÔàPV×P_ÑP_ÓPaÖbÀW˜G¤T¨&¯,©,°wÓ*?Ó%@Ñ@Ðb€MÐbà�ÑØ˜VÑ$Ð$à€Iùò cs   Á"B
Úkeyc                 óT   — d}t        j                  || z   j                  «       d «      S )NÚopik_)r   ÚgetenvÚupper)r/   Ú
env_prefixs     r   Ú_get_env_variabler5   4   s&   € Ø€JÜ�9‰9�j 3Ñ&×-Ñ-Ó/°Ó6Ð6r   Ú
user_valueÚdefault_valuec                 óR   — |�|S t        | «      }|�|S t        «       }| |v r||    S |S )z²
    Get the configuration value of a variable, order priority is:
    1. user provided value
    2. environment variable
    3. Opik configuration file
    4. default value
    )r5   r.   )r/   r6   r7   Ú	env_valuer-   s        r   Úget_opik_config_variabler:   9   sM   € ð ÐØÐô )¨Ó-€IØÐØÐô 2Ó3€Mà
ˆmÑØ˜SÑ!Ð!ð Ðr   c                 ó¬   — i }| j                   �| j                   |d<   | j                  �| j                  |d<   | j                  �| j                  |d<   |S )NÚcompletion_tokensÚprompt_tokensÚtotal_tokens)r<   r=   r>   )ÚusageÚ
usage_dicts     r   Úcreate_usage_objectrA   T   sb   € Ø€Jà×ÑÐ*Ø*/×*AÑ*Aˆ
Ð&Ñ'Ø×ÑÐ&Ø&+×&9Ñ&9ˆ
�?Ñ#Ø×ÑÐ%Ø%*×%7Ñ%7ˆ
�>Ñ"ØÐr   Úxc                 ó\   — | j                  «       D ��ci c]  \  }}|€Œ	||“Œ c}}S c c}}w )zRemove None values from dict.)r)   )rB   ÚkÚvs      r   Ú_remove_nullsrF   `   s(   € àŸW™W›Y×8‘T�Q˜¨!©-ˆAˆq‰DÓ8Ð8ùÓ8s   ”
(Ÿ(Úpayloadc                 ó’   — | D �cg c]  }d|vsŒt        |«      ‘Œ }}| D �cg c]  }d|v sŒt        |«      ‘Œ }}||fS c c}w c c}w )aL  
    Separate traces and spans from payload.

    Traces are identified by not having a "type" field.
    Spans are identified by having a "type" field.

    Args:
        payload: List of dicts containing trace and span data

    Returns:
        Tuple of (traces, spans) where both are lists of dicts with null values removed
    Útype)rF   )rG   rB   ÚtracesÚspanss       r   Ú!get_traces_and_spans_from_payloadrL   e   sS   € ð 07ÖJ¨!¸&Èº/”] 1Õ%ÐJ€FÐJØ.5ÖE¨¸À1º”M !Õ$ÐE€EÐEØ�5ˆ=Ðùò KùÚEs   …	?�?¢	A¬A)NN)r$   r   r   r   Útypingr   r   r   r   Ú__annotations__r   r(   r.   r5   r:   rA   rF   ÚlistÚtuplerL   © r   r   ú<module>rR      sû   ðÜ Û 	Û Û ß à'7Ð ˜% ™*Ó 7ð3�có 3ð8  S¨# X¡ó ð7˜3ð 7 3¨¡:ó 7ñ
 #ð °3¸±:ð ÐUXÐ[_ÑU_ð ÐknÐquÑkuó ò6	ð9�T˜#˜s˜(‘^ð 9¨¨S°#¨X©ó 9ð
Ø�$�s˜C�x‘.Ñ!ðà
ˆ4��S˜#�X‘Ñ  d¨3°¨8¡nÑ!5Ð5Ñ6ôr   