Add production diagnostics and planning features
This commit is contained in:
@@ -52,6 +52,14 @@ class JobStatus(StrEnum):
|
||||
FAILED = "failed"
|
||||
|
||||
|
||||
class FeedbackKind(StrEnum):
|
||||
CORRECT = "correct"
|
||||
WRONG = "wrong"
|
||||
TOO_EARLY = "too_early"
|
||||
TOO_LATE = "too_late"
|
||||
NEVER_AUTOMATE = "never_automate"
|
||||
|
||||
|
||||
class AssignmentCandidate(BaseModel):
|
||||
entity_id: str
|
||||
domain: str
|
||||
@@ -146,6 +154,30 @@ class DecisionFactor(BaseModel):
|
||||
evidence: list[str] = Field(default_factory=list)
|
||||
|
||||
|
||||
class DecisionTrace(BaseModel):
|
||||
trace_id: str = Field(pattern=r"^[a-z0-9_.-]{1,120}$")
|
||||
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
trigger_entity_id: str | None = None
|
||||
trigger_state: str | None = None
|
||||
target_state: str | None = None
|
||||
confidence: float | None = Field(default=None, ge=0.0, le=1.0)
|
||||
executed: bool = False
|
||||
blocked: bool = False
|
||||
reason: str = Field(default="", max_length=700)
|
||||
blockers: list[str] = Field(default_factory=list)
|
||||
duration_ms: int | None = Field(default=None, ge=0)
|
||||
|
||||
|
||||
class LatencyMeasurement(BaseModel):
|
||||
measured_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
trigger_entity_id: str | None = None
|
||||
event_to_decision_ms: int | None = Field(default=None, ge=0)
|
||||
decision_to_service_ms: int | None = Field(default=None, ge=0)
|
||||
event_to_done_ms: int | None = Field(default=None, ge=0)
|
||||
executed: bool = False
|
||||
source: str = Field(default="manual", max_length=40)
|
||||
|
||||
|
||||
class AdaptiveWeightUpdate(BaseModel):
|
||||
entity_id: str
|
||||
previous_weight: float = Field(ge=0.0, le=1.0)
|
||||
@@ -248,6 +280,32 @@ class RelatedAutomation(BaseModel):
|
||||
enabled: bool
|
||||
|
||||
|
||||
class ActuatorGroup(BaseModel):
|
||||
group_id: str = Field(pattern=r"^[a-z0-9_-]{1,64}$")
|
||||
name: str = Field(min_length=1, max_length=120)
|
||||
area_name: str | None = Field(default=None, max_length=120)
|
||||
member_entity_ids: list[str] = Field(default_factory=list)
|
||||
reason: str = Field(default="", max_length=300)
|
||||
|
||||
|
||||
class SceneSuggestion(BaseModel):
|
||||
scene_id: str = Field(pattern=r"^[a-z0-9_-]{1,64}$")
|
||||
label: str = Field(min_length=1, max_length=120)
|
||||
member_entity_ids: list[str] = Field(default_factory=list)
|
||||
confidence: float = Field(default=0.0, ge=0.0, le=1.0)
|
||||
reason: str = Field(default="", max_length=500)
|
||||
last_seen_at: datetime | None = None
|
||||
|
||||
|
||||
class AgentInsight(BaseModel):
|
||||
insight_id: str = Field(pattern=r"^[a-z0-9_.-]{1,120}$")
|
||||
severity: str = Field(default="info", max_length=20)
|
||||
title: str = Field(min_length=1, max_length=160)
|
||||
detail: str = Field(min_length=1, max_length=700)
|
||||
action: str | None = Field(default=None, max_length=300)
|
||||
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
|
||||
|
||||
class BehaviorState(BaseModel):
|
||||
mode: BehaviorMode = BehaviorMode.SHADOW
|
||||
status: BehaviorStatus = BehaviorStatus.COLLECTING
|
||||
@@ -281,6 +339,16 @@ class BehaviorState(BaseModel):
|
||||
automation_conflicts: list[AutomationConflict] = Field(default_factory=list)
|
||||
time_profiles: list[TimeProfile] = Field(default_factory=list)
|
||||
anomalies: list[AnomalyEvent] = Field(default_factory=list)
|
||||
decision_timeline: list[DecisionTrace] = Field(default_factory=list)
|
||||
latency_measurements: list[LatencyMeasurement] = Field(default_factory=list)
|
||||
feedback_log: list[FeedbackKind] = Field(default_factory=list)
|
||||
dry_run_enabled: bool = False
|
||||
dry_run_started_at: datetime | None = None
|
||||
dry_run_sample_count: int = Field(default=0, ge=0)
|
||||
dry_run_hit_count: int = Field(default=0, ge=0)
|
||||
actuator_groups: list[ActuatorGroup] = Field(default_factory=list)
|
||||
scene_suggestions: list[SceneSuggestion] = Field(default_factory=list)
|
||||
agent_insights: list[AgentInsight] = Field(default_factory=list)
|
||||
|
||||
|
||||
class ActuatorRecord(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user