Ë
    tPêj²0  ã                  ó>  — U d dl mZ d dlZd dlZd dlZd dlmZmZmZ d dl	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mZ d d
lmZmZ d dlmZ d dlmZmZ d dl m!Z! erd dl	m"Z" dZ#de$d<   dZ%de$d<    G d„ de«      Z&dd„Z'dd„Z(dd„Z)dd„Z* G d„ de«      Z+y)é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚFinal)ÚStatusÚ
StatusCode)Úoverride)Úverbose_logger)ÚSpanAttributes)Ú_utils)ÚOpenTelemetryÚOpenTelemetryConfig)ÚBaseLLMObsOTELAttributesÚsafe_set_attribute)Ú
safe_dumps)ÚWeaveOtelConfigÚWeaveSpanAttributes)ÚStandardCallbackDynamicParams)ÚSpanzhttps://trace.wandb.air   ÚWEAVE_BASE_URLz/otel/v1/tracesÚWEAVE_OTEL_ENDPOINTc                  ó,   — e Zd ZdZeedd„«       «       Zy)ÚWeaveLLMObsOTELAttributesz·
    Weave-specific LLM observability OTEL attributes.

    Weave automatically maps attributes from multiple frameworks including
    GenAI, OpenInference, Langfuse, and others.
    c                ó  — |j                  d«      xs g }|j                  d«      xs i }d|i}|j                  d«      }|j                  d«      }|�||d<   |�||d<   t        | t        j                  t	        j
                  |«      «       y)zFSet input messages as span attributes using OpenInference conventions.ÚmessagesÚoptional_paramsÚ	functionsÚtoolsN)Úgetr   ÚOpenInferenceSpanAttributesÚINPUT_VALUEÚjsonÚdumps)ÚspanÚkwargsr   r   Úpromptr   r   s          új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/weave/weave_otel.pyÚset_messagesz&WeaveLLMObsOTELAttributes.set_messages,   s‘   € ð
 !Ÿ*™* ZÓ0Ò6°BˆØ!'§¡Ð,=Ó!>Ò!DÀ"ˆà# XÐ.ˆØ*×.Ñ.¨{Ó;ˆ	Ø&×*Ñ*¨7Ó3ˆØÐ Ø"+ˆF�;ÑØÐØ#ˆF�7‰OÜ˜4Ô!<×!HÑ!HÌ$Ï*É*ÐU[ÓJ\Õ]ó    N)r$   r   r%   údict[str, Any])Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr	   r(   © r)   r'   r   r   $   s%   „ ñð Øò^ó ó ñ^r)   r   c                ó
  — |j                  d«      xs i }|j                  d«      xs i }|j                  d«      xs d}|j                  d«      xs d}|j                  d«      }|s|r|r|› d|› �}n|}|r7|j                  dd«      }t        | t        j                  j
                  |«       |j                  d	«      x}�kt        |t        t        f«      rt        |«      }t        | t        j                  j
                  |«       t        | t        j                  j
                  d«       |rUd
}	t        |d«      r|j                  «       }	nt        |d«      r|}	|	r%t        | t        j                  t        |	«      «       y
y
y
)zÖ
    Sets Weave-specific metadata attributes onto the OTEL span.

    Based on Weave's OTEL attribute mappings from:
    https://github.com/wandb/weave/blob/master/weave/trace_server/opentelemetry/constants.py
    Úlitellm_paramsÚmetadataÚmodelÚ Úcustom_llm_providerÚdisplay_nameú/Ú__Ú
session_idNTÚ
model_dumpr   )r   Úreplacer   r   ÚDISPLAY_NAMEÚvalueÚ
isinstanceÚlistÚdictr   Ú	THREAD_IDÚIS_TURNÚhasattrr;   r    ÚOUTPUT_VALUE)
r$   r%   Úresponse_objr2   r3   r4   r6   r7   r:   Úoutput_dicts
             r'   Ú_set_weave_specific_attributesrH   >   sh  € ð #ŸJ™JÐ'7Ó8Ò>¸B€Nà—j‘j Ó,Ò2°€HØ—:‘:˜gÓ&Ò,¨"€EØ!/×!3Ñ!3Ð4IÓ!JÒ!PÈbÐð —<‘< Ó/€LÙ™EÙØ1Ð2°!°E°7Ð;‰Là ˆLÙØ#×+Ñ+¨C°Ó6ˆÜ˜4Ô!4×!AÑ!A×!GÑ!GÈÔVð —l‘l <Ó0Ð0ˆ
