PMFlow/backend/app/services/ai_pmo/semantic_context/decision_schema.py

66 lines
2.3 KiB
Python

from __future__ import annotations
from typing import Any, Literal
from pydantic import BaseModel, ConfigDict, Field
class ModeCard(BaseModel):
model_config = ConfigDict(extra="ignore")
workflow_mode: Literal["CHAT", "PLAN", "EXECUTE"] = "CHAT"
mode_state: str = "IDLE"
allowed_actions: list[str] = Field(default_factory=list)
forbidden_actions: list[str] = Field(default_factory=list)
exit_conditions: list[str] = Field(default_factory=list)
class DecisionWorkflowPlan(BaseModel):
model_config = ConfigDict(extra="ignore")
workflow_type: Literal[
"query_flow",
"new_project_flow",
"project_flow",
"task_flow",
"signal_source_flow",
"project_signal_flow",
"followup_flow",
]
workflow_action: str
target_scope: Literal["global", "project", "thread"] = "global"
operation_codes: list[str] = Field(default_factory=list)
requires_confirmation: bool = False
confidence: float = 0.0
clarification_needed: bool = False
metadata: dict[str, Any] = Field(default_factory=dict)
class SemanticDecision(BaseModel):
model_config = ConfigDict(extra="ignore")
topic_relation: Literal["continue_current_topic", "new_topic", "uncertain"]
mode_decision: Literal["stay_plan", "ready_confirm", "request_execute", "answer_only"]
followup_scope: Literal["none", "current_requirement", "current_draft", "independent_workflow", "clarify"] = "none"
followup_action: Literal["none", "confirm", "revise", "cancel", "answer_only"] = "none"
revision_note: str = ""
draft_patch: dict[str, Any] = Field(default_factory=dict)
workflow_plans: list[DecisionWorkflowPlan] = Field(default_factory=list)
scene_metadata: dict[str, Any] = Field(default_factory=dict)
assistant_reply: str = ""
requires_confirmation: bool = False
requested_actions: list[str] = Field(default_factory=list)
confidence: float = 0.0
uncertainties: list[str] = Field(default_factory=list)
class DecisionGateResult(BaseModel):
model_config = ConfigDict(extra="ignore")
accepted: bool
blocked_reasons: list[str] = Field(default_factory=list)
allowed_actions: list[str] = Field(default_factory=list)
next_plan_status: str
needs_confirmation: bool = False
mode_state_after: str | None = None