Ë
    tPêjö  ã                   óÂ   — d 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 ddlmZ dd	lmZ dd
lmZ erddlmZ ddlmZ eZeez  ZneZeZ G d„ de«      Zy)zO
arize AI is OTEL compatible

this file has Arize ai specific helper functions
é    N)Údatetime)ÚTYPE_CHECKINGÚAnyÚFinal)Ú_utils)ÚArizeOTELAttributes)ÚOpenTelemetry)ÚArizeConfig)ÚServiceLoggerPayload)ÚStandardCallbackDynamicParams)ÚSpan)ÚProtocolc                   ó  — e Zd ZdZd„ Zd„ Zdededz  fd„Ze	defd„«       Z
e	d	efd
„«       Z	 	 	 	 ddededz  deez  dz  deez  dz  dedz  f
d„Z	 	 	 	 	 ddededz  dedz  deez  dz  deez  dz  dedz  fd„Zd„ Zded	edz  fd„Zy)ÚArizeLoggera"  
    Arize logger that sends traces to an Arize endpoint.

    Creates its own dedicated TracerProvider so it can coexist with the
    generic ``otel`` callback (or any other OTEL-based integration) without
    fighting over the global ``opentelemetry.trace`` TracerProvider singleton.
    c                 ó  — ddl m} ddlm} |�|j	                  d«      | _        || _        y || j                  | j                  «      ¬«      }|j                  | j                  «       «       |j	                  d«      | _        || _        y)z“
        Override to always create a *private* TracerProvider for Arize.

        See ArizePhoenixLogger._init_tracing for full rationale.
        r   )ÚTracerProvider)ÚSpanKindNÚlitellm)Úresource)Úopentelemetry.sdk.tracer   Úopentelemetry.tracer   Ú
get_tracerÚtracerÚ	span_kindÚ_get_litellm_resourceÚconfigÚadd_span_processorÚ_get_span_processor)ÚselfÚtracer_providerr   r   Úproviders        úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/arize/arize.pyÚ_init_tracingzArizeLogger._init_tracing'   su   € õ 	;Ý0àÐ&Ø)×4Ñ4°YÓ?ˆDŒKØ%ˆDŒNØá(°$×2LÑ2LÈTÏ[É[Ó2YÔZˆØ×#Ñ# D×$<Ñ$<Ó$>Ô?Ø×)Ñ)¨)Ó4ˆŒØ!ˆ�ó    c                  ó   — y)zÓ
        Override: Arize should NOT overwrite the proxy's
        ``open_telemetry_logger``.  That attribute is reserved for the
        primary ``otel`` callback which handles proxy-level parent spans.
        N© )r   s    r"   Ú"_init_otel_logger_on_litellm_proxyz.ArizeLogger._init_otel_logger_on_litellm_proxy:   s   � r$   ÚspanÚresponse_objNc                 ó2   — t         j                  |||«       y ©N)r   Úset_arize_attributes)r   r(   Úkwargsr)   s       r"   Úset_attributeszArizeLogger.set_attributesA   s   € Ü×(Ñ(¨¨v°|ÕDr$   c                 ó<   — t        j                  | ||t        «       y r+   )r   r.   r   )r(   r-   r)   s      r"   r,   z ArizeLogger.set_arize_attributesD   s   € ä×Ñ˜d F¨LÔ:MÕNr$   Úreturnc                  óÄ  — t         j                  j                  d«      } t         j                  j                  d«      }t         j                  j                  d«      }t         j                  j                  d«      }t         j                  j                  d«      }t         j                  j                  d«      }d}d}|rd}|}n|rd	}|}nd}d
}t        | |||||¬«      S )zñ
        Helper function to get Arize configuration.

        Returns:
            ArizeConfig: A Pydantic model containing Arize configuration.

        Raises:
            ValueError: If required environment variables are not set.
        ÚARIZE_SPACE_IDÚARIZE_SPACE_KEYÚARIZE_API_KEYÚARIZE_PROJECT_NAMEÚARIZE_ENDPOINTÚARIZE_HTTP_ENDPOINTNÚ	otlp_grpcÚ	otlp_httpzhttps://otlp.arize.com/v1)Úspace_idÚ	space_keyÚapi_keyÚprotocolÚendpointÚproject_name)ÚosÚenvironÚgetr
   )r:   r;   r<   r?   Úgrpc_endpointÚhttp_endpointr>   r=   s           r"   Úget_arize_configzArizeLogger.get_arize_configH   sÂ   € ô Ÿ*™*Ÿ.™.Ð)9Ó:ˆÜŸ:™:Ÿ>™>Ð*;Ó<ˆ	ÜŸ™Ÿ™¨Ó8ˆÜ Ÿj™jŸn™nÐ-AÓBˆä!Ÿz™zŸ~™~Ð.>Ó?ˆÜ!Ÿz™zŸ~™~Ð.CÓDˆàˆØ(ˆáØ"ˆHØ$‰HÙØ"ˆHØ$‰Hà"ˆHØ2ˆHäØØØØØØ%ô
