feat: add workflow orchestration and media governance

This commit is contained in:
xz
2026-08-24 22:36:43 +08:00
parent 9811469a64
commit aa0e0be27a
16 changed files with 775 additions and 13 deletions
+67
View File
@@ -28,6 +28,8 @@ user → organization → workspace → project → permission
| 内容生产 | `/api/production/catalog`、`/api/production/graph`、`/api/production/script/*`、`/api/production/bible`、`/api/production/shots/*` | `script:edit`、`asset:edit`、`job:create` |
| 资产与声音 | `/api/assets/*`、`/api/assets/:assetId/versions/upload`、`/api/assets/:assetId/verify`、`/api/assets/:assetId/versions/:versionId/restore` | `asset:edit`、`voice:edit` |
| 生成任务 | `/api/jobs`、`/api/jobs/:jobId/*`、`/api/adapters/dry-run` | `job:create` 或 `queue:manage` |
| 流程模板编排 | `/api/workflows/templates`、`/api/workflows/templates/:id/instantiate`、`/api/workflows/runs` | 读取 / 实例化:`script:read`、`job:create` 或 `project:create`;管理:`workflow:manage` |
| 媒体证据与存储 | `/api/production/media-artifacts`、`/api/production/media-artifacts/:id/content`、`/api/usage/storage`、`/api/system/storage/*` | 媒体:`qa:review` 或 `delivery:view`;存储回收:系统设置权限 |
| 审片与交付 | `/api/production/reviews/*`、`/api/production/qa/run`、`/api/production/deliveries/*`、`/api/exports/write` | `qa:review`、`delivery:approve` |
| 组织运营 | `/api/usage`、`/api/billing`、`/api/organizations/:id/commercial`、`/api/organizations/:id/usage`、`/api/organizations/:id/usage/export`、`/api/organizations/:id/billing`、`/api/organizations/:id/quotas/:quotaId`、`/api/audit`、`/api/audit/export` | `usage:view`、`billing:manage`、`quota:manage`、`audit:view` |
| 模型中台 | `/api/platform/models`、`/api/platform/models/register`、`/api/platform/models/:id/probe` | `model:manage` |
@@ -47,6 +49,71 @@ GET /api/search?q=雷雨&scope=project&limit=40
搜索不会把连接器 endpoint、API key、客户交付令牌或本地存储绝对路径作为可搜索字段返回;跨组织、跨工作区或无项目访问权的关键词不会出现在结果中。
### 流程模板与生产编排
流程模板是服务端版本化对象,不是前端写死的按钮配置。平台先提供全局内置模板,组织或工作区可以用同一 `templateKey` 创建自己的版本;列表按当前工作区优先、组织其次、全局最后合并同键模板。全局内置模板只能读取,不能直接修改。
```http
GET /api/workflows/templates?includeArchived=1
POST /api/workflows/templates
PATCH /api/workflows/templates/:templateId
POST /api/workflows/templates/:templateId/instantiate
GET /api/workflows/runs?status=&limit=50
```
创建或更新模板的核心结构如下:
```json
{
"name": "AI 漫剧单镜头生产",
"templateKey": "ai-manhua-drama",
"category": "ai-drama",
"status": "active",
"description": "关键帧 -> 图生视频 -> 固定配音 -> ASR -> 合成",
"defaultAdapterId": "owned-model-platform",
"steps": [
{ "key": "keyframe", "label": "单画面关键帧", "jobKind": "单画面关键帧", "requiresShot": true },
{ "key": "video", "label": "首尾帧图生视频", "jobKind": "首尾帧图生视频", "requiresShot": true, "dependsOnPrevious": true }
],
"gates": [
{ "key": "single-frame", "label": "一图一画面", "blocking": true }
]
}
```
`steps` 最多 32 个,模板状态只能是 `draft`、`active` 或 `archived`;只有 `active` 模板可以进入生产。`POST /instantiate` 要求当前项目上下文,支持:
- `mode=plan`:只生成流程计划,不创建生成任务,适合导演确认步骤和质检门。
- `mode=queue`:按步骤创建 `generation_jobs`,默认把前一步任务写入下一步 `depends_on`,失败步骤会使流程运行标记为 `blocked`。
- `shotId`:镜头级步骤必须绑定当前项目镜头;`episodeId`、`adapter`、`priority` 和 `approveExternal` 可作为运行参数传入。
运行记录保存模板版本、步骤状态、任务 ID、当前步骤、错误信息和创建人。模板创建、修改和实例化都会写审计;外部 / 混合成本适配器仍需显式审批,默认适配器为用户自有模型平台。
### 媒体证据、首末帧与存储治理
生成任务和合成任务完成后,平台会登记文件级媒体证据,保存相对路径、MIME、文件大小、SHA-256、时长、分辨率、音视频轨道状态,以及视频实际首帧和末帧。首末帧是 QA / 连续性依据,不接受 contact sheet、故事板拼图或前端临时缩略图替代。
```http
GET /api/production/media-artifacts?shotId=&jobId=&limit=200
GET /api/production/media-artifacts/:artifactId/content
GET /api/production/media-artifacts/:artifactId/content?frame=first
GET /api/production/media-artifacts/:artifactId/content?frame=last
```
媒体列表只返回当前组织、工作区和项目可见的证据;原始文件和首末帧内容接口返回二进制,带真实 `Content-Type`、`Content-Length`、内联文件名和基于内容 SHA-256 的 `ETag`。不存在、路径不安全或文件尚未落盘分别返回 `404` / `422` / `404`,不会把数据库里登记过的路径直接当成成功生成。
存储用量和回收接口如下:
```http
GET /api/usage/storage
GET /api/system/storage/cleanup-preview?olderThanDays=30
POST /api/system/storage/reclaim
```
`/api/usage/storage` 返回当前作用域的已用空间、限额、剩余空间、占用率、项目拆分和最大文件。清理预览根据 `storage.retention_days`(默认 30 天)扫描 `outputs/`、`frames/`、`tmp/`、`cache/` 下超过保留期的临时文件,并明确列出候选文件和预计释放字节。`reclaim` 可接收 `{ "paths": ["storage/jobs/.../outputs/tmp.png"] }` 指定执行,也可以不传路径执行全部预览候选。
回收始终保护被 `media_artifacts`、`asset_versions` 或 `media_compositions` 引用的路径,并限制在 `storage/` 安全相对路径内;执行结果写入 `system.storage.reclaimed` 审计事件。`storage.provider` 当前默认是 `local-filesystem`,S3-compatible 等外部存储只作为后续适配层,不会在本地环境自动启用。
### 审计与合规中心
```http