第 85 章 可复现生成执行器:队列、预算、重试与证据

第十六部 工程实施与制作基础设施

第 85 章 可复现生成执行器:队列、预算、重试与证据#

本章目录
85.1 可复现任务与预算前置85.2 数据传输、结果校验与重试85.3 任务生命周期与运行可观测性85.4 生产验收、交接与值班

Prompt 编译完成后,需要一个执行器安全调用外部服务。它不是几行 API 请求,而是任务租约、幂等、预算、上传下载、校验、重试、取消、日志和候选入库的组合。

85.1 可复现任务与预算前置#

任务记录。

generation_task:
  task_id: gen_e001_sh015_v04
  status: ready
  prompt_manifest: prun_e001_015_a04
  capability_token: cap_gen_015
  budget_reservation: budget_015_04
  priority: high
  deadline: 2026-07-06T04:00:00Z
  attempt_limit: 4
  lease_owner: null
  lease_expires_at: null
  output_contract: candidate_video.v2

Worker 领取短时租约,崩溃后租约过期可被重新领取。任务状态更新使用乐观并发,防止两个 Worker 同时提交。

幂等调用。

内部任务 ID、尝试 ID 和供应商请求 ID 分开。每次受控变量变化产生新尝试;网络超时重发同一次尝试仍使用相同幂等键。供应商不支持幂等时,执行器先登记调用意图,再查询可能已完成的远端任务,不能立即重复付费。

attempt:
  attempt_id: att_gen015_04
  idempotency_key: gen015:prompt_sha_ddd:attempt04
  changed_variable: micro_eye_shift
  held_constant: [model, seed_family, keyframes, reference_bundle]
  provider_job_id: remote_90211
  status: downloading

预算是执行前置条件。

调用前检查项目、集、场和任务四级预算,创建预留。供应商返回后按实际结算,失败是否收费依据账单规则记录。没有预留的调用被技术拒绝,管理员也不能靠注释绕过。

预算耗尽时保存已得候选、评测和日志,任务进入 awaiting_budget_decision。系统不自动降低分辨率或换便宜模型,因为那会改变验收条件。

85.2 数据传输、结果校验与重试#

上传与隐私最小化。

只上传当前任务需要的裁剪参考,文件名使用匿名资产 ID,移除无关元数据。真人授权原件、完整剧本和未来集秘密不外发。上传前验证权利与数据策略,下载后按供应商保留政策请求删除或登记到期时间。

所有输入计算校验和,避免同名文件被替换。签名 URL 短时有效且绑定只读对象,日志不记录完整敏感地址。

下载、校验与隔离。

结果下载到隔离区,验证文件类型、魔数、尺寸、帧率、时长、损坏、恶意内容和校验和。供应商响应中的文件扩展名不可信。校验通过只代表技术可读,不代表创作批准。

候选记录输入血缘、模型、时间、成本和 Usage 限制。任何缺失来源的媒体不能进入资产库,即使人工很喜欢。

重试分类。

429、超时和临时 5xx 可指数退避;Schema 错误、权限拒绝和权利阻断不可重试;生成质量失败需先由评测或人类选择新受控变量,不能由执行器盲目重复。重试上限同时受次数、成本和截止时间约束。

供应商连续失败触发熔断。熔断打开后,新任务快速失败并路由人工或兼容回退,避免队列堆积和预算失控。

85.3 任务生命周期与运行可观测性#

取消与过期。

上游 Episode Pack 更新后,等待任务标记 superseded;运行中任务尝试远端取消,无法取消则完成后隔离,不进入评审。结果抵达时再次检查输入版本,防止旧任务晚到污染新批次。

截止时间过期不等于删除。保存执行证据并说明未完成原因,制片可选择重新排期、降级镜头设计或取消需求。

可观测性。

指标包括排队、编译、上传、供应商处理、下载、验证、人工等待、每类失败率、批准秒成本和预算偏差。Trace 从 Episode Pack 贯穿到远端请求和资产 ID。日志结构化并遮蔽敏感字段。

API 200、远端任务完成、文件校验通过、创作验收通过是四个不同成功事件。仪表盘必须分开显示。

最小实现与生产实现。

小团队可从单机 SQLite、目录对象存储和一个 Worker 开始,但仍要有任务 ID、状态机、幂等键、预算字段和 Manifest。规模化后迁移到持久队列、对象存储、集中事件与多 Worker;业务语义保持不变。

不要从复杂集群开始,也不要用文件夹轮询作为永久事实源。最小实现必须为迁移保留稳定接口。

85.4 生产验收、交接与值班#

故障树。

同一任务被扣费两次:超时重试没有幂等;旧结果进入新剪辑:提交时未检查上游版本;任务一直 running:租约与心跳缺失;下载文件能打开却不可追溯:入库没有强制 Manifest;质量失败无限重试:执行器越权选择创作变量。

SOP、检查表与交付物。

创建任务与预留;领取租约;验证 Token 与输入;登记调用意图;调用与轮询;下载隔离;技术校验;结算预算;提交候选;触发独立评测;处理取消、重试和熔断。

  • 网络重试不产生新创作尝试。
  • 每次调用都有预算预留。
  • 旧版本结果无法自动提交。
  • 敏感输入遵循最小上传。
  • 技术成功与创作成功分开。

练习:用模拟供应商实现执行器并注入超时、重复响应和晚到结果,交付 task_schema.jsonworker/provider_mock/budget_ledger.csvtrace_samples/failure_test_report.md

交接与值班演练。

让没有编写执行器的值班者处理一次远端超时:他应从 Trace 找到调用意图,确认供应商任务是否存在,判断能否安全重试,查看预算预留,并在不查询开发者私人聊天的情况下完成恢复。若必须请原作者解释,Runbook 和可观测性仍不合格。

再模拟上游在任务运行中锁定新 Pack。正确结果是旧远端任务即使成功也进入隔离,并保留已支付成本;新任务使用新幂等键和新预算预留。值班者不得把旧视频手工改名塞进新目录。演练报告记录发现、判断、行动、恢复和证据缺口,并把缺口变成自动测试。

执行器只有在重复投递、进程崩溃、网络超时、预算耗尽和上游更新五种情况下都保持状态与账本一致,才可以进入真实预算环境。