2521690 ce299cbb18 feat: 增加 Agent 演示入口与 app_metadata 驱动验证链路
- 新增 app_metadata 模型、仓储与服务
- 将默认 edge 验证步骤改为由 app_metadata 驱动生成
- 新增 chat_session / chat_message 会话层模型与 chat service
- 新增 demo chat API,支持会话创建、消息发送、任务确认
- 新增最小 Web Demo 页面,形成聊天式演示入口
- 增强任务报告,补充 audit_summary 与更细粒度 task_metrics
- 增强 edge-agent 执行器:tcp_probe、日志时间范围过滤、进程指标与更灵活健康检查
- 更新 README 与当前进度总结,MVP 进度推进到约 94%
2026-04-09 14:10:13 +08:00

210 lines
5.3 KiB
Python

from __future__ import annotations
from typing import Any
from pydantic import BaseModel, Field
class ParsedIntent(BaseModel):
action_type: str | None = None
app_code: str | None = None
env: str | None = None
version: str | None = None
class CreateTaskRequest(BaseModel):
input_text: str
channel: str
session_id: str
tenant_id: str
context: dict[str, Any] = Field(default_factory=dict)
class CreateTaskData(BaseModel):
task_id: str
parsed_intent: ParsedIntent
missing_slots: list[str]
risk_level: str
task_status: str
next_action: str
class ConfirmTaskRequest(BaseModel):
confirmed: bool
comment: str | None = None
class CancelTaskRequest(BaseModel):
reason: str | None = None
class ConfirmTaskData(BaseModel):
task_id: str
task_status: str
approval_status: str
approval_id: str | None = None
software_a_task_id: str | None = None
software_a_task_status: str | None = None
class ToolCallItem(BaseModel):
tool_name: str
success: bool
class VerificationResult(BaseModel):
process_ok: bool | None = None
port_ok: bool | None = None
http_ok: bool | None = None
log_error_count: int | None = None
class ApprovalSummary(BaseModel):
approval_id: str | None = None
approval_status: str | None = None
reason: str | None = None
class SoftwareAResultSummary(BaseModel):
software_a_task_id: str | None = None
task_status: str | None = None
progress_percent: int | None = None
error_detail: str | None = None
started_at: str | None = None
finished_at: str | None = None
class VerificationResultSummary(BaseModel):
step_id: str | None = None
step_status: str | None = None
success: bool | None = None
duration_ms: int | None = None
message: str | None = None
class ResultSummaryDetail(BaseModel):
final_status: str
final_reason: str | None = None
approval: ApprovalSummary | None = None
software_a: SoftwareAResultSummary | None = None
verification: VerificationResultSummary | None = None
class TaskDetailData(BaseModel):
task_id: str
task_status: str
approval_status: str
risk_level: str
intent: ParsedIntent
software_a_task_id: str | None = None
software_a_task_status: str | None = None
tool_calls: list[ToolCallItem]
verification_result: VerificationResult | None = None
summary: str | None = None
result_summary_detail: ResultSummaryDetail | None = None
class TaskBasic(BaseModel):
task_id: str
task_status: str
approval_status: str
risk_level: str
created_at: str
updated_at: str
confirmed_at: str | None = None
class ApprovalTraceItem(BaseModel):
approval_id: str
approval_status: str
risk_level: str
approvers: list[str]
reason: str | None = None
created_at: str
updated_at: str
class ToolTraceItem(BaseModel):
tool_call_id: str
request_id: str | None = None
operator_user_id: str | None = None
operator_user_name: str | None = None
tool_name: str
success: bool
duration_ms: int | None = None
started_at: str | None = None
finished_at: str | None = None
request_payload: dict[str, Any]
response_payload: dict[str, Any]
class VerificationTraceItem(BaseModel):
step_id: str
edge_id: str
tool_name: str
step_status: str
success: bool | None = None
duration_ms: int | None = None
message: str | None = None
params: dict[str, Any]
result_data: dict[str, Any]
evidence: dict[str, Any]
started_at: str | None = None
finished_at: str | None = None
class AuditTraceItem(BaseModel):
audit_id: str
request_id: str | None = None
action: str
result: str
operator_user_id: str | None = None
operator_user_name: str | None = None
target: str | None = None
detail: dict[str, Any]
timestamp: str
class AuditSummary(BaseModel):
audit_event_count: int = 0
failure_count: int = 0
pending_count: int = 0
cancelled_count: int = 0
reported_count: int = 0
action_types: list[str] = Field(default_factory=list)
operator_user_names: list[str] = Field(default_factory=list)
result_counts: dict[str, int] = Field(default_factory=dict)
class TaskMetrics(BaseModel):
total_duration_ms: int | None = None
confirm_wait_duration_ms: int | None = None
approval_duration_ms: int | None = None
execution_duration_ms: int | None = None
software_a_duration_ms_total: int = 0
tool_call_duration_ms_total: int = 0
verification_duration_ms_total: int = 0
verification_queue_wait_duration_ms_total: int = 0
verification_end_to_end_duration_ms_total: int = 0
tool_call_count: int = 0
tool_call_success_count: int = 0
tool_call_failed_count: int = 0
verification_step_count: int = 0
verification_success_count: int = 0
verification_failed_count: int = 0
audit_event_count: int = 0
audit_failure_count: int = 0
class TaskReportData(BaseModel):
task_basic: TaskBasic
intent_snapshot: ParsedIntent
approval_trace: list[ApprovalTraceItem]
tool_trace: list[ToolTraceItem]
verification_trace: list[VerificationTraceItem]
task_metrics: TaskMetrics
audit_summary: AuditSummary
result_summary: str | None = None
result_summary_detail: ResultSummaryDetail | None = None
audit_trace: list[AuditTraceItem]