Ë
    tPêj0  ã                   ó  — U d 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mZmZmZ ddlmZmZmZ ddlmZmZmZ dZeed	<    G d
„ de«      Z G d„ dee«      Z G d„ de«      Z ed¬«      defd„«       Z G d„ de«      Z G d„ de«      Z y)z:Typed configuration for the OpenTelemetry instrumentation.é    )ÚEnum)Ú	lru_cache)Ú	AnnotatedÚAnyÚFinal)ÚAliasChoicesÚ	BaseModelÚFieldÚfield_validatorÚmodel_validator)ÚBaseSettingsÚNoDecodeÚSettingsConfigDict)ÚBAGGAGE_PROMOTED_KEYSÚDEFAULT_BAGGAGE_METADATA_KEYSÚ"DEFAULT_BAGGAGE_TEAM_METADATA_KEYSÚLITELLM_OTEL_V2ÚOTEL_V2_ENVc                   ó   — e Zd ZdZdZdZdZy)ÚCaptureMessageContentÚ
no_contentÚ	span_onlyÚ
event_onlyÚspan_and_eventN)Ú__name__Ú
__module__Ú__qualname__Ú
NO_CONTENTÚ	SPAN_ONLYÚ
EVENT_ONLYÚSPAN_AND_EVENT© ó    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/otel/model/config.pyr   r      s   „ Ø€JØ€IØ€JØ%�Nr#   r   c                   ó,   — e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
ÚExporterOwnera:  The preset that contributed an exporter. Values match the callback names
    in ``presets.PRESET_BY_CALLBACK`` so per-request dynamic-credential routing
    can match an exporter's owner against the credential source's callback name.
    A ``str`` enum so the value compares equal to the bare callback-name string.ÚarizeÚarize_phoenixÚlangfuse_otelÚ
weave_otelÚlevoÚagentopsÚnewrelicN)r   r   r   Ú__doc__ÚARIZE_AXÚARIZE_PHOENIXÚLANGFUSE_OTELÚ
WEAVE_OTELÚLEVOÚAGENTOPSÚNEWRELICr"   r#   r$   r&   r&      s-   „ ñTð €HØ#€MØ#€MØ€JØ€DØ€HØ�Hr#   r&   c                   óJ   — e Zd ZU  ed¬«      Z ed ee«      ¬«      Ze	e
d<   y)Ú_OTelV2FlagÚignore)ÚextraF©ÚdefaultÚvalidation_aliasÚenabledN)r   r   r   r   Úmodel_configr
   r   r   r=   ÚboolÚ__annotations__r"   r#   r$   r7   r7   -   s"   … Ù%¨HÔ5€Lá %¹,À{Ó:SÔT€GˆTÔTr#   r7   é   )ÚmaxsizeÚreturnc                  ó*   — t        «       j                  S ©N)r7   r=   r"   r#   r$   Úis_otel_v2_enabledrF   3   s   € ô ‹=× Ñ Ð r#   c                   óô   — e Zd ZU dZddiZ edd¬«      Zeed<   dZ	edz  ed	<   dZ
edz  ed
<    edd¬«      Zedz  ed<    edd¬«      Zeeef   dz  ed<    edd¬«      Zedz  ed<    edd¬«      Zeed<   y)ÚExporterSpeczãOne span-export destination.

    The shared ``TracerProvider`` attaches one ``SpanProcessor`` per spec, so
    listing several specs sends every span to all of them at once (e.g. Arize +
    Phoenix + your own Honeycomb).
    r9   ÚforbidÚconsolez<console | in_memory | otlp_http | otlp_grpc | <factory kind>)r;   ÚdescriptionÚkindNÚendpointÚheaderszåThe preset that contributed this exporter. Per-request dynamic OTLP credentials are applied only to the exporter whose owner matches the credential source, so one tenant's vendor key never lands on a different backend's exporter.ÚownerzëFactory-specific configuration for a custom exporter ``kind`` registered via ``providers.register_exporter_factory`` (e.g. an API key a lazy-auth exporter fetches a token with). Ignored by the built-in console/in_memory/otlp exporters.ÚoptionszuForce SimpleSpanProcessor regardless of exporter kind. Default: auto (Simple for console/in_memory, Batch otherwise).Úuse_simple_processorFa  Skip this exporter when no headers are resolved. For destinations that reject unauthenticated exports (e.g. New Relic), a spec kept only as the per-request credential-stamping target would otherwise export keyless traffic and produce a 4xx for every span batch.Úrequires_headers)r   r   r   r.   r>   r
   rL   Ústrr@   rM   rN   rO   r&   rP   ÚdictrQ   r?   rR   r"   r#   r$   rH   rH   <   sÌ   … ñð ˜XÐ&€LáØØRô€Dˆ#ó ð  €Hˆc�D‰jÓØ€GˆS�4‰ZÓÙ"'Øð,ô#€Eˆ=˜4Ñó ñ &+Øð9ô&€GˆT�#�s�(‰^˜dÑ"ó ñ ).ØðDô)Ð˜$ ™+ó ñ #ØðMôÐ�dô r#   rH   c                   ó¼  — e Zd ZU  edd¬«      Z ed edd«      d¬«      Zee	d	<    ed
 edd«      ¬«      Z
