PMFlow/backend/app/api/ai_steward_api/schemas.py

209 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from __future__ import annotations
from .shared import *
class ProjectFromTextRequest(BaseModel):
"""零配置项目创建请求"""
input_text: str = Field(
...,
description="自然语言项目描述,例如:我们要做一个 AI 客服工具,基于 GPT-4o mini,对标 XX 竞品,3 周上线",
min_length=10,
max_length=500
)
class ProjectFromTextSignalSource(BaseModel):
registry_id: int | str | None = None
id: int | str | None = None
project_id: int | str | None = None
signal_id: int | str | None = None
source_kind: str
source_name: str
source_identifier: str
display_source_kind: Optional[str] = None
technical_identifier: Optional[str] = None
description: Optional[str] = None
requested_via: Optional[str] = None
status: Optional[str] = None
onboarding_status: Optional[str] = None
section: Optional[str] = None
title: Optional[str] = None
priority: Optional[str] = None
origin: Optional[str] = None
raw_context: Optional[Dict[str, Any]] = None
config: Optional[Dict[str, Any]] = None
class ProjectFromTextResponse(BaseModel):
"""零配置项目创建响应"""
project: Dict[str, Any]
signal: Dict[str, Any]
charter: Dict[str, Any]
tasks: List[Dict[str, Any]]
risks: List[Dict[str, Any]]
signal_sources: List[ProjectFromTextSignalSource] = Field(default_factory=list)
analysis: Dict[str, Any]
class CognitiveConflictResponse(BaseModel):
"""认知冲突响应"""
id: str
type: str
display_type: str
description: str
severity: str
resolution_suggestion: Optional[str] = None
related_users: List[str]
class DailyBriefingResponse(BaseModel):
"""每日简报响应"""
date: str
total_updates: int
your_updates: int
relevant_changes: List[Dict[str, Any]]
risk_alerts: List[Dict[str, Any]]
alignment_needed: List[Dict[str, Any]]
class FeishuCaptureRequest(BaseModel):
"""飞书信号捕获请求"""
group_chat_id: str
message_content: str
sender: str
feishu_message_id: Optional[str] = None
class BrowserCaptureRequest(BaseModel):
"""浏览器信号捕获请求"""
user_id: int
url: str
title: str
content_preview: str
class GitHubCaptureRequest(BaseModel):
"""GitHub信号捕获请求"""
repo_url: str
event_type: str
event_data: Dict[str, Any]
class ConflictDetectRequest(BaseModel):
"""认知冲突检测请求"""
project_id: int
detect_type: str = "all" # all, charter, definition
class SignalSourceOnboardRequest(BaseModel):
project_id: int = Field(..., ge=1)
instruction: str = Field(..., min_length=6, max_length=2000)
dry_run: bool = False
response_mode: Literal["fast", "complete"] = "fast"
class SignalSourceListResponse(BaseModel):
items: List[Dict[str, Any]]
class SignalSourceRepairRequest(BaseModel):
project_id: int = Field(..., ge=1)
registry_ids: List[int] = Field(default_factory=list, min_length=1, max_length=50)
sender: str = Field(default="PMFlow修复器", min_length=1, max_length=64)
class CodeCommentScanRequest(BaseModel):
"""代码注释扫描请求"""
code_content: str
file_path: str
line_number: int
project_id: int
class BlockerResolveRequest(BaseModel):
"""阻塞解决请求"""
blocker_id: int
resolution_note: str
class WorkflowTriggerRequest(BaseModel):
"""工作流触发请求"""
event_type: str
event_data: Dict[str, Any]
class ExecutiveBriefingConfigRequest(BaseModel):
enabled: bool = True
send_time: str = Field(default="08:30", pattern=r"^\d{2}:\d{2}$")
send_cycle: Literal["workdays", "daily"] = "workdays"
delivery_target_type: Literal["management_group"] = "management_group"
delivery_target_ref: Optional[str] = Field(default=None, max_length=128)
timezone: str = Field(default="Asia/Shanghai", min_length=3, max_length=64)
class ExecutiveBriefingMetric(BaseModel):
label: str
value: Any
tone: str
class ExecutiveBriefingItem(BaseModel):
id: str
title: str
display_title: str
display_subtitle: str
display_source: str
technical_identifier: Optional[str] = None
detail: str
detail_lines: List[str] = Field(default_factory=list)
meta: List[Dict[str, str]] = Field(default_factory=list)
tone: str
kind: Optional[str] = None
target: Optional[Dict[str, Any]] = None
project_id: Optional[int] = None
project_name: Optional[str] = None
user_id: Optional[int] = None
owner_name: Optional[str] = None
related_user_ids: List[int] = Field(default_factory=list)
occurred_at: Optional[str] = None
class ExecutiveBriefingSection(BaseModel):
key: str
title: str
summary: str
metrics: List[ExecutiveBriefingMetric] = Field(default_factory=list)
items: List[ExecutiveBriefingItem] = Field(default_factory=list)
drilldown_tab: Optional[str] = None
class ExecutiveBriefingHero(BaseModel):
title: str
decision_count: int
anomaly_count: int
baseline_generated_at: Optional[str] = None
live_generated_at: Optional[str] = None
key_alerts: List[ExecutiveBriefingMetric] = Field(default_factory=list)
snapshot_state: str = "missing"
class ExecutiveBriefingPayload(BaseModel):
brief_date: str
mode: Literal["snapshot", "live"]
summary: Dict[str, Any]
hero: ExecutiveBriefingHero
sections: List[ExecutiveBriefingSection] = Field(default_factory=list)
delivery: Dict[str, Any] = Field(default_factory=dict)
class DailyBriefingV2PersonalSummary(BaseModel):
headline: str
action_count: int = 0
project_count: int = 0
class DailyBriefingV2PersonalWorkload(BaseModel):
user_id: int
user_name: str
assigned_hours: float = 0
max_weekly_hours: float = 0
workload_ratio: int = 0
tone: str = "info"
class DailyBriefingV2Payload(BaseModel):
brief_date: str
mode: Literal["snapshot", "live"]
viewer_scope: Literal["tenant_full", "personal"]
hero: ExecutiveBriefingHero
sections: List[ExecutiveBriefingSection] = Field(default_factory=list)
personal_summary: Optional[DailyBriefingV2PersonalSummary] = None
personal_workload: Optional[DailyBriefingV2PersonalWorkload] = None
export_title: str