文档
03 平台04 媒体供应04_开发

MG-04-005 模型调度接口

2026-10-13 实现。范围为内部视频供应网关的单个标准模型;现行职责见 CURRENT_BOUNDARY,认证见 管理会话与 CSRF。浏览器沿用独立管理员会话,运维沿用管理 Bearer,服务 Key 不具备管理权限。

设置仅作用于当前模型已有路由。保存/预览不创建供给或 Provider 任务,不修改原生 Supply 的启用、验收、能力、采购规则或共享并发上限。

视频启停由管理员决定(MG-ACTIVATION-02,2026-10-16现行)

用户明确取消视频成功出片核验的强制启用条件。启用仍校验管理员会话/版本、有效渠道凭据/协议、基础规格、并发与采购报价;无成功测试、测试失败或旧版本证据不再单独阻止视频启用。production_ready在视频中表示管理员批准参与正式选路,不表示已测试成功;现有能力、健康、容量、成本/币种、降级规则和停用排除仍生效,不默认开启任何供给。

测试记录和真实核验状态独立保留。GET SupplyDetail增加只读TestVerified,activation增加test_verified,Console state投影为供给test_verified;状态按当前能力/凭据与真实证据判断,启用不会创建证据或标记测试通过。可选测试/核验只更新记录及版本,不自动改变视频启停;失败/未交付仍不能核验为成功,原operation和封存结果保护不变。图片证据门禁及测试后失效行为不变。

Migration041仅将视频证据要求移出数据库production_ready触发条件,不改数据;down恢复040规则,回退前需明确处理管理员已启用但无成功证据的供给,不能伪造证据或删除任务。以下MG-ACTIVATION-01的“保留成功交付强制要求”已由本节替代,其余最小配置和备选隔离规则继续有效。

视频启用的最小门禁(MG-ACTIVATION-01,2026-10-16)

视频供给启用保留有效渠道/凭据/协议、并发、当前采购报价和当前能力/凭据的成功交付证据。基础执行能力仅要求有效的画质、时长和画幅,不再强制填写全部素材大小/数量、音频、真人政策、人工核对依据与verified_at。标准请求参数继续由统一模型目录维护,Supply仅表示当前渠道的执行范围;目录发布不代替真实出片核验。

未知能力不推测为支持:无素材的普通视频不受素材资料空缺阻塞;请求使用参考素材、生成音频或真人能力时,实际Matcher仍检查对应能力,未知则排除该供给。已有明确限制继续生效。结果成功与封存、凭据轮换、版本/CAS及未知提交核对不变。

模型发布至少需要一个已启用、生产就绪、渠道有效且采购币种可用的exact供给。其余尚未就绪的已选供给保留绑定,在activation.warnings显示,暂不参与运行选路;不再让它们阻塞可用模型。已就绪的降级供给仍要求已验证且披露的降级规则。图片门禁不变。后台状态文案改为“待核验”。

Migration 040仅替换enforce_supply_production_ready函数的视频分支,不修改业务行。down恢复旧函数;旧规则可能再次阻止基础资料供给的后续更新,不回删既有供给或任务。

当前管理端:按分辨率独立列表(2026-10-15)

GET 增加 ?schema_version=2,返回 configuration.qualities;省略或指定 1 继续返回旧兼容视图。schema 1 模型按真实单分辨率能力合成 schema 2,读取不写库;多分辨率或未知能力的 exact Supply 不能合成。

{"schema_version":2,"qualities":[{"resolution":"720p","routes":[{"supply_id":"22222222-2222-4222-8222-222222222222","enabled":true,"concurrency_limit":null}]}]}

每个模型的每个分辨率是一张独立排序表。列表必须覆盖全部 exact Binding,Supply 只能出现一次且实际能力恰好属于该分辨率。表内位置写入 tier=i+1、manual_order=i;不同分辨率互不竞争。没有隐式价格重排或权重。

PUT 使用原 If-Match 保护,body 为 {"configuration":<完整 schema 2>,"max_attempts":2}。max_attempts 可省略以保留原值,明确值只有 1/2,分别表示不换/最多换一次。此子集只支持 schema 2;保存与草稿预览关闭 reliability_gate_enabled,保留其他策略字段、发布状态、审计及容量语义。草稿预览也可带 max_attempts,须同时带完整 schema 2 draft 与 model_version。

已有 schema 2 拒绝旧 schema 1 写入。全量 video-configuration 对已有 schema 2 保留每个分辨率的顺序、选用、路线上限和模型策略;关联变化仅增删成员,新成员追加在该分辨率末尾且默认未选用。渠道 JSON 的 priority_tier 对 schema 2 不写入调度。无 SQL 迁移。

