Files
yingqing/docs/agents_todo/视频项目脚本Agent_TODO代码实施计划.md
T

16 KiB
Raw Blame History

视频项目—脚本 Agent TODO 代码实施计划

依据:06_视频项目脚本Agent_协同引入实施方案.md
原则:一步一确认、先解耦再新增、每步可测试可回滚、公共能力只建设一次。
本文件是实施清单,不代表已经修改代码。

1. 强制执行规则

每个 TODO 都执行以下闭环:

1. 用户发送“确认开始 Sxx”
2. 只实施 Sxx 明确列出的范围
3. 执行本步骤测试和回归
4. 汇报文件、行为变化、测试结果、遗留风险
5. 用户发送“确认完成 Sxx,进入 Syy”
6. 才允许开始下一步

禁止:

  • 一次确认后连续实施多个步骤;
  • 未经确认顺手重构下一步代码;
  • 测试未通过就标记完成;
  • 为 Agent 重写 AITask、计费、Provider、资产和脚本版本;
  • 在新链路稳定前删除旧入口;
  • 把计划状态、测试结果或用户确认伪造为已完成。

状态标记:

[ ] 未开始
[~] 已获开始确认,实施中
[?] 实施完成,等待用户验收
[x] 用户已验收
[!] 阻塞

2. 全局实施顺序

S00 口径确认
→ S01 修正脚本输入契约
→ S02 解耦现有脚本生成内核
→ S03 建公共 Agent 数据骨架
→ S04 建公共工具与最小运行时
→ S05 建脚本 Snapshot/Brief
→ S06 建确定性校验器
→ S07 接入生成工具
→ S08 建脚本 Coordinator MVP
→ S09 建 API 与运行恢复
→ S10 接前端真实状态
→ S11 建 Handoff、采用前检查
→ S12 可选评审与一次修订
→ S13 灰度与完整回归
→ S14 旧编排退役评估

S03S04 是三个 Agent 共用的基础设施。平台套图和模特上身图计划只能复用,不得复制。

3. TODO 明细

[ ] S00:冻结业务口径和基线

目标:在写代码前确认唯一规则,避免 Agent 固化当前矛盾。

确认项:

  • 时长与镜数唯一口径:15/30/60 秒分别对应多少镜、每镜多长;
  • auto/theme/manual/revise/revise_segment 的准确含义;
  • “自带脚本”是原文进入模型整理,还是完全原样保存;
  • 卖点必须使用真实 ID
  • 用户明确模型与自动路由的优先级;
  • 首期是否启用语义评审;
  • 单次生成、评审、修订的预算上限;
  • 仍由用户采用脚本。

代码范围:无业务代码修改;只允许补充决策记录。

验收产物:一份经过用户确认的决策表,后续 Schema 和测试引用同一口径。

启动口令:确认开始 S00
完成口令:确认完成 S00,进入 S01


[ ] S01:修正脚本输入契约

依赖:S00 已验收。

目标:先解决卖点、时长、模式等数据问题,不引入 Agent。

代码 TODO

  • 前端提交真实 selected_selling_point_ids
  • 后端按 team 和 product 校验卖点 ID
  • 保存卖点 ID、标题、内容快照;
  • 建立唯一的 duration → shot_policy 转换函数;
  • 明确 manual 模式,不再隐式落入 theme 分支;
  • 为旧请求增加兼容适配和弃用日志;
  • 补请求 Serializer/Schema 校验;
  • 不改变旧脚本生成结果结构。

预计文件:

core/frontend/src/routes/pipeline.tsx
core/frontend/src/api.ts
core/frontend/src/types.ts
core/backend/apps/projects/views.py
core/backend/apps/ai/script_agent.py
core/backend/apps/projects/tests.py
core/backend/apps/ai/tests.py

测试:

  • 卖点跨商品/跨团队拒绝;
  • 15/30/60 秒镜数一致;
  • 五种模式请求分支正确;
  • 旧请求仍可生成;
  • 不新增重复计费。

完成标准:输入契约唯一,旧入口正常,所有相关测试通过。