ed
z  e	d<    ed
 edd«      ¬«      Zed
z  e	d<    ed ed«      ¬«      Zee	d<    ed
 ed«      ¬«      Zed
z  e	d<    ed ed«      ¬«      Zee	d<    ed ed«      ¬«      Zee	d<    eej$                   ed«      ¬«      Zee	d<    ed ed«      ¬«      Zee	d<    eed ¬!«      Zee   e	d"<    ed#„ d$¬!«      Zeee   ef   e	d%<    eed&¬!«      Zeeef   e	d'<    ed(„  ed)d*«      d+¬,«      Zeee   ef   e	d)<    ed-„  ed.d/«      d0¬,«      Zeee   ef   e	d.<    ed1„  ed2d3«      d4¬,«      Zeee   ef   e	d2<    e dd5¬6«      e!d7e"d8e"fd9„«       «       Z# e d)d.d2d%d5¬6«      e!d7e$d8e$fd:„«       «       Z% e&d;¬6«      d?d<„«       Z'e(d8efd=„«       Z)e!d?d>„«       Z*y
)@ÚOpenTelemetryV2ConfigTr8   )Úpopulate_by_namer9   rJ   ÚOTEL_EXPORTERÚOTEL_EXPORTER_OTLP_PROTOCOLzëExporter kind for the single-destination shorthand. The model validator folds this (with ``endpoint`` / ``headers``) into a one-entry ``exporters`` list when ``exporters`` is empty; set ``exporters`` directly for multiple destinations.)r;   r<   rK   ÚexporterNÚOTEL_ENDPOINTÚOTEL_EXPORTER_OTLP_ENDPOINTr:   rM   ÚOTEL_HEADERSÚOTEL_EXPORTER_OTLP_HEADERSrN   ÚlitellmÚOTEL_SERVICE_NAMEÚservice_nameÚOTEL_ENVIRONMENT_NAMEÚdeployment_environmentFÚ'LITELLM_OTEL_INTEGRATION_ENABLE_METRICSÚenable_metricsÚ&LITELLM_OTEL_INTEGRATION_ENABLE_EVENTSÚenable_eventsÚ2OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENTÚcapture_message_contentÚLITELLM_OTEL_LEGACY_COMPATÚlegacy_compatzõOne destination per spec. The shared TracerProvider attaches a SpanProcessor per entry. When empty, the model validator folds the ``exporter`` / ``endpoint`` / ``headers`` shorthand into a single spec so there is always at least one destination.)Údefault_factoryrK   Ú	exportersc                  ó   — dgS )NÚgenair"   r"   r#   r$   ú<lambda>zOpenTelemetryV2Config.<lambda>¤   s   €   	€ r#   zÏOrdered attribute vocabularies to emit. ``genai`` is the canonical OTel GenAI vocabulary and is always placed first. Vendor names: ``openinference`` (Arize + Phoenix), ``langfuse``, ``weave``, ``langtrace``.Úmapper_nameszuExtra Resource attributes beyond ``service.name`` and ``deployment.environment`` (e.g. integration-specific markers).Úresource_attributesc                  ó    — t        t        «      S rE   )Úlistr   r"   r#   r$   rp   zOpenTelemetryV2Config.<lambda>¶   s   € ¤Ô%:Ó ;€ r#   Úbaggage_promoted_keysÚ"LITELLM_OTEL_BAGGAGE_PROMOTED_KEYSa  Identity attribute keys written into Baggage and stamped on every child span (e.g. ``litellm.team.id``). Configure via the ``LITELLM_OTEL_BAGGAGE_PROMOTED_KEYS`` env var (comma-separated) or ``callback_settings.otel.baggage_promoted_keys`` in config.yaml (a YAML list).)rl   r<   rK   c                  ó    — t        t        «      S rE   )rt   r   r"   r#   r$   rp   zOpenTelemetryV2Config.<lambda>Á   s   € ¤Ô%BÓ C€ r#   Úbaggage_metadata_keysÚ"LITELLM_OTEL_BAGGAGE_METADATA_KEYSzÝMetadata sub-keys promoted under the ``litellm.metadata.*`` namespace. Configure via the ``LITELLM_OTEL_BAGGAGE_METADATA_KEYS`` env var (comma-separated) or ``callback_settings.otel.baggage_metadata_keys`` in config.yaml.c                  ó    — t        t        «      S rE   )rt   r   r"   r#   r$   rp   zOpenTelemetryV2Config.<lambda>Ë   s   € ¤Ô%GÓ H€ r#   Úbaggage_team_metadata_keysÚ'LITELLM_OTEL_BAGGAGE_TEAM_METADATA_KEYSaS  Sub-keys of the team's free-form metadata promoted under ``litellm.team.metadata``. Empty by default so none of a team's metadata leaves the process until explicitly allowlisted. Configure via the ``LITELLM_OTEL_BAGGAGE_TEAM_METADATA_KEYS`` env var (comma-separated) or ``callback_settings.otel.baggage_team_metadata_keys`` in config.yaml.Úbefore)ÚmodeÚvaluerC   c                 óF   — t        |t        «      r|j                  «       S |S )ap  Fold the capture mode to its canonical lower_snake_case form.

        V1 read this env var case-insensitively, so operators set the
        UPPER_SNAKE_CASE form (e.g. ``SPAN_AND_EVENT``). The canonical values
        here are lower_snake_case; normalizing at the boundary keeps both
        spellings working and lets every downstream comparison stay exact.
        )Ú