Ð=Ü�j¤4¬ ,Ô/Ü# JÓ/ˆJÜ˜4Ô!4×!>Ñ!>×!DÑ!DÀjÔQÜ˜4Ô!4×!<Ñ!<×!BÑ!BÀDÔIñ ØˆÜ�< Ô.Ø&×1Ñ1Ó3‰KÜ�\ 5Ô)Ø&ˆKáÜ˜tÔ%@×%MÑ%MÌzÐZeÓOfÕgð ð r)   c                óx   — d| › �}t        j                  |j                  «       «      j                  «       }d|› �S )z{
    Get the authorization header for Weave OpenTelemetry.

    Weave uses Basic auth with format: api:<WANDB_API_KEY>
    zapi:zBasic )Úbase64Ú	b64encodeÚencodeÚdecode)Úapi_keyÚauth_stringÚauth_headers      r'   Ú_get_weave_authorization_headerrQ   l   s?   € ð   ˜yÐ)€KÜ×)Ñ)¨+×*<Ñ*<Ó*>Ó?×FÑFÓH€KØ�K�=Ð!Ð!r)   c                 ó  — t        j                  d«      } t        j                  d«      }t        j                  d«      }| st        d«      ‚|st        d«      ‚|rE|j                  d«      sd|z   }|j	                  d«      t
        z   }t        j                  d	|«       n#t        t
        z   }t        j                  d
|«       t        | ¬«      }d|› d|› �}|t         j                  d<   |t         j                  d<   t        |||d¬«      S )a  
    Retrieves the Weave OpenTelemetry configuration based on environment variables.

    Environment Variables:
        WANDB_API_KEY: Required. W&B API key for authentication.
        WANDB_PROJECT_ID: Required. Project ID in format <entity>/<project_name>.
        WANDB_HOST: Optional. Custom Weave host URL. Defaults to cloud endpoint.

    Returns:
        WeaveOtelConfig: A Pydantic model containing Weave OTEL configuration.

    Raises:
        ValueError: If required environment variables are missing.
    ÚWANDB_API_KEYÚWANDB_PROJECT_IDÚ
WANDB_HOSTz>WANDB_API_KEY must be set for Weave OpenTelemetry integration.zaWANDB_PROJECT_ID must be set for Weave OpenTelemetry integration. Format: <entity>/<project_name>Úhttpzhttps://r8   z'Using Weave OTEL endpoint from host: %szUsing Weave cloud endpoint: %s©rN   zAuthorization=z,project_id=ÚOTEL_EXPORTER_OTLP_ENDPOINTÚOTEL_EXPORTER_OTLP_HEADERSÚ	otlp_http)Úotlp_auth_headersÚendpointÚ
project_idÚprotocol)ÚosÚgetenvÚ
ValueErrorÚ
startswithÚrstripr   r
   Údebugr   rQ   Úenvironr   )rN   r]   Úhostr\   rP   r[   s         r'   Úget_weave_otel_configrg   w   s  € ô —Y‘Y˜Ó/€GÜŸ	™	Ð"4Ó5€JÜ�9‰9�\Ó"€DáÜÐYÓZÐZáÜØoó
ð 	
ñ Ø�‰˜vÔ&Ø Ñ$ˆDà—;‘;˜sÓ#Ô&9Ñ9ˆÜ×ÑÐFÈÕQä!Ô$7Ñ7ˆÜ×ÑÐ=¸xÔHô 9ÀÔI€KØ!/°¨}¸LÈÈÐUÐð 19„B‡J�JÐ,Ñ-Ø/@„B‡J�JÐ+Ñ,äØ+ØØØô	ð r)   c                óX   — t        j                  | ||t        «       t        | ||¬«       y)z›
    Sets OpenTelemetry span attributes for Weave observability.
    Uses the same attribute setting logic as other OTEL integrations for consistency.
    ©r$   r%   rF   N)r   Úset_attributesr   rH   ri   s      r'   Úset_weave_otel_attributesrk   ¬   s%   € ô
 ×Ñ˜$ ¨Ô6OÔPÜ"¨°VÈ,ÖWr)   c                  óV   ‡ — e Zd ZdZ	 	 d	 	 	 dˆ fd„Zd„ Z	 d	d„Zd„ Z	 	 	 	 d