启动口令:确认开始 S01
完成口令:确认完成 S01,进入 S02


[ ] S02:拆出现有脚本生成内核

依赖:S01 已验收。

目标:只做重构,不改变用户可见行为,为 Agent 工具复用做准备。

代码 TODO

  • stream_script_agent() 拆出上下文构建;
  • 拆出 system/user messages 构建;
  • 拆出单次 Provider 生成服务;
  • 保留流式事件适配;
  • 拆出 normalize/Schema 校验入口;
  • 拆出未采用 ScriptVersion 保存服务;
  • script-agent-stream 改为调用这些服务;
  • 不新增 AgentRun,不改前端。

建议接口:

build_script_generation_context()
build_script_messages()
generate_script_once()
normalize_script_result()
save_script_candidate()

测试:

  • 重构前后同输入的 messages 等价;
  • SSE 事件类型保持兼容;
  • ScriptDraft、ScriptVersion、ScriptSegment 结构不变;
  • 中断、失败、退款行为不变;
  • 现有项目测试全过。

完成标准:旧入口只作为薄适配器,核心服务可独立测试。

启动口令:确认开始 S02
完成口令:确认完成 S02,进入 S03


[ ] S03:建立公共 Agent 数据骨架

依赖:S02 已验收。

目标:创建三个 Agent 共用的最小运行记录,不加入具体脚本逻辑。

代码 TODO

  • 新建 apps/agents Django app
  • 新增 AgentRun
  • 新增 AgentStep
  • 新增 AgentArtifact
  • 状态、agent_type、step_type 使用枚举;
  • 加 team/user/scope、预算、停止原因、lock_version
  • AgentStep 可关联 AITask
  • 添加必要索引和唯一约束;
  • 注册 admin 只读审计视图;
  • 生成并检查 migration。

预计目录:

core/backend/apps/agents/
core/backend/airshelf/settings/

测试:

  • 模型约束和状态默认值;
  • team 隔离;
  • (team, idempotency_key) 唯一;
  • Step 顺序/幂等唯一;
  • 删除策略不误删 AITask/业务产物;
  • migration 可正向/反向执行。

完成标准:只增加通用审计模型,不影响现有业务接口。

启动口令:确认开始 S03
完成口令:确认完成 S03,进入 S04


[ ] S04:公共工具协议与最小运行时

依赖:S03 已验收。

目标:实现固定状态机所需的公共能力,不做通用自由 Agent 框架。

代码 TODO

  • 定义 AgentToolToolResult、Schema 校验;
  • 工具注册表;
  • 只读/低风险写/付费/人工确认权限级别;
  • AgentRun 状态迁移校验;
  • Step 创建、开始、成功、失败幂等服务;
  • 运行级预算与步骤上限;
  • AITask 关联和费用汇总;
  • 取消、恢复、stale 标记;
  • 最小运行查询 Serializer
  • 不实现模型自由 tool-calling 循环。

预计目录:

core/backend/apps/agents/runtime.py
core/backend/apps/agents/registry.py
core/backend/apps/agents/policies.py
core/backend/apps/agents/permissions.py
core/backend/apps/agents/tools/base.py
core/backend/apps/agents/tests/

测试:

  • 非法状态迁移拒绝;
  • 重复执行同 Step 不产生副作用;
  • 超预算停止;
  • 取消后不创建新 Step
  • waiting_task 恢复使用原 AITask
  • 跨团队工具调用拒绝。

完成标准:可用假工具跑完一个固定 Run,未接任何业务 Agent。

启动口令:确认开始 S04
完成口令:确认完成 S04,进入 S05


[ ] S05:脚本 ContextSnapshot 与 Brief

依赖:S04 已验收。

目标:建立脚本 Agent 稳定输入,不让 Coordinator 直接 ORM。

代码 TODO

  • ScriptAgentRequest/v1 Schema
  • ScriptContextSnapshot/v1 Schema
  • ScriptBrief/v1 Schema
  • get_project_script_context.v1 工具;
  • get_product_context.v1 工具;
  • get_source_script.v1 工具;
  • 冻结 project/product/selling points/source script 版本;
  • 规则构建 Brief
  • 返回结构化缺失项;
  • 计算 snapshot hash。

