"""Pydantic 数据模型。""" import time import uuid from typing import Any from pydantic import BaseModel, Field from app.constants import AgentStatus, TaskStatus def new_request_id() -> str: return uuid.uuid4().hex # ---------- 任务 ---------- class TaskSubmit(BaseModel): """CLI 任务上报请求体。""" auth: str = Field(..., description="网关认证密码,需与 GATEWAY_AUTH 一致") request_id: str | None = Field(default=None, description="幂等键,不传则自动生成") task_type: str = Field(..., description="任务类型,如 compile/build/test") task_tags: list[str] = Field(default_factory=list, description="任务能力标签") description: str | None = Field(default=None, description="任务描述") payload: dict[str, Any] = Field(default_factory=dict, description="任务载荷") cli_session_id: str | None = Field(default=None, description="CLI 会话标识") timeout: int = Field(default=0, description="超时秒数,0 使用默认值") local_workdir: str | None = Field(default=None, description="本地工作目录信息") class TaskInfo(BaseModel): request_id: str task_type: str task_tags: list[str] = Field(default_factory=list) description: str | None = None payload: dict[str, Any] = Field(default_factory=dict) status: TaskStatus = TaskStatus.PENDING agent_id: str | None = None cli_session_id: str | None = None create_time: float = Field(default_factory=time.time) timeout: int = 0 progress: int = 0 result: dict[str, Any] | None = None error_info: str | None = None # ---------- Agent ---------- class AgentRegister(BaseModel): """Agent 启动注册请求体。""" auth: str = Field(..., description="网关认证密码,需与 GATEWAY_AUTH 一致") agent_id: str endpoint: str agent_tags: list[str] = Field(default_factory=list) max_concurrent: int = Field(default=1, ge=1) current_load: int = Field(default=0, ge=0) priority: int = Field(default=3, ge=1, le=5, description="调度优先级,越小越先分配") class AgentHeartbeat(BaseModel): auth: str = Field(..., description="网关认证密码,需与 GATEWAY_AUTH 一致") agent_id: str current_load: int = Field(default=0, ge=0) class AgentInfo(BaseModel): agent_id: str endpoint: str agent_tags: list[str] = Field(default_factory=list) max_concurrent: int = 1 current_load: int = 0 priority: int = Field(default=3, ge=1, le=5, description="调度优先级,越小越先分配") last_heartbeat: float = Field(default_factory=time.time) status: AgentStatus = AgentStatus.READY create_time: float = Field(default_factory=time.time) # ---------- 结果回传 ---------- class TaskResult(BaseModel): auth: str = Field(..., description="网关认证密码,需与 GATEWAY_AUTH 一致") request_id: str agent_id: str status: TaskStatus = TaskStatus.SUCCESS progress: int = Field(default=100, ge=0, le=100) result: dict[str, Any] | None = None error_info: str | None = None # ---------- 日志 ---------- class LogEntry(BaseModel): ts: float = Field(default_factory=time.time) level: str = "info" source: str = "gateway" # gateway / agent / cli / admin scope: str = "task" # task / agent / system request_id: str | None = None agent_id: str | None = None message: str