# -*- coding: utf-8 -*- """ Pydantic 数据模型 —— 用于 REST API 请求 / 响应以及内部状态。 """ from __future__ import annotations import time import uuid from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field from common.protocol import TaskStatus, TaskType # ────────────────────────── Worker ────────────────────────── class BrowserProfile(BaseModel): """比特浏览器窗口信息(Worker 上报)。""" id: str name: str = "" remark: str = "" class WorkerInfo(BaseModel): """一台 Worker 的运行时信息(内存中保存)。""" worker_id: str worker_name: str = "" browsers: List[BrowserProfile] = [] online: bool = True last_heartbeat: float = Field(default_factory=time.time) connected_at: float = Field(default_factory=time.time) current_task_id: Optional[str] = None class WorkerOut(BaseModel): """返回给前端的 Worker 信息。""" worker_id: str worker_name: str browsers: List[BrowserProfile] online: bool current_task_id: Optional[str] = None # ────────────────────────── Task ────────────────────────── class TaskCreate(BaseModel): """前端提交任务的请求体。""" task_type: TaskType worker_id: Optional[str] = None # 手动指定机器 account_name: Optional[str] = None # 按比特浏览器窗口名自动路由 params: Dict[str, Any] = {} # 任务参数(如 job_title, max_greet 等) class TaskInfo(BaseModel): """任务完整信息(内存 / 返回前端)。""" task_id: str = Field(default_factory=lambda: uuid.uuid4().hex[:12]) task_type: TaskType status: TaskStatus = TaskStatus.PENDING worker_id: Optional[str] = None account_name: Optional[str] = None params: Dict[str, Any] = {} progress: Optional[str] = None # 最新进度描述 result: Any = None # 最终结果 error: Optional[str] = None created_at: float = Field(default_factory=time.time) updated_at: float = Field(default_factory=time.time) class TaskOut(BaseModel): """返回给前端的任务信息。""" task_id: str task_type: TaskType status: TaskStatus worker_id: Optional[str] = None account_name: Optional[str] = None params: Dict[str, Any] = {} progress: Optional[str] = None result: Any = None error: Optional[str] = None created_at: float updated_at: float