Ignis CLI · Tobatsu 长任务 · 2026-05-30

给 Ignis CLI 装上「等视频」的眼睛

以前 ignis ask 一跑完,大家就以为视频做好了 —— 其实没。这轮把这个坑填了:提交后能查、能等、能拿到全部文件,而且用户不用懂那一堆内部 ID。

验收 7/7 通过 测试 20/20 绿 CLI v0.2.0 test 部署放行 · prod 未动
病根 · 为什么之前总说「没有视频 / 没语音」

01跑完一句话 ≠ 视频做完

ignis ask 跑的是一次 agent 对话回合。当 agent 把视频任务派出去那一刻,这个回合就结束了 —— 但真视频还要在后台再渲染 5–25 分钟,做完后是另走一条路回来的(tobatsu_result + 画布),靠一个 gateway_run_id 串起来。CLI 根本没盯着这条路。

以前
ignis ask
派出视频任务
回合结束 ✅
显示 completed
你以为好了
去拿文件 → 空的 / 还没渲染完
真相
后台还在跑
渲染 5–25 分钟
另一条路回来
tobatsu_result + 画布
CLI 没盯着
这条路它看不见
现在
ignis ask
派任务 + 给你 task_id
ignis task wait
替你盯到做完
成片 + 画布 + 全部文件
原样拿到手
🔍

最毒的一处:托管给 agent 看的说明书,以前还在教它「等回合到终态就拿到结果」。对 Tobatsu 这是错的 —— 回合到终态时,片子还没出来。这轮把说明书也改对了。

设计三招 · 尽量小、尽量不碰旧的

02修法:加一个「任务」的概念

回合(turn)和任务(task)分开看。提交长任务时,后端本来就握着一个 gateway_run_id,把它当成对用户的唯一一个不透明 ID暴露出来就行。

🪪

一个 ID 走天下

task_id = gateway_run_id。不建新表,不让用户分辨三套 ID。另外两个内部 ID(gateway_task_id / tobatsu_task_id)只在 debug 时露脸。

🔌

只加一个只读接口

GET /api/cli/tasks/{task_id},task / wait / debug 全共用它。复用已有的查询,薄薄一层过滤,没动数据层。

🧩

新字段都是「附加」

tasks / next_commands / cli_notice 都是可选字段。老 CLI 看不懂就当没看见,不会坏。

🔒

安全是我最看重的一关:两个新查询都按 tasks.user_email 过滤,接口先校验登录、没登录直接挡;二级查询都在「确认这个任务归你」之后才跑。不存在跨用户偷看别人任务。

先擦屁股 · 把上一轮 combo 污染通用代码的地方清掉

03做 CLI 之前,先清三笔旧账

上一轮为了赶 combo,往通用代码里塞了些只服务 combo 的东西。这轮先撤干净 —— 否则通用工具会被业务细节带歪。

用户视角 · 终端里实际是什么样

04三条命令,内部 ID 默认不露脸

ignis task 看最新任务、ignis task wait 替你等到做完(最长等 30 分钟,贴合渲染时长)、ignis task debug 才显示内部排查用的 ID。普通输出只给:任务 ID、状态、画布链接、所有文件、下一步。

ignis task wait gwr_35543a31…
# 提交后 CLI 直接给提示,不用你记 ID
$ ignis ask "做一条数字人口播带字幕的成片"
后台任务已提交。查看进度:ignis task wait gwr_35543a31

# 替你盯到渲染完成
$ ignis task wait gwr_35543a31
任务 gwr_35543a31: succeeded
已生成对齐口播音频、数字人口播视频,并合成带字幕成片。
画布: https://ignis-test.funplus-marketing.ai/canvas/bd33…?sessionId=…
文件:
  - gjgW7v.png   # 原样返回,不假设几个、不按角色改名
  - gDaeWP.mp4
  - RJ6Qvm.mp4
  - fh264x.mp3
  - pApBHb.srt
⬆️

每个请求带 X-Ignis-CLI-Version。版本太旧或没带,后端回一句人话提示(cli_notice)叫你升级 —— 默认只提醒,不硬拦,只有接口真不兼容才强制。

我这边的复核 · 读 diff + 亲自重跑,不听自述

05验收全过 + 我重跑的证据

作为复核方,我每一条都自己读了代码、自己重跑了测试,没有照搬实现方的自我汇报。

7/7
验收标准全部达成且逐条核实
20/20
目标 pytest 我亲自重跑全绿
0.2.0
typecheck / build / 版本 全过
0
跨用户漏读 · 安全边界扎实

复核里我提了 6 个发现。两个跟「画布链接能不能真的点开」有关(这是用户真正去点的东西),实现方都已处理:

#发现分级状态
F1画布链接默认指向生产域名。测试环境得指 ignis-testMedium✓ 已设 env
F2画布链接缺 ?sessionId=能打开的链接都带它。Medium✓ 已修+测试
F3归属安全无回归测试。SQL 我读过没问题,但缺守护。Low✓ 补 2 测试
F4<think> 运行时行为无测试。Low✓ 补回归
F5未知状态默认显示 running(debug 可见原始)。Nit留作打磨
F6人类输出把「下一步」和文件都写 stdout(--json 干净)。Nit留作打磨

* F1 那个 Render 控制台的环境变量,我这边看不到面板 —— 已请实现方部署后点一个链接眼验确实指向 test 域名。

结论

06可以推测试了

  • 设计正确、代码正确、安全扎实
  • 7 条验收全过,我提的发现全部闭合
  • 测试 / 构建 / 版本全绿(我亲跑)
  • 已给实现方最终放行:可提交 + 推 test
部署边界
test 部署放行 · prod 一行未动
部署后只需肉眼确认一个画布链接指向 test 域名(F1),其余无遗留。