管理端 /supplies/video 和 /models/:modelID/dispatch 使用同一工作区:一次选择模型,直接显示全部分辨率表。供给验证、完整参数测试和运行管理位于 /supplies/video/operations;状态链接携带 supply_id。首选以服务端 selected_supply_id 为准;备选依表内顺序和实际排除原因计算,不依赖诊断数组的返回顺序。停用/未发布模型不显示首选。请求检查折叠,所有分辨率并行只读预览,取消与签名保护阻止旧结果覆盖新编辑。

按价格排序为管理员明确的一次操作,比较同一时长、音频等条件的确定 CNY 总额;未知报价保留相对顺序置后。复制按稳定父 Supply 身份匹配规格,仅复制顺序,不复制选用和容量,不建立继承。

下面 schema 1 的组、档位和继承说明仅用于历史接口兼容。

三个真实接口

方法与路径行为
GET /admin/v1/public-models/{id}/dispatch-configuration同一 PostgreSQL 读取快照:模型、调度设置、真实能力变体
PUT /admin/v1/public-models/{id}/dispatch-configurationIf-Match 原子保存,返回读回的同形聚合和 ETag
POST /admin/v1/public-models/{id}/dispatch-preview草稿或已保存设置的只读 Planner 决策

{id} 为网关标准模型 UUID;视频管理边界拒绝图像 ID。预览模型名由服务端按此 UUID 覆盖,不由客户端选择其他模型。

成功封装 {"data": ...};GET/PUT ETag 为带引号模型版本,如 "7"。错误封装 {"error":{"code","message","type","request_id"}},可附加 field。任何失败都保留本地草稿;409 重新读取并比较,不自动以新版本重发覆盖。

GET 聚合

data 字段内容
model既有 PublicModel:UUID、名称、启用/发布状态、版本、public_capability
model_version本聚合的模型版本,与 model.version 一致
dispatch_policy既有 DispatchPolicy,可为 null;schema 2 可编辑 max_attempts
configuration按请求版本返回 schema 1 或 schema 2 调度设置
variants全部 exact Binding 对应的真实 Supply,包含 Binding 停用项
as_ofUTC/RFC3339 观察时间,不是历史状态回放

每个 variants[]:

supply_id, parent_supply_id
channel_id, channel_name, upstream_model, display_name, resolution
version, enabled, production_ready, concurrency_limit
video_capability, cost_rules

enabled/production_ready/concurrency_limit/version 是真实 Supply 字段,不是草稿开关。video_capability 可为 null;resolution 仅在能力恰有一个分辨率时给出。cost_rules 为观察时间已生效的采购规则版本,金额使用定点字符串及明确币种,不等于已核对账单。聚合不返回凭据,不伪造健康或空闲容量;健康/占用通过 preview decision 读取。

typed 设置、继承及完整覆盖

持久化位置为 PublicModel.public_capability.dispatch_configuration:

{
  "schema_version": 1,
  "groups": [{
    "parent_supply_id": "11111111-1111-4111-8111-111111111111",
    "tier": 1,
    "manual_order": 0,
    "enabled": true,
    "concurrency_limit": 2,
    "variants": [
      {"supply_id": "22222222-2222-4222-8222-222222222222", "override": null},
      {
        "supply_id": "33333333-3333-4333-8333-333333333333",
        "override": {"tier": 3, "enabled": true, "concurrency_limit": null}
      }
    ]
  }]
}

UUID 仅是结构示例。实际保存必须提交 GET 返回的完整 exact 成员集,包括 Binding 停用项;不得缺项、重复、加入未知/其他模型供给。每个父 Supply 只有一组。console_variant.parent_id 为真实父关系;无变体映射的原生 Supply 以自身为父。服务端核对父/子渠道、上游型号、请求和 adapter 协议,拒绝错父。非 exact、降级及历史 Binding 保留。详情接口不能新增/删除关联;目录能力增删仍走既有全量事务。

边界与含义:

  • schema_version=1;最多 500 个组,Binding 聚合最多 500 项。
  • tier 为 1–10,000,较小值优先;manual_order 为 0–1,000,000。
  • concurrency_limit 为 null 或 1–100,000 的整数。
  • 组及 override 必须明确写出全部字段;false/null 不能以缺字段代替。
  • override:null 继承父组的 tier/enabled/concurrency_limit。
  • 非 null override 是完整设置;其 concurrency_limit:null 表示沿用真实 Supply 上限,不继承父组的并发字段。
  • 变体人工次序继承组 manual_order。父移档后,显式覆盖档位/并发不动;恢复继承写 override:null。

