83 lines
2.6 KiB
Python
83 lines
2.6 KiB
Python
|
|
# -*- 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
|