isinstancerS   Úlower)Úclsr   s     r$   Ú"_normalize_capture_message_contentz8OpenTelemetryV2Config._normalize_capture_message_content×   s   € ô �eœSÔ!Ø—;‘;“=Ð Øˆr#   c                 ó¬   — t        |t        «      r>|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}S |S c c}w )aª  Accept a comma-separated string for list fields.

        Env vars are strings, but these fields are lists. Pydantic-settings would
        otherwise require JSON for a list env var; splitting on commas here lets
        an operator write ``LITELLM_OTEL_BAGGAGE_PROMOTED_KEYS=litellm.team.id,litellm.api_key.hash``.
        YAML lists (from ``callback_settings.otel.*``) and real lists pass through
        unchanged.
        ú,)r�   rS   ÚsplitÚstrip)rƒ   r   Úitems      r$   Ú
_split_csvz OpenTelemetryV2Config._split_csvå   sA   € ô" �eœSÔ!Ø-2¯[©[¸Ó-=ÖN TÀÇÁÅ�D—J‘J•LÒNÐNØˆùò Os
   ¤AºAÚafterc                 ó”  — | j                   r| j                  dk(  rd| _        | j                  s2t        | j                  | j                   | j                  ¬«      g| _        t        | j                  «      }d|v rdg|D �cg c]
  }|dk7  sŒ	|‘Œ c}z   }ndg|z   }| j                  rd|vr|j                  d«       || _        | S c c}w )NrJ   Ú	otlp_http)rL   rM   rN   ro   Úlegacy)	rM   rZ   rm   rH   rN   rt   rq   rk   Úappend)ÚselfÚnamesÚns      r$   Ú