最终 Binding 参与开关为 group.enabled AND (override == null ? true : override.enabled)。父关闭始终否决子开启。路由参与不能绕过真实 Supply 停用/未验收、渠道停用/归档、能力、健康、采购或容量门禁。

PUT 事务与发布状态

请求要求 If-Match: "7",body 为 {"configuration":<完整 schema 1>},不是局部 patch。模型须已有 dispatch_policy;此接口不创建策略。

事务持有模型行锁,验证版本/完整集/父关系;typed 元数据与有效 Binding tier/manual_order/enabled、策略、模型版本、审计一起提交。任一失败全部回滚,不修改其他模型或共享 Supply。无语义变化可不增版本。

首次 typed 保存采用 routing_version=1/manual_priority,使档位规则生效;保留既有策略数值、可靠性门禁和尝试预算。缺失的旧 v1 字段沿用既有 30 样本/168 小时规范值。同角色较小档位优先;同档可比较的完整预计采购额升序,再按人工次序、Supply UUID。同档报价缺失或币种不可比较时保留人工次序,未知报价仍不能取得执行资格。

普通排序保持原已启用且发布模型,但必须维持既有发布门禁。停用/未发布模型不会自动启用。已发布模型关闭全部 exact Binding 返回 422,原配置、发布状态及审计不变。草稿可以预览全部关闭;停用模型可保存关闭设置并保持停用。空 groups 只有当前确无 exact Binding 时才是完整集。

POST 预览与两来源版本

已保存来源请求示例:

{
  "request": {
    "prompt": "海面上的纸船",
    "duration_seconds": 10,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "billing_mode": "auto",
    "generate_audio": false
  },
  "model_version": 7,
  "reference_summary": {"images": 1, "videos": 0, "audios": 0}
}

加入 draft:<完整 schema 1> 即预览草稿。

来源model_version
草稿必须正整数并与当前一致;缺失/过期返回 409
已保存,明确给 N当前仍为 N 才预览;过期/非正数返回 409,不能悄悄改读 N+1
已保存,省略读取当前配置;响应给实际版本

读取候选及返回结果均保护明确版本。草稿使用与保存相同完整集/父关系校验,仅叠加当前模型路由。

request 沿用 material.StoredRequest 支持的标准视频字段,包括时长、分辨率、比例、billing_mode、generate_audio、seed、增强、fallback 等。服务端设置当前 schema/模型名,保留显式 0/false 并按现有 domain/能力验证。真实 reference_images/videos/audios 必须是合法 StoredMaterial 描述,不能传未检查的 URL 数组。

成功 data:

configuration_source: "draft" | "saved"
model_version
as_of
decision: 既有 scheduler.Decision

decision.candidates[] 含 supply_id/channel_id/binding_role/tier/manual_order、included/exclusions、quote/expected_success_cost、health_state/success_rate/cold_start/available_capacity。quote 使用固定小数成功/失败预估及 cost_rule_id/version。无首选时 selected_supply_id 可省略,应展示 selection_reason/排除原因。真实模型停用/未发布时清除首选,给出 standard_model_disabled。

preview 与执行复用 Planner,读取真实 Supply/验收、能力、健康、成本、可靠性及全局占用。不写配置、审计、routing_decision、Task、Attempt 或 Lease,不获取素材/创建上传/占用容量/调用 Provider。预览是观察时点决策,执行另行原子 Acquire。

共享 Supply 的路由并发

模型设置是路线限制,不是独立配额或额外资源池。每个真实能力变体仍为原生 Supply 调度原子。

有效供给并发 = min(真实 Supply 上限经健康降额后的值, 当前模型路线明确上限)

路线上限 null 时只沿用原生/健康上限;渠道上限共同检查。Planner 容量判断与实际 Acquire 使用同一有效值。活动租约按 Supply 全局计数,覆盖所有引用模型。改 A 模型不改 B 设置,但两者共享实际占用。Redis 丢失从 PostgreSQL 活动 Lease 重建,改档/覆盖/切模型不会产生新容量。

接受快照已包含 typed 模型设置、能力/成本版本及上游映射。后续编辑不改既有任务配置;实时 Supply/渠道停用、验收、健康和容量仍可否决执行。历史任务、降级、旧父 Supply 与恢复链保留。

reference_summary 边界

禁止摘要与任何真实 reference 数组混用。摘要统一使用 reference 角色,不表示文件大小、类型、首尾帧或内容已通过检查。

模型图片/视频/音频计数上限视频合计时长
名称以 seedance-2.0 开头9 / 3 / 3最多 15 秒
其他现有视频模型30 / 10 / 10最多 31 秒

