96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
"""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 |