from __future__ import annotations from typing import Any, Optional from pydantic import BaseModel, ConfigDict, Field class MountedAISourceItem(BaseModel): model_config = ConfigDict(extra="ignore") source_system: str run_count: int = 0 topic_count: int = 0 active_topic_count: int = 0 last_seen_at: Optional[str] = None class MountedAISourceListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAISourceItem] = Field(default_factory=list) class MountedAITopicItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int topic_key: str source_system: str channel_ref: Optional[str] = None thread_key: Optional[str] = None mode: str status: str readiness_score: Optional[float] = None draft_state: Optional[str] = None draft_version: Optional[int] = None updated_at: Optional[str] = None class MountedAITopicListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAITopicItem] = Field(default_factory=list) total: int = 0 class MountedAIRunItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int trace_id: str source_system: str source_message_id: Optional[str] = None mode_before: Optional[str] = None mode_after: Optional[str] = None active_agent: Optional[str] = None status: str trigger_reason: Optional[str] = None final_reply: Optional[str] = None trace_count: int = 0 updated_at: Optional[str] = None class MountedAIRunListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAIRunItem] = Field(default_factory=list) total: int = 0 class MountedAIAgentTraceItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int agent_name: str status: str latency_ms: Optional[int] = None failure_reason: Optional[str] = None created_at: Optional[str] = None class MountedAIRunDetailPayload(BaseModel): model_config = ConfigDict(extra="ignore") item: MountedAIRunItem agent_traces: list[MountedAIAgentTraceItem] = Field(default_factory=list) context_layers_hit: Optional[Any] = None tool_calls: Optional[Any] = None execution_outcome: Optional[Any] = None class MountedAICutoverStatusPayload(BaseModel): model_config = ConfigDict(extra="ignore") mounted_runtime_ready: bool topic_workspace_count: int = 0 conversation_run_count: int = 0 tool_policy_count: int = 0 observed_source_systems: list[str] = Field(default_factory=list) legacy_cutover_state: str retired_item_count: int = 0 active_item_count: int = 0 legacy_cutover_items: list["MountedAILegacyCutoverItem"] = Field(default_factory=list) class MountedAILegacyCutoverItem(BaseModel): model_config = ConfigDict(extra="ignore") key: str title: str status: str summary: str evidence: str class MountedAIEvalSuiteItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int dataset_type: str version: str status: str suite_kind: str sample_count: int = 0 latest_score: Optional[float] = None last_evaluated_at: Optional[str] = None class MountedAIEvalSuiteListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAIEvalSuiteItem] = Field(default_factory=list) total: int = 0 class MountedAIEvalResultItem(BaseModel): model_config = ConfigDict(extra="ignore") evaluation_type: str status: str score: Optional[float] = None class MountedAIEvalSuiteDetailPayload(BaseModel): model_config = ConfigDict(extra="ignore") item: MountedAIEvalSuiteItem selection_rules: Optional[Any] = None notes: Optional[str] = None evaluations: list[MountedAIEvalResultItem] = Field(default_factory=list)