计数为非负整数。视频/音频非零分别要求 video_duration_seconds/audio_duration_seconds,是对应类型全部素材的合计整数秒数;合计至少为数量,按条分配至少 1 秒。零计数禁止带该时长;音频合计最多 600 秒。能力更严限制仍由 Matcher 排除。

内部假设最小正字节大小,构造只读素材描述,不取/存媒体。不可执行 schema 与空对象位置使 StoredRequest Validate/Encode/Decode 拒绝成为执行输入。参考音频数量不自动设置 generate_audio 或输出音频附加报价;参考视频附加成本未知仍排除。

错误与历史兼容

HTTP主要原因/代码
400JSON/未知字段/类型错误,或缺明确字段:INVALID_REQUEST
401无有效管理员权限
404未知模型/非视频范围:CATALOG_NOT_FOUND 或边界 404
409保存/明确预览版本冲突:CONFIG_VERSION_CONFLICT
422成员集、父关系、边界或参数非法:INVALID_CONFIGURATION;发布门禁:PRODUCTION_GATE_FAILED
428PUT 缺合法 If-Match:CONFIG_VERSION_REQUIRED

无 typed 时 GET 合成既有 exact Binding,不写库;不同档位/参与状态用显式覆盖表达。旧 tier 0 规范到 1,超出详情范围的旧 tier 规范到 10,000;同父组人工次序在首次明确保存统一。旧无 typed 全量 video-configuration 仍保持同父变体同档/次序;带 typed 的全量保存按新规则物化。旧 Binding-only 入口不能写出与 typed 不一致的成员/档位/开关。

video-simulate 保留已保存配置的兼容行为;新详情用 dispatch-preview 支持草稿/素材摘要。此文取代旧文中针对新详情“所有变体必须同档、无独立覆盖”的描述,不恢复历史客户/价格或图像入口。

真实组件验证

  • internal/publicmodels/dispatch_configuration_test.go:继承/恢复、完整覆盖、父 AND 开关、明确字段/成员边界及 legacy 合成。
  • internal/app/dispatch_configuration_test.go:8 项 PostgreSQL+Redis 组件,含错误/晚期审计失败整表回滚、当前模型与共享 Supply 隔离、preview 零写入、保存后 Planner 一致、native/健康容量、接受快照、真实 Acquire/重建/释放,以及 saved stale 409/省略读最新。
  • internal/video/dispatcher/dispatch_configuration_test.go、preview_material_test.go、service_test.go:路由 cap、摘要不可执行、Acquire 接收相同有效 cap。

8 项调度组件在隔离 PostgreSQL 17、Redis、普通 owner 下通过 race;负责范围普通/组件测试、vet、gofmt、diff 检查通过。未使用业务数据库或付费 Provider。真实供给验收、平台联调、生产切流与编译/组件通过分列;最终交付状态见 MG-DISPATCH-02。

视频调度设置弹窗(MG-DISPATCH-05)

顶部“调度设置”打开当前标准模型的失败处理配置,现有max_attempts=1/2分别显示“结束任务,不切换供给”及“切换下一个供给,最多再试一次”。仅对明确失败执行该策略,提交未知仍按原任务核对;保持原请求规格,不增加隐式降级。弹窗内修改为独立草稿,取消丢弃;点击“保存设置”即按当前版本/CAS持久化,成功后关闭,无需页面二次保存(MG-DISPATCH-06)。弹窗提交已保存的分辨率顺序及新max_attempts,不隐式保存页面排序草稿;回读新版本后保留该排序草稿,后续排序保存使用新版本。保存中禁止重复提交/关闭,失败保留弹窗选择与错误,冲突不自动重试。没有新增执行选项或接口。测试按钮移至顶部操作栏,存在未保存调度时仍禁止测试,沿用原测试窗口和付费提交确认。

视频调度顺序自动保存(MG-DISPATCH-07)

拖拽、键盘移动、价格排序、复制顺序及参与状态修改后,300ms合并连续编辑并自动提交现有配置接口,无常驻页面保存/撤销按钮。每模型串行提交完整配置与当前版本;请求中再次调整时保留最新草稿,回读后使用新版本继续保存。自动保存由共享状态管理,应用内切换模型或页面仍继续处理;初次读取和请求检查不写配置。关闭浏览器前应等待“已保存”。

顶部显示等待保存/正在保存/已保存。网络失败保留草稿并停止自动重试,提供重试保存与放弃更改;版本冲突必须重新载入,不能覆盖其他会话修改。待保存期间禁用调度设置与测试;顺序落库后可在弹窗直接保存失败策略。此前MG-DISPATCH-06关于页面手工保存排序草稿的说明由本节替代。

On this page