ð 	
r$   ÚpayloadÚparent_otel_spanÚ
start_timeÚend_timeÚevent_metadatac              ƒ   ó   K  — y­w©zaArize is used mainly for LLM I/O tracing, sending router+caching metrics adds bloat to arize logsNr&   )r   rF   rG   rH   rI   rJ   s         r"   Úasync_service_success_hookz&ArizeLogger.async_service_success_hookq   ó   è ø� ùó   ‚Úerrorc              ƒ   ó   K  — y­wrL   r&   )r   rF   rP   rG   rH   rI   rJ   s          r"   Úasync_service_failure_hookz&ArizeLogger.async_service_failure_hook{   rN   rO   c              ƒ   óÎ   K  — 	 | j                  «       }|j                  s|j                  sdddœS |j                  sdddœS dddœS # t        $ r}dd|› �dœcY d	}~S d	}~ww xY w­w)
z�
        Performs a health check for Arize integration.

        Returns:
            dict: Health check result with status and message
        Ú	unhealthyz>ARIZE_SPACE_ID or ARIZE_SPACE_KEY environment variable not set)ÚstatusÚerror_messagez*ARIZE_API_KEY environment variable not setÚhealthyz)Arize credentials are configured properly)rU   ÚmessagezArize health check failed: N)rE   r:   r;   r<   Ú	Exception)r   r   Úes      r"   Úasync_health_checkzArizeLogger.async_health_checkŽ   s‹   è ø€ ð	Ø ×1Ñ1Ó3ˆFà—?’?¨6×+;Ò+;à)Ø%eñð ð
 —>’>à)Ø%Qñð ð $ØFñð øô
 ò 	à%Ø#>¸q¸cÐ!Bñõ ûð	üsJ   ‚A%„,A °A%±A ÁA%ÁA ÁA%Á	A"ÁAÁA"ÁA%ÁA"Á"A%Ú standard_callback_dynamic_paramsc                 óè   — i }|j                  d«      r|j                  d«      |d<   |j                  d«      r|j                  d«      |d<   |j                  d«      r|j                  d«      |d<   |S )zÓ
        Construct dynamic Arize headers from standard callback dynamic params

        This is used for team/key based logging.

        Returns:
            dict: A dictionary of dynamic Arize headers
        Úarize_space_idzarize-space-idÚarize_space_keyÚarize_api_keyr<   )rB   )r   r\   Údynamic_headerss      r"   Úconstruct_dynamic_otel_headersz*ArizeLogger.construct_dynamic_otel_headers¯   s‚   € ð "$ˆð ,×/Ñ/Ð0@ÔAØ0P×0TÑ0TÐUeÓ0fˆOÐ,Ñ-Ø+×/Ñ/Ð0AÔBØ0P×0TÑ0TÐUfÓ0gˆOÐ,Ñ-ð
 ,×/Ñ/°Ô@Ø)I×)MÑ)MÈoÓ)^ˆO˜IÑ&àÐr$   )NNNN)Ú NNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r'   r   r   r.   Ústaticmethodr,   r
   rE   r   r   ÚfloatÚdictrM   ÚstrrR   r[   r   rb   r&   r$   r"   r   r      s`  „ ñò"ò&ðE 4ð E¸sÀT¹zó Eð ðO 4ò Oó ðOð ð&
˜kò &
ó ð&
ðV )-Ø.2Ø,0Ø&*ñpà%ðpð  ™+ðpð ˜uÑ$ tÑ+ð	pð
 ˜UÑ" TÑ)ðpð ˜t™ópð Ø(,Ø.2Ø,0Ø&*ñ	pà%ð	pð �T‰zð	pð  ™+ð		pð
 ˜uÑ$ tÑ+ð	pð ˜(Ñ" TÑ)ð	pð ˜t™ó	pò&ðBØ0Mðà	�‰ôr$   r   )rg   r@   r   Útypingr   r   r   Úlitellm.integrations.arizer   Ú!litellm.integrations.arize._utilsr   Ú"litellm.integrations.opentelemetryr	   Ú litellm.types.integrations.arizer
   Úlitellm.types.servicesr   Úlitellm.types.utilsr   r   r   Ú_Spanr   Ú	_Protocolr   r&   r$   r"   ú<module>ru      sY   ðñó 
Ý ß ,Ñ ,å -Ý AÝ <Ý 8Ý 7Ý =áÝ1åFà€HØ�3‰;�Dà€HØ€Dôm�-õ mr$   