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 MountedAISourceActivationItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int source_system: str scope_type: str scope_ref: str status: str cutover_mode: str auto_reply_enabled: bool last_seen_at: Optional[str] = None notes: Optional[str] = None metadata_json: Optional[Any] = None class MountedAISourceActivationListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAISourceActivationItem] = Field(default_factory=list) class MountedAISourceActivationUpsertRequest(BaseModel): model_config = ConfigDict(extra="ignore") source_system: str = Field(min_length=1, max_length=32) scope_type: str = Field(default="tenant", min_length=1, max_length=24) scope_ref: str = Field(min_length=1, max_length=128) status: str = Field(default="active", min_length=1, max_length=24) cutover_mode: str = Field(default="shadow", min_length=1, max_length=24) auto_reply_enabled: bool = False notes: Optional[str] = None metadata_json: Optional[Any] = None class MountedAISourceActivationUpsertPayload(BaseModel): model_config = ConfigDict(extra="ignore") item: MountedAISourceActivationItem class MountedAIToolPolicyItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int tool_name: str risk_level: str confirm_required: bool auto_execute_allowed: bool is_active: bool source_scope: Optional[Any] = None tenant_scope: Optional[Any] = None policy_metadata: Optional[Any] = None notes: Optional[str] = None class MountedAIToolPolicyListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAIToolPolicyItem] = Field(default_factory=list) class MountedAIToolPolicyUpsertRequest(BaseModel): model_config = ConfigDict(extra="ignore") tool_name: str = Field(min_length=1, max_length=128) risk_level: str = Field(default="medium", min_length=1, max_length=24) confirm_required: bool = True auto_execute_allowed: bool = False is_active: bool = True source_scope: Optional[Any] = None tenant_scope: Optional[Any] = None policy_metadata: Optional[Any] = None notes: Optional[str] = None class MountedAIToolPolicyUpsertPayload(BaseModel): model_config = ConfigDict(extra="ignore") item: MountedAIToolPolicyItem 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 plan_status: Optional[str] = None 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 input_summary: Optional[Any] = None output_summary: Optional[Any] = None tool_trace: Optional[Any] = 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) class MountedAIRegressionBucketItem(BaseModel): model_config = ConfigDict(extra="ignore") bucket_key: str run_count: int = 0 avg_score: Optional[float] = None last_seen_at: Optional[str] = None class MountedAITrainingDatasetItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int dataset_type: str version: str status: str sample_count: int = 0 suite_kind: Optional[str] = None class MountedAITrainingJobItem(BaseModel): model_config = ConfigDict(extra="ignore") id: int job_type: str target_slot: str status: str provider_backend: str dataset_id: int artifact_ref: Optional[str] = None class MountedAITrainingAcceptanceGate(BaseModel): model_config = ConfigDict(extra="ignore") ready_for_acceptance: bool = False threshold_score: float = 90.0 frozen_eval_score: Optional[float] = None severe_blocker_count: int = 0 blocking_reason: str class MountedAITrainingOpsPayload(BaseModel): model_config = ConfigDict(extra="ignore") dataset_count: int = 0 ready_eval_suite_count: int = 0 pending_job_count: int = 0 candidate_deployment_count: int = 0 approved_golden_asset_count: int = 0 approved_failure_asset_count: int = 0 preference_pair_count: int = 0 hard_case_count: int = 0 last_training_job_at: Optional[str] = None regression_buckets: list[MountedAIRegressionBucketItem] = Field(default_factory=list) recent_datasets: list[MountedAITrainingDatasetItem] = Field(default_factory=list) recent_jobs: list[MountedAITrainingJobItem] = Field(default_factory=list) acceptance_gate: MountedAITrainingAcceptanceGate class MountedAIHardCaseItem(BaseModel): model_config = ConfigDict(extra="ignore") judge_run_id: int asset_id: Optional[int] = None bucket_key: str judge_status: str overall_score: Optional[float] = None prompt_key: Optional[str] = None workflow_type: Optional[str] = None asked_via: Optional[str] = None question_text: Optional[str] = None answer_text: Optional[str] = None corrected_answer: Optional[str] = None findings: Optional[Any] = None created_at: Optional[str] = None class MountedAIHardCaseListPayload(BaseModel): model_config = ConfigDict(extra="ignore") items: list[MountedAIHardCaseItem] = Field(default_factory=list) total: int = 0 class MountedAIReplayRunRequest(BaseModel): model_config = ConfigDict(extra="ignore") run_id: int asset_type: str = Field(default="failure", min_length=1, max_length=16) bucket_key: Optional[str] = Field(default=None, max_length=255) question_text: Optional[str] = None answer_text: Optional[str] = None corrected_answer: Optional[str] = None notes: Optional[str] = None persist_quality_asset: bool = True overall_score: Optional[float] = None rule_score: Optional[float] = None llm_score: Optional[float] = None findings: Optional[Any] = None class MountedAIReplayRunPayload(BaseModel): model_config = ConfigDict(extra="ignore") run_id: int asset: Optional[Any] = None judge_run: Optional[Any] = None