Studio API 参考
契约归属:不受车库双契约管辖
请先读这一节,再读下面的端点清单。platform/studio/api 是一个独立的 Python FastAPI 服务,不受 docs/openapi/openapi.yaml 和 docs/openapi/baas-app-v1.yaml 这两份车库主契约管辖,也不受 internal/contracttest 校验——那两份契约管的是 platform/server(Go)的 /api/v1/admin/*、/api/v1/app/* 等路径。本页描述的所有 Studio 自身接口直接依据源码 platform/studio/api/src/apps/studio/api.py、src/apps/playground/api.py,源码是唯一真相。
唯一的例外:POST /api/v1/admin/studio-imports*(Go 后端把 Studio 成片导入车库 catalog 的那一步)仍然归主契约 openapi.yaml 管辖,字段与路径以该文件为准,本页不重复定义,只在下文"与车库主平台的集成"一节说明它的作用。
"不受管辖"不等于"没有 schema":platform/studio/api 是 FastAPI,路由签名 + Pydantic 模型本身就能推导出完整 OpenAPI schema,天然不会跟实现脱节。api/scripts/export_openapi.py 把这份 schema 冻结成 api/openapi.json(api/tests/test_openapi_export.py 保证它没有过期),web 侧用 pnpm generate:api-types 据此生成 web/src/generated/api-types.ts 供前端标注请求/响应类型。这条路径是"运行时反推契约、机器保证不漂移",跟车库 Go 侧"手写 YAML 契约、先立约再实现"的方向相反——详见 已知问题 里对这个选择的分析,以及 platform/studio/README.md「接口契约」一节的具体命令。
鉴权
请求需带 Authorization: Bearer <token>,token 二选一:
- Admin JWT:车库 admin 登录后签发的会话 token。Studio 本地验签(
ADMIN_SESSION_SECRET优先于ADMIN_JWT_SECRET,与 Go 侧优先级一致)通过后,还会向 Go 服务发起GET {MOTORPOOL_API_URL}/api/v1/auth/me做一次 introspection 确认账号仍然有效,结果缓存STUDIO_INTROSPECT_TTL_SECONDS秒(默认 30)。Go 服务不可达时按未授权处理(fail closed)。 STUDIO_SERVICE_TOKEN:标识"车库服务本身"发起的编排调用(如成片导入),跳过 introspection。
GET/HEAD /files/*(媒体文件)有一个例外:因为 <img>/<video> 标签发不出自定义请求头,这类请求改读 authorized-token cookie 里的 accessToken,仍然走同一条 JWT 校验路径,不是弱化校验。
STUDIO_AUTH_DISABLED=true 仅限本地调试;鉴权开启但一个凭证都没配时,进程启动直接失败。详见 Studio 架构总览 的双向鉴权一节。
端点分组一览
按功能分组,studio 主 app 145+ 路由 + playground 子 app 11 路由。具体路径/请求体字段以源码为准,这里只给分组和依赖的 AI provider。
任务与轮询模型
视频/图像生成是异步任务:提交后拿到 task_id,客户端轮询 GET /tasks/{id} 获取状态。进程重启后的孤儿任务不会自动重跑——因为可能已经跟 provider 扣过费,需要人工判断后处理。
与车库主平台的集成
Go 后端用 STUDIO_SERVICE_TOKEN 拉 Studio:
- 单集:
GET /projects/{id}→POST /api/v1/admin/studio-imports - 整剧:
GET /series/{id}与GET /series/{id}/episodes→POST /api/v1/admin/studio-imports/series
这是 Studio 与车库内容中台的耦合点,方向永远是「Go 主动拉」,Studio 不会主动推送。详见 架构。
已知限制
- 单实例假设:数据落在
STUDIO_DATA_DIR下的扁平 JSON 文件,进程启动时 chdir 到该目录,不支持多进程共享同一份数据。 - 魔改未做:从已上架剧派生新 Series、写
remix_of的后台入口尚未交付。
更完整的问题清单见 已知问题。