"""内存任务注册表:套图生成任务的生命周期与进程一致(重启即新会话)。 轮询/导出只服务「当前会话正在跟踪的任务」——前端没有历史记录功能, 任务状态无需跨进程持久化;重启后轮询自然 404,前端提示任务已中断。 """ from __future__ import annotations import uuid from dataclasses import dataclass, field # 任务状态 TASK_PENDING = "pending" TASK_RUNNING = "running" TASK_DONE = "done" TASK_PARTIAL = "partial" TASK_FAILED = "failed" # 任务内单张图状态 IMG_OK = "ok" IMG_FAILED = "failed" @dataclass class TaskImage: """任务里单张生成图:完成一张追加一条(前端进度 x/y 依赖此语义)。""" type_id: str name: str status: str = IMG_FAILED # 循环里先建后跑,成功后改为 ok url: str = "" error: str | None = None @dataclass class Task: """一次套图生成任务:轮询可见字段 + 仅供 run_suite 消费的执行参数。""" id: str status: str = TASK_PENDING platform: str = "cn" lang: str = "zh" ratio: str = "1:1" style_set: int = 1 style_prompt: str | None = None requirements: str | None = None provider: str = "" model: str | None = None total: int = 0 # 计划总张数(进度分母) images: list[TaskImage] = field(default_factory=list) error: str | None = None # ── 执行参数(不进轮询响应)── context: dict = field(default_factory=dict) # 采集文本素材(build_context 的输入) plan: list[dict] = field(default_factory=list) # 展开后的逐张任务 ref_images: list[dict] = field(default_factory=list) # 参考图池(main 优先) # 进程内任务表:asyncio 单事件循环读写,无并发问题;不做淘汰(单会话量级很小) _TASKS: dict[str, Task] = {} def create_task(**kwargs) -> Task: task = Task(id=uuid.uuid4().hex, **kwargs) _TASKS[task.id] = task return task def get_task(task_id: str) -> Task | None: return _TASKS.get(task_id)