d„Zˆ xZ	S )ÚWeaveOtelLoggeraØ  
    Weave (W&B) OpenTelemetry Logger for LiteLLM.

    Sends LLM traces to Weave via the OpenTelemetry Protocol (OTLP).

    Environment Variables:
        WANDB_API_KEY: Required. Weights & Biases API key for authentication.
        WANDB_PROJECT_ID: Required. Project ID in format <entity>/<project_name>.
        WANDB_HOST: Optional. Custom Weave host URL. Defaults to cloud endpoint.

    Usage:
        litellm.callbacks = ["weave_otel"]

        Or manually:
        from litellm.integrations.weave.weave_otel import WeaveOtelLogger
        weave_logger = WeaveOtelLogger(callback_name="weave_otel")
        litellm.callbacks = [weave_logger]

    Reference:
        https://docs.wandb.ai/weave/guides/tracking/otel
    c                óš   •— |€6t        «       }t        |j                  |j                  |j                  ¬«      }t        ‰| �  d||dœ|¤Ž y)zØ
        Initialize WeaveOtelLogger.

        If config is not provided, automatically configures from environment variables
        (WANDB_API_KEY, WANDB_PROJECT_ID, WANDB_HOST) via get_weave_otel_config().
        N)Úexporterr\   Úheaders)ÚconfigÚcallback_namer0   )rg   r   r^   r\   r[   ÚsuperÚ__init__)Úselfrq   rr   r%   Úweave_configÚ	__class__s        €r'   rt   zWeaveOtelLogger.__init__Ì   sP   ø€ ð ˆ>ä"7Ó"9ˆLä(Ø%×.Ñ.Ø%×.Ñ.Ø$×6Ñ6ôˆFô 	‰ÑÐN °mÑNÀvÓNr)   c                 ó   — y)zú
        Override to skip creating the raw_gen_ai_request child span.

        For Weave, we only want a single span per LLM call. The parent span
        already contains all the necessary attributes, so the child span
        is redundant.
        Nr0   )ru   r%   rF   Ú
start_timeÚend_timeÚparent_spans         r'   Ú_maybe_log_raw_requestz&WeaveOtelLogger._maybe_log_raw_requestä   s   � r)   c                óD  — | j                  |«      }|j                  | j                  |«      | j                  |«      |¬«      }|j	                  t        t        j                  «      «       | j                  |||«       |j                  | j                  |«      ¬«       |S )zú
        Override to always create a child span instead of reusing the parent span.

        This ensures that wrapper spans (like "B", "C", "D", "E") remain separate
        from the LiteLLM LLM call spans, creating proper nesting in Weave.
        )Únamery   Úcontext)rz   )
Úget_tracer_to_use_for_requestÚ
start_spanÚ_get_span_nameÚ_to_nsÚ
set_statusr   r   ÚOKrj   Úend)	ru   r%   rF   ry   rz   r   r{   Úotel_tracerr$   s	            r'   Ú_start_primary_spanz#WeaveOtelLogger._start_primary_spaní   s�   € ð  "×?Ñ?ÀÓGˆð "×,Ñ,Ø×$Ñ$ VÓ,Ø—{‘{ :Ó.Øð -ó 
ˆð
 	�‰œœzŸ}™}Ó-Ô.Ø×Ñ˜D &¨,Ô7Ø�‰˜$Ÿ+™+ hÓ/ˆÔ0Øˆr)   c                ój  — t        j                  d|| j                  «       | j                  |«      \  }}d}| j	                  ||||||«      }| j                  |||||«       | j                  ||¬«       | j                  ||||«       | j                  j                  r| j                  |||«       yy)zè
        Override to prevent ending externally created parent spans.

        When wrapper spans (like "B", "C", "D", "E") are provided as parent spans,
        they should be managed by the user code, not ended by LiteLLM.
        zGWeave OpenTelemetry Logger: Logging kwargs: %s, OTEL config settings=%sN)r%   r   )
