多模态
状态:现在 (Running today)
多模态交付门控(R8)与多模态 provider 契约(R16)已在 Runtime 内核中交付。
多模态产出的不是文本。Runtime 持有规范输入字段、产物形状、适配器路由、交付门控;App 负责展示或消费产物,不能重新定义产物的真值。
能力面
Runtime 的多模态契约覆盖以下能力:
| 能力 | 产出物 |
|---|---|
| 图像 | 由图像引擎生成的栅格图像 |
| 视频 | 由视频引擎生成的视频产物 |
| 音频 | 音频生成 |
| 语音 | 文本转语音(AI_TTS),含声音克隆(AI_TTS_CREATE_VOICE、AI_TTS_SYNTHESIZE) |
| 音乐 | 音乐生成,包含迭代支持 |
每种能力都对应准入的规范输入字段、准入的产物形状、准入的交付门控。App 不能自创新的产物 MIME 类型,也不能跳过交付门控。
规范输入字段
每次多模态请求都有一份强类型的规范输入。App 按契约组装:
| 字段 | 用途 |
|---|---|
| Capability id | 调用的是哪个能力 |
| Provider context | 可选的 provider 专属扩展 |
| Resource references | 输入资源(已存在的产物) |
| Generation parameters | 该能力的专用参数 |
规范字段定义在 runtime/kernel/tables/multimodal-canonical-fields.yaml。如果 App 给出的输入形状不符合契约,准入阶段就会 fail-closed。
Provider 异步任务生命周期
多模态生成通常是长任务。Runtime 把它建模成 provider 异步任务,配套强类型生命周期:
| 状态 | 是否终态 |
|---|---|
queued | 否 |
running | 否 |
succeeded | 是 |
failed | 是 |
expired | 是(等价于超时) |
注意这里用 lower_snake,与 ScenarioJob 的 UPPER_SNAKE 区分。Provider 异步任务是 provider 边界上的归一化;命名沿用 provider 语义。
异步态到 ScenarioJob 的映射
Provider 异步终态确定性地映射到 ScenarioJob 终态:
| Provider 异步态 | ScenarioJob 终态 |
|---|---|
succeeded | COMPLETED |
expired | TIMEOUT |
failed | FAILED |
映射规则(K-MMPROV-027)已准入;App 跨模态看到的是同一种统一形状。
产物归一化
多模态输出归为一份产物,带强类型规范字段。App 通过产物契约消费:
| 产物字段 | 用途 |
|---|---|
| Artifact id | 稳定身份 |
| MIME type | 由契约给出,不靠猜测 |
| Bytes / 引用 | 在哪里读取产物 |
| Provenance | 谁产出的,源自哪条请求链路 |
| 交付门控裁决 | 门控是否准入交付 |
产物字段准入定义在 runtime/kernel/tables/multimodal-artifact-fields.yaml。缺必填字段的产物会 fail-closed。
交付门控
多模态产物生成成功,并不意味着它会立刻送到 App 手里。交付门控决定一份产物何时允许交付。
| 门控关注点 | 为什么重要 |
|---|---|
| 敏感度分类 | 部分产物可能需要审批 |
| 来源完整性 | 来源不完整的产物可能被隔离 |
| Schema 校验 | 不符合契约的产物 fail-closed |
| 用户策略 | 用户偏好可以拦截交付 |
具体门控由 runtime/kernel/tables/runtime-delivery-gates.yaml 准入。App 看到门控裁决,但不能绕过它。
音乐迭代
音乐生成允许迭代:在准入的参数下,对一份产物迭代出变体。
| 属性 | 值 |
|---|---|
| 迭代种类 | MUSIC_GENERATE(按 K-MMPROV-* 准入) |
| 链路 | 每次迭代都引用前一份产物 |
| 审计 | 迭代记入生成链路 |
迭代被准入契约约束;App 不能在运行时自造新的迭代种类。
声音克隆
语音能力在强类型契约下支持声音克隆。
| 操作 | 用途 |
|---|---|
AI_TTS_CREATE_VOICE | 用输入音频创建声音档案 |
AI_TTS_SYNTHESIZE | 用准入的声音档案合成语音 |
AI_TTS | 使用准入声音的标准 TTS |
VoiceAsset 生命周期由声音契约(K-VOICE-*)准入;声音档案有准入的引用契约。
读者场景:图像生成任务
App 通过一个长任务 provider 生成图像。
- 图像操作。 App 请求准入的
AI_IMAGE操作。 - 创建 ScenarioJob。 Runtime 创建一个
ScenarioJob。 - Provider 异步任务。 Provider 返回任务 id;状态
queued → running。 - 轮询 / 流式。 Runtime 跟踪任务并发出强类型进度更新。
- 任务成功。 Provider 状态切到
succeeded。按K-MMPROV-027,ScenarioJob终态为COMPLETED。 - 产物交付。 图像产物带强类型规范字段、MIME 类型、来源。交付门控校验 schema、来源、敏感度。准入则交付完成。
- App 收到产物。 通过 SDK 的强类型产物形状。MIME 类型由契约给出,App 不需要猜。
没有发生过的事情:App 没有拿到一个无来源的自由 URL;App 没有看到被猜出来的 MIME;产物没有绕过交付门控。
读者场景:音乐迭代
用户生成了一段音乐,想做迭代。
- 第一次生成。 音乐生成任务完成,产出一份产物。
- 请求迭代。 App 用强类型参数发起迭代,引用原始产物。
MUSIC_GENERATE准入。 迭代按K-MMPROV-*准入。- Provider 异步生命周期。 迭代通过 provider 异步生命周期。状态按前述映射进入
ScenarioJob终态。 - 新产物。 迭代产物引用原始产物;链路得以保留。
迭代是强类型操作;链路是结构化的,不靠注释。
读者场景:Provider 异步任务过期
一段长视频生成命中 provider 端的超时。
- Provider 状态切换: 从
running进入expired。 - 映射。 按
K-MMPROV-027,ScenarioJob终态为TIMEOUT。 - 任务影响。
ScenarioJob进入终态,任何重试仍受准入的重试策略约束。 - 审计。 记录过期及原因。
App 看到的是强类型 TIMEOUT,不是模糊的"请求失败了";ScenarioJob 的终态类型告诉 App 发生了什么。