Source code for taimoe.platform.types.observability

"""Observability payload models sent from runtime SDKs to the platform.

Trace and span IDs are W3C Trace Context format (lowercase hex). Pydantic
validators reject anything else at the boundary, so server-side audit
storage can rely on the format invariant without re-checking.
"""

from __future__ import annotations

from datetime import datetime
from typing import Any, Literal

from pydantic import BaseModel, ConfigDict, Field, field_validator

from taimoe.platform._ids import is_valid_span_id, is_valid_trace_id

SpanStatus = Literal["ok", "error"]
SpanType = Literal["agent", "llm", "tool", "policy", "workflow", "app", "custom"]


def _validate_trace_id(value: str) -> str:
    if not is_valid_trace_id(value):
        raise ValueError(
            f"Invalid trace_id {value!r}: expected 32 lowercase hex chars (W3C format)."
        )
    return value


def _validate_span_id(value: str) -> str:
    if not is_valid_span_id(value):
        raise ValueError(
            f"Invalid span_id {value!r}: expected 16 lowercase hex chars (W3C format)."
        )
    return value


[docs] class SpanEvent(BaseModel): """A single trace span emitted by a managed runtime.""" model_config = ConfigDict(frozen=True) trace_id: str span_id: str parent_span_id: str | None = None session_id: str | None = None runtime_id: str agent_id: str | None = None team_id: str | None = None span_type: SpanType = "custom" name: str status: SpanStatus = "ok" start_time: datetime end_time: datetime latency_ms: float input: Any = None output: Any = None error: str | None = None prompt_tokens: int | None = None completion_tokens: int | None = None cost_usd: float | None = None attributes: dict[str, Any] = Field(default_factory=dict) @field_validator("trace_id") @classmethod def _check_trace_id(cls, value: str) -> str: return _validate_trace_id(value) @field_validator("span_id") @classmethod def _check_span_id(cls, value: str) -> str: return _validate_span_id(value) @field_validator("parent_span_id") @classmethod def _check_parent_span_id(cls, value: str | None) -> str | None: return None if value is None else _validate_span_id(value)
[docs] class SpanBatch(BaseModel): """Batch upload payload for runtime observability spans.""" model_config = ConfigDict(frozen=True) runtime_id: str trace_id: str session_id: str | None = None spans: tuple[SpanEvent, ...] = () @field_validator("trace_id") @classmethod def _check_trace_id(cls, value: str) -> str: return _validate_trace_id(value)