183 lines
5.3 KiB
Python
183 lines
5.3 KiB
Python
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 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[Dict[str, Any]] = Field(default_factory=list)
|
||
analysis: Dict[str, Any]
|
||
|
||
class CognitiveConflictResponse(BaseModel):
|
||
"""认知冲突响应"""
|
||
id: str
|
||
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
|
||
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
|