Files
ai-drama-platform/docs/MULTI_TENANT_DESIGN.md
T

6.5 KiB
Raw Blame History

商业化多组织、多工作区设计

目标

ai-drama-platform 的商业形态不是“一个剧集的生产页面”,而是一个可以私有部署、承载多个内容公司的 AI 短剧/漫剧生产中台。所有生产数据都必须从组织和工作区上下文开始,任务、资产、审片和交付都不能脱离租户边界。

本地 MVP 使用 Node 24 内置 node:sqlite,已经接入邮箱 + 密码登录、scrypt 密码哈希和 Bearer session。仅在显式设置 AI_DRAMA_ALLOW_DEV_CONTEXT=1 的本地调试场景下,才允许请求头模拟上下文;默认运行模式是 session-only。后续替换为 SSO/OIDC 时,只需要替换身份解析层,不改变业务表和 scope 查询。

产品层级

用户 User
  └── 组织 Organization(公司 / 内容厂牌 / 客户租户)
        ├── 组织成员 Organization Member
        ├── 套餐、账单、配额、策略
        └── 工作区 Workspace(制作部 / 项目组 / 客户空间)
              ├── 工作区成员 Workspace Member
              ├── 项目 Project(系列 / 模板 / 客户项目)
              │     ├── 季 / 集 / 剧本 / 资产锁 / 分镜
              │     ├── 生成任务 / 尝试记录 / 审片 / 合规
              │     └── 交付版本 / 发布渠道
              └── 模型连接器、Runner、资产存储策略

组织解决客户和计费隔离,工作区解决团队协作隔离,项目解决内容访问和交付隔离。一个用户可以加入多个组织,在同一组织中进入多个工作区;普通工作区成员默认可以访问工作区项目,项目级邀请则使用 workspace_members.access_mode = project-only 和 project_guest 角色,只能进入显式授权的项目。

角色模型

作用域 角色 典型能力
组织 org_owner 组织设置、成员、账单、模型策略、全项目可见
组织 org_admin 成员、工作区、模型和审计管理
工作区 producer 建项目、排队、批次、成本、交付审批
工作区 writer 剧本、分集、对白、镜头草稿
工作区 art_director 角色/场景/道具锁、参考图、prompt、连续性
工作区 voice_editor 声线锁、TTS、字幕、ASR 对齐
工作区 reviewer QA、审片意见、通过/驳回
工作区 project_guest 只进入被授权项目,不继承工作区其他项目和生成权限
项目 project_editor 指定项目内容编辑
项目 project_viewer 只读查看、下载被授权的交付物

权限不是写死在前端。API 根据 organization_members、workspace_members、project_members 合并角色权限,并在每个项目、任务、模型、交付接口执行检查。前端显示权限矩阵只是帮助用户理解,不能作为安全边界。

数据表

身份和租户

  • users:用户身份、显示名、邮箱、状态。
  • organizations:租户、slug、部署模式、所有者。
  • organization_members:用户加入组织的角色、邀请状态。
  • workspaces:组织下的生产空间。
  • workspace_members:工作区角色和访问范围;access_mode=project-only 只允许显式 project_members 项目。
  • projects:工作区下的系列、模板或客户项目。
  • project_members:项目级额外授权。
  • invitations:待接受邀请,不把邀请误当作已加入成员。

生产和中台

  • series、seasons、episodes:剧集结构。
  • assets、asset_versions:角色、场景、道具、参考图、首尾帧、音频和视频资产版本。
  • shots:分镜、首帧/末帧、镜头状态和 continuity lock 引用。
  • generation_jobs、job_attempts:任务、重试、取消、执行器和输出。
  • reviews、review_comments:审片 lane、QA gate、意见和决策。
  • model_connectors:自有模型平台、HTTP JSON、OpenAI-compatible、ComfyUI optional adapter。
  • deliveries:剪辑清单、字幕、封面、master 和发布渠道。

商业治理

  • billing_accounts:套餐、席位、存储、片段额度和云连接策略。
  • quota_allocations、usage_events:配额和按任务的用量计量。
  • compliance_records:原创/IP、肖像权、声音权、参考素材来源、单画面检查。
  • audit_logs:谁在什么组织/工作区/项目中做了什么操作,以及结果和元数据。

请求上下文

本地调试 bypass 使用以下请求头,缺省时使用种子账号和种子工作区;真实浏览器请求必须携带登录后的 Bearer session:

x-user-id: u-owner
x-organization-id: org-studio-lab
x-workspace-id: ws-local-aidrama
x-project-id: thunder-mouth

真实部署必须由登录会话或网关注入用户身份,禁止让客户端直接提交任意组织 ID 后绕过 membership 检查。API 的最小检查顺序是:

  1. 用户存在且状态为 active。
  2. 用户是组织成员,且组织状态可用。
  3. 工作区属于当前组织,用户拥有工作区 membership。
  4. 项目属于当前工作区,用户拥有项目 membership 或工作区角色允许继承访问。
  5. 当前角色拥有该动作所需权限。
  6. 记录 audit log,涉及生成、下载、模型调用和导出时记录 usage event。

AI 短剧生产的业务硬门

这些约束属于组织策略或项目策略,不能只放在 prompt 文本里:

  • single_frame_only:每个图片生成任务只能输出一张连续完整画面,拒绝 split-screen、漫画多格、storyboard、collage、contact sheet。
  • continuity_lock_required:角色、服装、道具、场景、天气、镜头角度、声线必须有 lock 和 ledger。
  • actual_last_frame_chain:后续视频优先引用上一段真实末帧,不能只引用描述性文本。
  • voice_lock_required:对白使用固定声线;MiniMax H3 随机原生声音不作为最终角色声线。
  • mouth_safe_shot_policy:口型不稳定时优先侧脸、背影、低头、远景、反应镜头或环境插入镜头。
  • local_runner_only:默认只允许本地/自有模型;云端节点必须显式审批并留下审计记录。

MVP 与后续

当前可运行 MVP 先交付真实的租户、成员、权限、项目 scope、邀请、审计、用量和模型注册接口,生产资产表和任务表已经预留。下一阶段可以把认证、Redis/BullMQ 队列、对象存储、ffmpeg 合成和真实 Runner 接入,不需要重做组织模型。