r
   rd   rq   Ú_get_span_contextrˆ   r|   Ú_create_guardrail_spanÚ_record_metricsÚenable_eventsÚ_emit_semantic_logs)	ru   r%   rF   ry   rz   Úctxr{   Úprimary_span_parentr$   s	            r'   Ú_handle_successzWeaveOtelLogger._handle_success
  sÇ   € ô 	×ÑØUØØ�K‰Kô	
ð
  ×1Ñ1°&Ó9Ñˆˆ[ð &*Ðð ×.Ñ.¨v°|ÀZÐQYÐ[^Ð`sÓtˆð 	×#Ñ# F¨L¸*ÀhÐPTÔUð 	×#Ñ#¨6¸3Ð#Ô?ð 	×Ñ˜V \°:¸xÔHð �;‰;×$Ò$Ø×$Ñ$ V¨\¸4Õ@ð %r)   c                óŠ   — i }|j                  d«      }|j                  d«      }|rt        |¬«      }||d<   |r||d<   |r|S dS )zÔ
        Construct dynamic Weave headers from standard callback dynamic params.

        This is used for team/key based logging.

        Returns:
            dict: A dictionary of dynamic Weave headers
        Úwandb_api_keyÚweave_project_idrW   ÚAuthorizationr]   N)r   rQ   )ru   Ú standard_callback_dynamic_paramsÚdynamic_headersÚdynamic_wandb_api_keyÚdynamic_weave_project_idrP   s         r'   Úconstruct_dynamic_otel_headersz.WeaveOtelLogger.construct_dynamic_otel_headers1  sb   € ð "$ˆà'G×'KÑ'KÈOÓ'\ÐØ*J×*NÑ*NÐOaÓ*bÐ á Ü!@Ø-ô"ˆKð 0;ˆO˜OÑ,á#Ø,DˆO˜LÑ)á"1ˆÐ;°tÐ;r)   )NÚ
weave_otel)rq   zOpenTelemetryConfig | Nonerr   z
str | None)N)r–   r   Úreturnzdict | None)
r+   r,   r-   r.   rt   r|   rˆ   r‘   rš   Ú__classcell__)rw   s   @r'   rm   rm   µ   sU   ø„ ñð0 .2Ø$0ðOà*ðOð "õOò0ð  óò: AðN<Ø0Mð<à	÷<r)   rm   )r$   r   r%   r*   rF   r   )rN   Ústrrœ   rž   )rœ   r   ),Ú
__future__r   rJ   r"   r_   Útypingr   r   r   Úopentelemetry.tracer   r   Útyping_extensionsr	   Úlitellm._loggingr
   Ú*litellm.integrations._types.open_inferencer   r    Úlitellm.integrations.arizer   Ú"litellm.integrations.opentelemetryr   r   ÚElitellm.integrations.opentelemetry_utils.base_otel_llm_obs_attributesr   r   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Ú%litellm.types.integrations.weave_otelr   r   Úlitellm.types.utilsr   r   r   Ú__annotations__r   r   rH   rQ   rg   rk   rm   r0   r)   r'   ú<module>r¬      s�   ðÞ "ã Û Û 	ß ,Ñ ,ç 2Ý &å +õõ .ß Q÷õ Bß VÝ =áÝ(ð 1€�Ó 0Ø.Ð �UÓ .ô^Ð 8ô ^ó4+hó\"ó2ójXôU<�mõ U<r)   