测试:

  • auto/theme/manual/revise/segment snapshot
  • 商品、卖点和脚本 team 校验;
  • 缺失字段返回固定错误码;
  • 同输入 hash 稳定;
  • 商品修改可检测 stale。

完成标准:不给模型调用,也能生成完整 Brief 或明确缺失项。

启动口令:确认开始 S05
完成口令:确认完成 S05,进入 S06


[ ] S06:确定性脚本校验器

依赖:S05 已验收。

目标:把能用代码判断的规则从提示词和模型自检中移出。

代码 TODO

  • ScriptValidationReport/v1
  • JSON/字段类型检查;
  • 镜数、总时长、单镜时长;
  • 旁白字数;
  • hook/pain/selling/cta 覆盖;
  • 卖点覆盖;
  • 实体与 entity_refs
  • 商品事实、价格、认证、功效来源;
  • 禁止词和绝对化表达;
  • revise_segment 越界修改;
  • issue code、severity、repairable。

测试:每个规则至少一个通过样例和一个失败样例。

完成标准:输入草稿可稳定得到可审计报告,不调用模型。

启动口令:确认开始 S06
完成口令:确认完成 S06,进入 S07


[ ] S07:脚本生成工具接入 AITask

依赖:S06 已验收。

目标:把 S02 生成内核包装成受控付费工具。

代码 TODO

  • quote_text_generation.v1
  • generate_script_draft.v1
  • 能力需求与实际 ModelConfig 记录;
  • 用户明确模型时校验,不静默替换;
  • 自动模式仅在 policy 允许时路由;
  • 每次模型调用创建/关联一条 AITask;
  • ToolResult 只返回 Draft 和任务摘要;
  • Provider 失败复用现有退款;
  • 输入快照和 prompt version 进入 request_payload。

测试:

  • 明确模型/自动路由;
  • 余额不足;
  • Provider 失败;
  • 契约异常;
  • 重复工具执行不重复扣费。

完成标准:工具可独立生成 Draft,尚未自动保存和编排。

启动口令:确认开始 S07
完成口令:确认完成 S07,进入 S08


[ ] S08:脚本 Coordinator MVP

依赖:S07 已验收。

目标:先实现最短闭环,不接语义评审和自动修订。

MVP 流程:

collect_context
→ build_brief
→ quote
→ generate_once
→ normalize
→ validate
→ save_candidate
→ waiting_human

代码 TODO

  • 固定状态迁移;
  • 每一步对应 AgentStep
  • 缺输入进入 waiting_user
  • 超预算进入 waiting_approval
  • AITask 执行时进入 waiting_task
  • 校验失败保存报告并进入 needs_review
  • 通过后保存未采用 ScriptVersion
  • Run 可取消、恢复;
  • 不自动 adopt。

测试:正常、缺输入、余额不足、生成失败、校验失败、取消、恢复、重复调度。

完成标准:后端测试中能完整运行一次 Agent MVP。

启动口令:确认开始 S08
完成口令:确认完成 S08,进入 S09


[ ] S09Agent API、事件和恢复任务

依赖:S08 已验收。

目标:提供稳定 API,前端断线不影响 Agent。

代码 TODO

  • 创建 ScriptAgentRun API
  • Run/Steps 查询 API
  • actions API:补输入、批预算、取消、请求修改;
  • 事件查询 after=sequence
  • 可选 SSE 仅投影数据库状态;
  • Celery resume task
  • 活动 Run 扫描和僵尸恢复;
  • 同项目同 Agent 活动运行限制;
  • API team/permission 校验。

测试:断线重连、重复创建、并发 action、越权、恢复不重复调用模型。

完成标准:不依赖浏览器连接即可完成 Run。

启动口令:确认开始 S09
完成口令:确认完成 S09,进入 S10


[ ] S10:前端接入真实 Agent 状态

依赖:S09 已验收。

目标:在现有脚本页面灰度接入,不重做整页。

