PMFlow/backend/app/schemas/mounted_ai_runtime.py

346 lines
9.4 KiB
Python

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