1. 产品 API 思路
小啡不是把“一键成片”做成一条不可修改的黑盒流水线,而是把 剧本、资产、导演片段、图片、视频、任务状态 都变成可读、可改、可批量、可并发的业务对象。
优先使用 /v1/projects、Runtime、Run/Task、Auto Production、Final Film。这些路由支持用户 JWT 或 sk-* API Key。
/user/provider-adapter/* 当前主要供 XiaoFei Customer Console 调试真实 Provider,使用用户 JWT。它不是长期公共 SDK 的最终形态。
2. 5 分钟快速开始
Scopes 至少勾选
production:read 与 production:write。完整 sk-* 只在创建成功时展示一次。GET {BASE_URL}/v1/health,确认 release 与 API 可达。用
POST /v1/projects 得到 projectId。长文本推荐分块 Source API;上传剧本支持 txt/md/fountain/fdx,本地解析。
可人工确认文本与图片,也可以调用 Auto Production 进入自动批量生产。
最终通过 Media playbackPath 或后续 OSS Signed URL 获取成品。
/v1/health检查 API 与当前 Release
{{
"status": "ok",
"version": "0.11.0-alpha.4",
"release": "v0.11.0-alpha.4-RC15.8.6.2-ToAPIsEnvMigrationHotfix",
"timestamp": "2026-08-28T00:00:00.000Z"
}}/v1/projects创建一个短剧项目
curl -X POST "{{BASE_URL}}/v1/projects" \
-H "Authorization: Bearer sk-REPLACE_ME" \
-H "Content-Type: application/json" \
-d '{
"title":"金毛卧底",
"contentType":"short_drama",
"sourceType":"screenplay",
"settings":{{"episodeCount":80,"aspectRatio":"9:16"}}
}'{{
"id":"project_xxx",
"title":"金毛卧底",
"status":"draft",
"contentType":"short_drama"
}}3. 鉴权与 API Key
正式 v1 生产接口使用统一 Header:
Authorization: Bearer sk-xxxxxxxxxxxxxxxx当前 UserOrApiKeyAuthGuard 的规则是:Bearer 值以 sk- 开头时按 API Key 校验,否则按用户 JWT 校验。
只读客户端:
production:read。创建/启动生产:再加 production:write。还可设置 IP Allowlist、rateLimit、allowedProviders、allowedModels。/user/api-keys创建 API Key
该路由本身使用登录 JWT,不使用刚创建的 API Key。
{{
"name":"我的生产客户端",
"scopes":["production:read","production:write"],
"rateLimit":60,
"ipAllowlist":[],
"allowedProviders":[],
"allowedModels":[],
"quotaLimit":"0"
}}{{
"code":200,
"msg":"success",
"data":{{
"id":"key_xxx",
"key":"sk-完整密钥仅此一次",
"scopes":["production:read","production:write"]
}}
}}4. 响应格式、Trace 与错误
/v1/* 路由通常直接返回业务对象;传统 /user/* 路由经过全局 TransformInterceptor,通常包在 {code,msg,data,traceId} 中。
{{
"code":200,
"msg":"success",
"data":{{...}},
"traceId":"trace_xxx"
}}{{
"code":10000,
"msg":"参数错误",
"data":null,
"traceId":"trace_xxx"
}}常用错误码
| Code | 含义 | 处理 |
|---|---|---|
| 10000 | 参数错误 | 检查 DTO 字段与枚举 |
| 20000 | 认证失败 | 重新登录或检查 API Key |
| 20001 | Token 过期 | 刷新登录 |
| 30002 | Key 过期 | 新建 / 延长 Key |
| 30003 | 配额耗尽 | 调整配额 |
| 30004 / HTTP 429 | 限流 | 指数退避 |
| 30006 | 渠道不可用 | 切 Provider / 检查健康 |
504 表示某个同步 HTTP 等待层超时,不等于任务一定失败。图片、视频等长耗时任务应逐步统一为“提交任务 → 返回 taskId → 查询状态”,而不是把浏览器连接一直挂到 Provider 完成。
5. Project 项目
Project 是生产链的顶层业务容器。正式 API 支持 API Key 与 JWT。
/v1/projects创建项目
{{
"title":"80集营销短剧",
"contentType":"short_drama",
"sourceType":"idea",
"settings":{{}}
}}/v1/projects/:id更新项目
{{
"title":"新标题",
"settings":{{
"productionProfile":{{"episodeCount":80,"aspectRatio":"9:16"}}
}}
}}/v1/projects/:id/copy复制项目
/v1/projects/:id归档项目
6. Source / Runtime / Gate
Runtime 保存最新 Source、Proposal、Canonical Script 与确定性生产结构。大文本推荐使用分块传输,当前 Customer Console 也采用 4096 字符分块。
所有
POST /v1/projects/:projectId/runtime/source... 当前服务器门禁要求 X-XiaoFei-Client-Release: a4-rc15-8-6-2-toapis-env-migration-hotfix。这属于 RC 客户端兼容保护,正式公共 API 应升级成更稳定的 API-Version 机制。/v1/projects/:projectId/runtime/source/chunked/init初始化长文本上传
curl -X POST "{{BASE_URL}}/v1/projects/PROJECT_ID/runtime/source/chunked/init" \
-H "Authorization: Bearer sk-..." \
-H "X-XiaoFei-Client-Release: a4-rc15-8-6-2-toapis-env-migration-hotfix" \
-H "Content-Type: application/json" \
-d '{{"sourceType":"screenplay","totalChars":18420,"totalChunks":5,"filename":"script.txt"}}'{{"uploadId":"upload_xxx", "accepted":true}}/v1/projects/:projectId/runtime/source/chunked/:uploadId/chunk写入一个幂等文本分块
{{"index":0,"chunk":"第1集……"}}/v1/projects/:projectId/runtime/source/chunked/:uploadId/commit组装并编译 Source
上传 screenplay 的 Runtime 导入路径应保持确定性;RC15.8.6 已明确上传剧本的制作方案 Gate 不应依赖 LLM。
{{}}{{
"stage":"proposal_ready",
"llmCalls":0,
"receipt":{{
"sourceId":"src_xxx",
"scriptId":"script_xxx",
"proposalId":"proposal_xxx"
}}
}}/v1/projects/:projectId/runtime读取最新 Runtime
/v1/projects/:projectId/runtime/proposal/confirm确认 Proposal / Gate 1
7. Production Settings
Production Profile 是客户默认生产参数;项目可通过 project.settings.productionProfile 覆盖;Runtime 可再接受单次运行覆盖。优先级建议保持:平台默认 < 客户默认 < 项目覆盖 < 本次运行。
/user/production-profile保存默认生产设置
{{
"contentType":"short_drama",
"language":"zh-CN",
"aspectRatio":"9:16",
"episodeCount":80,
"episodeDuration":60,
"storyboardCharacterReferenceEnabled":true,
"wardrobePolicy":"script_first",
"assetMaterializationThreshold":2,
"defaultTextProviderProfileId":"pp_text",
"defaultImageProviderProfileId":"pp_image",
"defaultVideoProviderProfileId":"pp_video",
"extra":{{"visualReferenceMode":"direct_reference","visualStyle":"真人电影感"}}
}}普通客户端只展示必要参数;高级客户、自研客户端和 API 用户可在 Production Settings 中获得更多自由度,但不能越过 Canonical、Tenant、Provider Capability 和安全边界。
8. 一键自动生产
Auto Production 使用 Bull 队列创建 Run + Task,不应要求 HTTP 一直等待整个 80 集完成。
/v1/projects/:projectId/auto-production启动自动生产
Direct Reference 可传 storyboardEnabled=false;若已有 queued/running 的同类任务,服务端会复用活动任务。
{{"storyboardEnabled":false}}{{
"taskId":"task_xxx",
"runId":"run_xxx",
"status":"queued",
"progress":0
}}/v1/projects/:projectId/auto-production查看自动生产状态
{{
"latest":{{"taskId":"task_xxx","status":"running","progress":42}},
"history":[...]
}}9. Run / Task
建议所有媒体长任务最终收敛到统一状态:queued → running → succeeded / failed,并带 progress、errorCode、errorMessage、stage 与日志指针。
/v1/tasks/:id读取任务详情
/v1/runs/:id读取 Run 详情
async function waitTask(taskId) {{
while (true) {{
const r = await fetch(`${{BASE_URL}}/v1/tasks/${{taskId}}`, {{
headers: {{ Authorization: `Bearer ${{API_KEY}}` }}
}}).then(r => r.json());
if (r.status === 'succeeded') return r;
if (r.status === 'failed') throw new Error(r.errorMessage || r.errorCode);
await new Promise(x => setTimeout(x, 2000));
}}
}}10. 最终成片与剪辑
当前 Final Film 会选择每个 Segment 最新成功视频,并进入 media-postprocess 队列。未来字幕、转场、片头尾、BGM、色调统一都应继续接在这一层,而不是塞回视频 Provider。
/v1/projects/:projectId/final-film创建最终成片
{{"title":"金毛卧底 · 完整版"}}{{"taskId":"task_final","status":"queued","progress":0}}/v1/projects/:projectId/final-film查询成片
{{
"latest":{{"status":"succeeded","progress":100}},
"artifacts":[{{
"id":"media_final",
"mediaType":"final_film",
"playbackPath":"/v1/media/media_final/play?token=..."
}}]
}}11. 剧本库 / 资产库 / 白膜库 / Skills
这些不是附属配置,而是小啡总后台的长期核心资产。客户端目前有只读/检索接口,写入与审核主要由 Admin 控制面完成。
剧本库。用于 Writer Context 与可复用优秀结构。
角色、场景、道具等已批准资产。
白膜 / 标准化视觉结构。
按生产阶段获取可用 Skills。
建议与上述 Foundation 同级新增 Trend/Hit Library,而不是直接把“爆款规则”写死到 Prompt。它应该能版本化、评分、淘汰、回滚和按内容类型检索。
12. 图片与故事板(客户端调试 API)
/user/provider-adapter/* 使用用户 JWT,不是公共 API Key。它适合 Customer Console 与调试工具。正式外部媒体 API 后续建议迁到版本化 /v1 Task API。/user/provider-adapter/asset-image-plan获取资产出图计划
{{"projectId":"project_xxx"}}/user/provider-adapter/asset-image-generate生成一张资产图
{{
"projectId":"project_xxx",
"providerProfileId":"image_profile",
"assetKey":"ap-character-xxx",
"promptOverride":"可选:人工调整后的提示词"
}}/user/provider-adapter/storyboard-plan故事板计划
{{"projectId":"project_xxx"}}/user/provider-adapter/storyboard-generate生成故事板
{{
"projectId":"project_xxx",
"providerProfileId":"i2i_profile",
"segmentNo":1,
"useReferences":true
}}13. 视频生成
RC15.8.6 的关键边界是:浏览器不再决定单张参考图,Server Runtime 才是 reference bundle 权威。 Storyboard Route 包含故事板 + 匹配资产;Direct Reference 只包含匹配资产;最多 9 张。
/user/provider-adapter/video-segments读取当前视频片段与引用 Bundle
{{"projectId":"project_xxx"}}/user/provider-adapter/video-generate提交一个 Segment 视频
referenceMediaId 仍保留兼容字段,但 RC15.8.6 的正式语义是服务端重新解析 reference bundle。
{{
"projectId":"project_xxx",
"providerProfileId":"video_profile",
"segmentNo":1,
"videoMode":"direct_reference"
}}/user/provider-adapter/video-status查询 MiniMax 视频任务
{{"taskId":"provider_task_xxx"}}14. Media Playback 与阿里云 OSS
当前 RC 的 /v1/media/:id/play?token=… 支持 HTTP Range 播放。正式媒体建议走对象存储;对外保持媒体授权契约,存储实现可抽象为 MediaStorage Adapter。
/v1/media/:id/play?token=…播放图片 / 视频
当前支持 Range,适合 MP4 拖动播放。也可返回短期 Signed URL,或由 API 代理 Range;业务层不应感知具体存储 SDK。
bucket、objectKey、mimeType、byteSize、mediaType、status、provider、metadata。不要只存永不过期的完整 URL。
Provider 结果只有在 OSS 写入成功后,Media 才进入 ready。失败任务可保留日志和 Provider Job ID,不伪装成成功。
15. 中转站 / Provider / BYOK
Credential 与 Profile 必须分开:Credential 管密钥/Base URL;Profile 管用途、模型、Endpoint、超时和 Provider options。
/user/provider-credentials新增客户自己的中转站/BYOK
{{
"name":"我的 ToAPIs",
"providerType":"openai_compatible",
"baseUrl":"https://example-provider.invalid",
"apiKey":"SECRET",
"enabled":true
}}/user/provider-profiles建立用途 Profile
{{
"credentialId":"credential_xxx",
"purpose":"video",
"model":"MiniMax-H3",
"endpointPath":"/v1/video_generation",
"timeoutMs":180000,
"maxPromptChars":7000,
"enabled":true
}}对外文档、日志、Task payload、错误信息都不应回显 API Key。Credential API 只让用户本人管理;总后台默认展示掩码和健康状态。
16. 80 集并发与 Provider Router
未来“80 集,每 10 集走一个视频通道”不应该由前端 for-loop 硬编码,而应由 Server Scheduler 根据 Provider Capability、并发槽、健康度、价格和客户策略分配。
客户选择“自动”,Router 从平台合作的优秀中转站池里调度。
客户可固定自己的 Provider Profiles,或允许“自带优先 + 平台兜底”。
建议未来公共 API 暴露 routingPolicy / providerPoolId / maxConcurrency 等高阶设置,但不直接暴露内部秘密 Credential。
17. 调试、日志与 504 定位
客户调试版每一步都应有日志。当前 Product Parity 提供 GET /user/product/debug-logs(JWT),媒体生成也记录 Provider/Task 信息。
| 阶段 | 建议字段 | 用途 |
|---|---|---|
| 图片 | localPreparationMs / referenceUploadMs / providerRoundTripMs / mediaPersistMs / totalMs | 定位 Provider、上传、存储谁慢 |
| 视频 | providerJobId / referenceMediaIds / route / submitAt / pollAt | 防止重复提交与重复扣费 |
| Task | stage / status / progress / errorCode / errorMessage / traceId | 让 UI 和 API 客户端都能恢复状态 |
若 Provider Job 已创建但 HTTP 504,前端不要自动再次 submit;优先用 taskId/providerJobId 查询。未来统一异步化后,生成接口应快速返回
202 + taskId。18. 完整调用范例
cURL:创建项目 → 导入短剧 → 确认 → 自动生产
API="{{BASE_URL}}"
KEY="sk-REPLACE_ME"
REL="a4-rc15-8-6-2-toapis-env-migration-hotfix"
# 1. 创建项目
PROJECT_ID=$(curl -s -X POST "$API/v1/projects" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"title":"Demo","contentType":"short_drama","sourceType":"screenplay"}' | jq -r '.id')
# 2. 小文本可直接 Source;长文本建议使用 chunked API
curl -X POST "$API/v1/projects/$PROJECT_ID/runtime/source" \
-H "Authorization: Bearer $KEY" \
-H "X-XiaoFei-Client-Release: $REL" \
-H "Content-Type: application/json" \
-d '{"sourceType":"screenplay","text":"# 第1集\n……"}'
# 3. 确认 Gate 1
curl -X POST "$API/v1/projects/$PROJECT_ID/runtime/proposal/confirm" \
-H "Authorization: Bearer $KEY"
# 4. 启动自动生产
curl -X POST "$API/v1/projects/$PROJECT_ID/auto-production" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"storyboardEnabled":false}'
# 5. 查看状态
curl "$API/v1/projects/$PROJECT_ID/auto-production" \
-H "Authorization: Bearer $KEY"JavaScript:安全轮询
const headers = {{ Authorization: `Bearer ${{API_KEY}}` }};
async function getAutoProduction(projectId) {{
const r = await fetch(`${{BASE_URL}}/v1/projects/${{projectId}}/auto-production`, {{ headers }});
if (!r.ok) throw new Error(`HTTP ${{r.status}}`);
return r.json();
}}
async function waitAuto(projectId) {{
for (;;) {{
const state = await getAutoProduction(projectId);
const t = state.latest;
renderProgress(t?.progress ?? 0, t?.status ?? 'queued');
if (t?.status === 'succeeded') return t;
if (t?.status === 'failed') throw new Error(t.errorMessage || t.errorCode || 'failed');
await new Promise(r => setTimeout(r, 2000));
}}
}}19. RC15.8.6.2 当前客户侧路由索引
下面按当前源码 Controller + Customer Console 调用整理。Admin 总后台写接口没有全部列入本页,避免客户误用。
| Method | Path | 鉴权 | 用途 |
|---|---|---|---|
| GET | /v1/health | 公开 | 健康检查 |
| POST | /auth/send-code | 公开 | 发送邮箱验证码 |
| POST | /auth/login | 公开 | 邮箱验证码登录 |
| GET | /auth/profile | JWT | 当前用户 |
| GET | /user/api-keys | JWT | API Key 列表 |
| POST | /user/api-keys | JWT | 创建 API Key |
| PUT | /user/api-keys/:id | JWT | 编辑 Key |
| PUT | /user/api-keys/:id/status | JWT | 启停 Key |
| DELETE | /user/api-keys/:id | JWT | 吊销 Key |
| GET | /user/production-profile | JWT | 读取生产设置 |
| PUT | /user/production-profile | JWT | 保存生产设置 |
| GET | /user/provider-credentials | JWT | Credential 列表 |
| POST | /user/provider-credentials | JWT | 新增 BYOK |
| PUT | /user/provider-credentials/:id | JWT | 更新 BYOK |
| DELETE | /user/provider-credentials/:id | JWT | 删除 BYOK |
| GET | /user/provider-profiles | JWT | Provider Profile 列表 |
| POST | /user/provider-profiles | JWT | 新增 Profile |
| PUT | /user/provider-profiles/:id | JWT | 更新 Profile |
| DELETE | /user/provider-profiles/:id | JWT | 删除 Profile |
| GET | /user/foundation/assets | JWT | 可用资产库 |
| GET | /user/foundation/scripts | JWT | 剧本库 |
| GET | /user/foundation/white-models | JWT | 白膜库 |
| GET | /user/foundation/character-templates | JWT | 人物模板 |
| GET | /user/skills | JWT | Skills |
| GET | /v1/projects | API Key / JWT | 项目列表 |
| POST | /v1/projects | API Key / JWT | 创建项目 |
| GET | /v1/projects/:id | API Key / JWT | 项目详情 |
| PUT | /v1/projects/:id | API Key / JWT | 更新项目 |
| POST | /v1/projects/:id/copy | API Key / JWT | 复制项目 |
| DELETE | /v1/projects/:id | API Key / JWT | 归档项目 |
| GET | /v1/projects/:projectId/runtime | API Key / JWT | 读取 Runtime |
| POST | /v1/projects/:projectId/runtime/source | API Key / JWT | 直接导入 Source |
| POST | /v1/projects/:projectId/runtime/source/chunked/init | API Key / JWT | 分块初始化 |
| POST | /v1/projects/:projectId/runtime/source/chunked/:uploadId/chunk | API Key / JWT | 上传分块 |
| POST | /v1/projects/:projectId/runtime/source/chunked/:uploadId/commit | API Key / JWT | 提交分块 |
| POST | /v1/projects/:projectId/runtime/source/upload | API Key / JWT | multipart 文件导入 |
| POST | /v1/projects/:projectId/runtime/proposal/confirm | API Key / JWT | 确认 Gate 1 |
| GET | /v1/runs | API Key / JWT | Run 列表 |
| POST | /v1/runs | API Key / JWT | 创建 Run |
| GET | /v1/runs/:id | API Key / JWT | Run 详情 |
| GET | /v1/tasks | API Key / JWT | Task 列表 |
| POST | /v1/tasks | API Key / JWT | 创建 Task |
| GET | /v1/tasks/:id | API Key / JWT | Task 详情 |
| POST | /v1/projects/:projectId/auto-production | API Key / JWT | 一键自动生产 |
| GET | /v1/projects/:projectId/auto-production | API Key / JWT | 自动生产状态 |
| POST | /v1/projects/:projectId/final-film | API Key / JWT | 创建最终成片 |
| GET | /v1/projects/:projectId/final-film | API Key / JWT | 最终成片状态 |
| POST | /user/provider-adapter/video-production-plan | JWT | 视频制作方案预览 |
| POST | /user/provider-adapter/asset-image-plan | JWT | 资产出图计划 |
| POST | /user/provider-adapter/asset-image-generate | JWT | 生成资产图 |
| POST | /user/provider-adapter/storyboard-plan | JWT | 故事板计划 |
| POST | /user/provider-adapter/storyboard-generate | JWT | 生成故事板 |
| POST | /user/provider-adapter/video-segments | JWT | 解析视频片段 |
| POST | /user/provider-adapter/video-generate | JWT | 提交视频 |
| POST | /user/provider-adapter/video-status | JWT | 查询视频状态 |
| GET | /v1/media/:id/play?token=… | Token URL | 媒体播放 |
20. UI → API 对照
| 客户端页面/操作 | 主要 API | 权威对象 |
|---|---|---|
| 新建短剧项目 | POST /v1/projects | Project |
| 上传/粘贴剧本 | runtime/source/chunked/* 或 source/upload | Source / Proposal / Canonical |
| 确认文本 | runtime/proposal/confirm | Gate 1 |
| 资产列表 | asset-image-plan + Foundation | Canonical + Semantic Asset Discovery |
| 生成角色/场景/道具图 | asset-image-generate | Media |
| 故事板 | storyboard-plan / generate | Segment + Media |
| 批量视频 | video-segments / generate / status | Runtime Reference Bundle + Task |
| 一键自动成片 | auto-production | Run + Task |
| 剪辑/最终成片 | final-film | Media(final_film) |
| 中转站设置 | provider-credentials / provider-profiles | Credential + Profile |
| 高级生产设置 | user/production-profile | Production Profile |
21. 版本、兼容与下一阶段
v0.11.0-alpha.4-RC15.8.6.2-ToAPIsEnvMigrationHotfix
文档内容从本版本代码提取,不把未来设想伪装成已上线接口。
公共 API 固定 /v1 契约;把 /user/provider-adapter 的成熟能力迁入版本化 Task API;引入 API Version Header / OpenAPI 导出。
MediaStorage 抽象;Signed URL 与 Range;Worker 直接落对象存储。
Capability / Health / Router / Scheduler / Adapter 分层,支持平台中转站集合与客户 BYOK 并存。
每次公开 API 的字段、枚举、状态机或鉴权发生变化,都要同步:OpenAPI → 本 HTML → cURL/JS Demo → UI 操作示意。不要只改代码。