代码 TODO

  • 新增 Agent API/types
  • 输入摘要卡;
  • 真实计划和 Step 状态;
  • 缺失信息补充卡;
  • 预算确认卡;
  • 校验报告;
  • 候选脚本和采用入口;
  • 页面刷新恢复 Run
  • feature flag 切换 Agent/legacy
  • 移除 Agent 模式下的硬编码假“自检完成”。

测试:组件状态、刷新恢复、错误展示、legacy 页面不受影响;执行前端 build。

完成标准:灰度用户可以完成 MVP,旧入口仍可回退。

启动口令:确认开始 S10
完成口令:确认完成 S10,进入 S11


[ ] S11:Handoff、采用前检查和输入过期

依赖:S10 已验收。

目标:让下游读取结构化交接,不依赖 Agent 对话。

代码 TODO

  • ScriptHandoff/v1
  • required_assets/acceptance/open_questions
  • AgentArtifact 关联 ScriptVersion 和报告;
  • ScriptVersion metadata 写 run/schema/hash 摘要;
  • check_script_adoptable.v1
  • adopt 前比较 snapshot hash
  • stale 禁止采用;
  • 采用仍调用现有业务服务。

测试:Handoff Schema、过期输入、采用事务、下游实体/资产需求读取。

完成标准:采用脚本有可追溯 Handoff,Agent 不直接推进下一阶段。

启动口令:确认开始 S11
完成口令:确认完成 S11,进入 S12


[ ] S12:可选语义评审与一次定向修订

依赖:S11 已验收;S00 已确认首期需要此能力。

目标:在 MVP 稳定后增加有限协作,不修改固定状态机边界。

代码 TODO

  • ScriptReviewReport/v1
  • review_script_semantics.v1
  • 仅规则通过或指定 warning 时评审;
  • revise_script_draft.v1
  • 只传结构化 issue
  • 自动修订最多一次;
  • 修订后重新跑全部规则;
  • 第二次仍失败进入 needs_review
  • 评审/修订分别报价和关联 AITask。

测试:跳过评审、评审通过、定向修订、预算不足、达到上限。

完成标准:绝不形成无限评审/修订循环。

启动口令:确认开始 S12
完成口令:确认完成 S12,进入 S13


[ ] S13:完整回归、指标和灰度

依赖:S11;如实施 S12 则还依赖 S12。

代码 TODO

  • 全模式集成测试;
  • 任务、退款、恢复、采用回归;
  • 指标:契约通过率、事实错误率、卖点覆盖率、采用率、费用、耗时;
  • feature flag 按团队灰度;
  • 管理端能查询 Run/Step/AITask
  • Agent 出错允许用户主动回旧入口;
  • 完成发布/回滚说明。

灰度闸门:先内部团队,再小比例客户,再逐步默认开启;每一级都需要用户确认。

启动口令:确认开始 S13
完成口令:确认完成 S13,进入 S14


[ ] S14:旧脚本编排退役评估

依赖:S13 已稳定运行至少一个约定观察周期。

本步骤默认只评估,不直接删除。

检查:

  • 是否还有客户端调用 script-agent-stream
  • 是否还有活动旧任务;
  • Agent 成功率、费用、耗时、采用率达标;
  • 历史任务和脚本可继续读取;
  • 新生成内核已被工具复用;
  • 回滚方案存在;
  • 用户明确批准下线。

允许删除:旧前端入口、旧 SSE 编排薄壳、硬编码假步骤。
禁止删除:生成内核、normalize、ScriptVersion、AITask、计费、Provider、采用服务。

启动口令:确认开始 S14 评估
删除口令:确认执行旧脚本编排下线
完成口令:确认完成 S14

4. 每步完成汇报模板

步骤:Sxx
状态:等待用户验收
本步改动文件:
行为变化:
数据库 migration:有/无
测试命令与结果:
未通过项:
遗留风险:
回滚方式:
未实施的下一步内容:
请确认:“确认完成 Sxx,进入 Syy”

5. 推荐首次执行

S00 开始。没有得到 确认开始 S00 前,不修改任何代码。