系统不是一个单独全局状态枚举。每个job有独立的audio_state、image_state、video_state,以及paused、cancelled、submitting等跨阶段标记。音频、图片成功状态为ready;视频成功为done。queued/working用于活动判定,failed/cancelled/interrupted表示不同终止或恢复情形。
创建与工作器
新任务先规范化标题、验证正文/音色/配图方式、解码或校验照片与来源配置。在RLock内检查ACTIVE,若有活动任务则409拒绝创建;生成规范UUID、写job快照、创建Control,启动audio。手机上传图已在请求中处理并保存,所以无需另启动image线程;URL和Seedream会启动image,与音频工作器可并行。
ACTIVE是(job_id,part)集合,CONTROLS映射每任务共享控制对象。launch()避免同一步重复启动,用daemon线程执行WORKERS映射中的函数。Android启动覆盖WORKERS['video'],其他业务继承PC规则。全局RLock协调任务读写、活动集和动作,不形成跨进程数据库事务。
状态与动作关系
| 动作 | 状态改变/处理 | 活動限制 |
|---|---|---|
| create | audio queued,image queued或ready,video idle | ACTIVE非空拒绝新任务 |
| pause | 设置paused事件及持久标志 | 对在途云图片不能撤回服务端处理 |
| resume | 清paused/cancelled,必要时新Control | 取消尚未完成则拒绝;不自动launch中断步骤 |
| cancel | cancelled事件,清前端暂停显示;未运行busy步骤设cancelled | 正在运行worker在检查点停止 |
| retry-audio | 重置audio queued,清素材确认,video idle | 同步/视频/导图或其他任务忙时拒绝 |
| retry-image | 重置image queued,沿用任务来源/模型 | manual图不使用这一AI重试入口 |
| regenerate | 更新prompt,重生成当前来源/模型图 | 新要求非空;Seedream重新认证/同意 |
| change-source | 使用新来源/模型配置并更新prompt | Android只有Seedream可选AI来源 |
| use-image | 保存手机图或下载直链,更新image_version | 允许同任务音频仍在处理,拒其他冲突步骤 |
| select-images | 原图库保留非空子集,新image_version | 有图/视频冲突步骤时拒绝,至少一张 |
| confirm | 保存当前confirmed_version/digest,video queued并launch | audio/image都ready,无暂停/取消/ACTIVE |
worker生命周期会记录开始、完成、失败或取消事件,finally清ACTIVE。异常消息替换当前Key,取消且所有相关步骤结束后清Control Key。没有retry-video独立action;视频失败或中断由confirm重新核对素材后启动。
图片存储、换图和删图都会清确认标识,使video回idle。旧MP4不立即删除,job_view单独查磁盘上保留成片并返回入口;再次成功合成以同名路径replace,属于一任务一个当前输出路径,并非永久多版本归档。
依据:app.py:35–58,163–195,325–366,590–643,667–839、android_runtime.py:181。