_normalizez OpenTelemetryV2Config._normalizeú   sÀ   € ð �=Š=˜TŸ]™]¨iÒ7Ø'ˆDŒMð �~Š~äØŸ™Ø!Ÿ]™]Ø ŸL™LôðˆDŒNô �T×&Ñ&Ó'ˆØ�eÑØ�I¨EÖ B q°Q¸'³\¢Ò BÑB‰Eà�I Ñ%ˆEð ×Ò (°%Ñ"7Ø�L‰L˜Ô"Ø!ˆÔØˆùò !Cs   Â 
CÂCc                 óZ   — | j                   t        j                  t        j                  fv S )a6  Whether prompt/response content may be stamped as span attributes.

        Defaults off (``no_content``): an operator must opt in before message
        bodies leave the process, so a user request can never force its prompt
        or completion into the configured backend while capture is disabled.
        )ri   r   r   r!   )r�   s    r$   Úcapture_span_contentz*OpenTelemetryV2Config.capture_span_content  s.   € ð ×+Ñ+Ü!×+Ñ+Ü!×0Ñ0ð0
ð 
ð 	
r#   c                 ó   —  | «       S rE   r"   )rƒ   s    r$   Úfrom_envzOpenTelemetryV2Config.from_env$  s	   € á‹uˆr#   )rC   rV   )+r   r   r   r   r>   r
   r   rZ   rS   r@   rM   rN   ra   rc   re   r?   rg   r   r   ri   rk   rt   rm   rH   rq   r   r   rT   rr   ru   rx   r{   r   ÚclassmethodÚobjectr„   r   rŠ   r   r“   Úpropertyr•   r—   r"   r#   r$   rV   rV   p   s  … Ù%°tÀ8ÔL€Lñ ØÙ% oÐ7TÓUð@ô		€Hˆcó 	ñ !ØÙ% oÐ7TÓUô€Hˆc�D‰jó ñ  ØÙ% nÐ6RÓSô€GˆS�4‰Zó ñ  iÁ,ÐObÓBcÔd€L�#ÓdÙ).°tÉlÐ[rÓNsÔ)tÐ˜C $™JÓtá ØÙ%Ð&OÓPô€N�Dó ñ  ØÙ%Ð&NÓOô€M�4ó ñ $)Ø%×0Ñ0Ù%Ð&ZÓ[ô$Ð˜Só ñ  ¨¹|ÐLhÓ?iÔj€M�4Ójñ %*ØðGô%€Iˆt�LÑ!ó ñ 49Ù)ð(ô4€L�)˜D ™I xÐ/Ñ0ó ñ +0ØðNô+Ð˜˜c 3˜h™ó ñ =BÙ;Ù%Ð&=Ð?cÓdðô	
=Ð˜9 T¨#¡Y°Ð%8Ñ9ó 
ñ =BÙCÙ%Ð&=Ð?cÓdðOô		=Ð˜9 T¨#¡Y°Ð%8Ñ9ó 	ñ BGÙHÙ%Ð&BÐDmÓnðTô	BÐ 	¨$¨s©)°XÐ*=Ñ >ó ñ Ð.°XÔ>Øð
°vð 
À&ò 
ó ó ?ð
ñ ØØØ$ØØôð ð˜sð  sò ó óðñ ˜'Ô"òó #ðð8 ð

 dò 

ó ð

ð òó ñr#   rV   N)!r.   Úenumr   Ú	functoolsr   Útypingr   r   r   Úpydanticr   r	   r
   r   r   Úpydantic_settingsr   r   r   Ú'litellm.integrations.otel.model.baggager   r   r   r   r@   rS   r   r&   r7   r?   rF   rH   rV   r"   r#   r$   ú<module>r¡      s™   ðÚ @å Ý ß (Ñ (ç UÕ Uß HÑ H÷ñ ð '€ˆUÓ &ô&˜Cô &ô�C˜ô ô$U�,ô Uñ �1Ôð!˜Dò !ó ð!ô1�9ô 1ôhv˜Lõ vr#   