上传文件至「/」

This commit is contained in:
qyyfw committed 2026-07-27 09:56:20 +08:00
1 parent 7da886a42b
commit f418192eae
1 file changed
+607
+607
View File
@@ -0,0 +1,607 @@
# 七虎 AI PaaS 平台 · 应用服务接入规范(可行性方案)
> **文档版本**:v1.0.0
> **生成日期**:2026-07-27
> **定位**:七虎 AI PaaS 平台"应用服务"模块的接入标准、集成模式与落地路线图
> **前置依赖**:本文件承接《AI_PaaS_Platform_Analysis_and_Execution_Plan.md》第五部分(七虎AI全面评估)的结论,将其"应用服务接入"从单点案例(MuMuAINovel)升级为平台级规范
> **目标读者**:平台架构组、应用接入开发者、技能市场运营、安全审计
---
## 0. 背景与定位
### 0.1 为什么要做"应用服务接入规范"
七虎 AI PaaS 的定位是"AI 体验、办公提效、创收、自我提升的一站式交互平台"。平台的能力供给有三种形态:
| 形态 | 单位 | 执行环境 | 典型例子 |
|---|---|---|---|
| **技能(Skill)** | 提示词 + 脚本 + SKILL.md | 平台 Agent 沙箱内执行 | dashi-ppt-skill、SEO 优化、投研报告 |
| **应用服务(App Service)** | 独立可运行的应用 | 独立容器/子域名,单点登录接入 | MuMuAINovel、OpenCut、next-ai-draw-io |
| **IM Bot** | 消息驱动的长连接 Agent | 平台 IM 网关内执行 | 微信 Bot、企微 Bot、飞书 Bot |
"应用服务"是平台差异化最大的形态——它让第三方成熟的开源 AI 应用(小说创作、视频剪辑、绘图、求职……)**一键接入平台**,用户无需离开七虎 PaaS 即可使用,所有模型调用、Token 计量、订阅计费、会员权益都由平台统一管控。
### 0.2 本文件要解决的核心问题
1. **什么样的开源项目适合接入?** → 选型评估矩阵
2. **接入分哪几档?每档改什么?** → 三级集成深度模型
3. **标准接入流程是什么?** → 从选型到上线的 SOP
4. **统一走平台的模型、计费、订阅,技术上怎么落地?** → 架构模式 + 代码骨架
5. **许可证风险怎么规避?** → GPL/MIT/Apache 兼容策略
6. **第一批接入哪些应用做样板?** → 基于 Starred 列表的推荐清单
---
## 1. 候选应用选型评估矩阵
### 1.1 从 Starred 列表筛选的 6 个候选
结合你 GitHub starred 列表(259 个项目),按"是否独立可运行、是否有自托管能力、是否依赖 AI 模型、是否与平台定位契合"四要素,筛选出以下 6 个最适合做"应用服务"接入的候选:
| # | 项目 | Stars | 协议 | 技术栈 | 应用类型 | 接入价值 |
|---|---|---|---|---|---|---|
| 1 | **MuMuAINovel** | 新建 | GPL-3.0 | FastAPI + PG + React/AntD | AI 小说创作 | 长文本创作,高 Token 消耗,验证订阅闭环 |
| 2 | **OpenCut** | 78.5K | MIT | Next.js + Rust/WASM + PG + Redis | 视频剪辑 | 自媒体/短视频场景,MCP Server 规划中 |
| 3 | **next-ai-draw-io** | 33.8K | Apache-2.0 | Next.js + React | AI 流程图/架构图 | 办公提效,开发者高频刚需 |
| 4 | **HyperFrames** | 37.5K | Apache-2.0 | Node.js + headless Chrome + FFmpeg | HTML→MP4 视频渲染 | 课件/营销视频自动化生产 |
| 5 | **dashi-ppt-skill** | 4.1K | MIT | Node.js + React 渲染引擎 | PPT 生成/编辑 | 办公提效标杆,已做本地优先 |
| 6 | **ai-job-search** | 26.4K | MIT | TypeScript + Python + LaTeX | AI 求职流水线 | 个人提升场景,Drafter-Reviewer 范式 |
### 1.2 六维量化评估
对每个候选按 6 个维度打分(1-5),加权算出"接入适配总分":
| 维度 | 权重 | 评估要点 |
|---|---|---|
| **自托管能力** | 15% | Docker 一键部署?有无官方镜像? |
| **认证可替换性** | 20% | 是否已有 OAuth/OIDC 适配器?是否易加 Casdoor? |
| **AI 调用可代理** | 20% | 是否走 OpenAI 兼容协议?能否改 BASE_URL? |
| **许可证友好度** | 15% | MIT/Apache 最友好,GPL 需外围集成规避 |
| **与平台定位契合** | 15% | 是否覆盖技能市场/办公/创作/提效场景 |
| **社区活跃度** | 5% | Stars、近期更新频率 |
| **数据隔离可行性** | 10% | 是否用 PG/可加 tenant_id/RLS |
### 1.3 评估结果
| 项目 | 自托管 | 认证 | AI代理 | 协议 | 契合 | 社区 | 隔离 | **加权总分** | 推荐档位 |
|---|---|---|---|---|---|---|---|---|---|
| **MuMuAINovel** | 5 | 4(已有LinuxDO OAuth) | 5(OpenAI兼容) | 2(GPL) | 5 | 3 | 5 | **4.25** | 🥇 首批·深度接入 |
| **OpenCut** | 5 | 3(需新增) | 4(AI功能可代理) | 5(MIT) | 4 | 5 | 4 | **4.20** | 🥇 首批·标准接入 |
| **next-ai-draw-io** | 5 | 3 | 5(多Provider) | 5(Apache) | 5 | 4 | 4 | **4.40** | 🥇 首批·标准接入 |
| **HyperFrames** | 4 | 2(CLI为主) | 5(走LLM生成HTML) | 5(Apache) | 4 | 4 | 3 | **3.95** | 🥈 第二批·轻量接入 |
| **dashi-ppt-skill** | 4(本地Node) | 1(无登录) | 5 | 5(MIT) | 5 | 4 | 2 | **3.70** | 转"技能"更合适 |
| **ai-job-search** | 3(CLI为主) | 1(无登录) | 5 | 5(MIT) | 4 | 5 | 2 | **3.55** | 转"技能"更合适 |
### 1.4 关键结论
> **首批接入 3 个应用做样板**(按 ROI 排序):
> 1. 🥇 **MuMuAINovel** —— 验证"平台统一模型+计费+订阅"的核心闭环(GPL 走外围集成规避)
> 2. 🥇 **next-ai-draw-io** —— 协议最友好(Apache-2.0)、认证易加、办公提效高频刚需
> 3. 🥇 **OpenCut** —— Stars 最高、MIT 最自由、视频场景与平台"自媒体/短视频创作"定位契合
>
> **第二批**(2-3 个月后):HyperFrames(视频渲染 API 化后)、以及新出现的应用级项目。
>
> **dashi-ppt-skill 和 ai-job-search 不应作为"应用服务"接入**——它们更适合作为"技能"上架到技能市场(本文件承接前份报告的第三部分改造方案)。这个判断很重要:**应用服务 vs 技能的边界**,下文第 2 节专门界定。
---
## 2. 核心概念:应用服务 vs 技能 vs IM Bot
接入前必须明确三者的边界,避免把"该做成技能的项目"错误升级为"独立应用",浪费容器资源。
### 2.1 决策树
```
一个新能力要上平台,先回答三个问题:
① 它有独立的前端 UI 吗?(用户要在独立界面里操作,不只是对话)
② 它需要长时间运行/持有状态吗?(如剪辑时间线、小说章节树、绘图画布)
③ 它单用户运行资源占用高吗?(视频渲染、GPU 合成、大型依赖)
①=否 → 做成【技能】 → 例:SEO 优化、投研报告、信息图生成
①=是 且 ②③ 中至少一个=是 → 做成【应用服务】 → 例:MuMuAINovel、OpenCut
①=是 且 ②③ 都=否 → 看交互模式:
以"消息对话"为主 → 做成【IM Bot】 → 例:微信客服 Bot
以"画布/编辑器"为主 → 做成【应用服务】 → 例:next-ai-draw-io
```
### 2.2 三类形态对比
| 维度 | 技能(Skill) | 应用服务(App Service) | IM Bot |
|---|---|---|---|
| 执行环境 | 平台 Agent 沙箱 | 独立容器/子域名 | 平台 IM 网关 |
| 前端 | 无(对话即界面) | 有(独立 Web UI) | 消息气泡 |
| 模型调用 | 平台 Agent 引擎统一 | 走平台 AI 网关代理 Key | 平台 Agent 引擎 |
| 计费单元 | 按次/按 Token | 按应用订阅/按 Token | 按会话/按 Token |
| 数据归属 | 平台知识库 | 应用内 DB + 平台审计 | 平台消息存档 |
| 上架审核 | SKILL.md + CI | 完整应用安全审计 | Bot 权限清单 |
| 典型生命周期 | 轻量,可热更新 | 重,需版本化部署 | 常驻,需心跳 |
---
## 3. 三级集成深度模型
所有应用接入分三档,按平台成熟度渐进式推进:
### 3.1 L1 · 浅集成(快速上线,3-5 天)
**目标**:单点登录打通,用户在平台内一键进入应用,但模型调用和计费暂由应用自理。
**改造项**:
| 改造点 | 应用侧 | 平台侧 |
|---|---|---|
| 认证 | 新增 Casdoor OIDC 适配器 | 在 Casdoor 注册应用、颁发 Client ID/Secret |
| 会话 | 用 OIDC 回调建立本地会话 | 提供 `/.well-known/openid-configuration` |
| 登录页 | 隐藏/禁用本地注册(可选) | 平台前台"应用服务"卡片 → 跳转授权 |
**适用场景**:早期 MVP、应用尚未完成模型代理改造、快速扩充平台"应用数量"。
### 3.2 L2 · 中集成(核心目标,2-3 周)⭐ 推荐默认档
**目标**:模型调用统一走七虎 AI 网关,平台统一计量、计费、订阅校验。
**改造项**(在 L1 基础上增加):
| 改造点 | 应用侧 | 平台侧 |
|---|---|---|
| AI 调用 | `OPENAI_BASE_URL` 指向平台网关 | AI 网关新增代理 Key 校验中间件 |
| 密钥 | 用平台颁发的 `PLATFORM_PROXY_KEY` 替代用户自配 Key | `market_apps.proxy_key` 颁发与管理 |
| 计量 | 每次调用透传 `X-Platform-User-Id` | 网关写入 `token_usage_logs(app_id)` |
| 订阅 | 启动时检查平台订阅态(可选增强) | 订阅校验端点 `/api/v1/subscription/check` |
| 配额 | 超限时优雅降级(提示充值) | 实时余额查询 API |
**这是推荐的默认接入档位**——L1 只是过渡,L2 才是"平台价值"真正体现的地方。
### 3.3 L3 · 深集成(生产级,4-6 周)
**目标**:多租户数据隔离、应用内增值购买、审计合规、平台级可观测。
**改造项**(在 L2 基础上增加):
| 改造点 | 应用侧 | 平台侧 |
|---|---|---|
| 数据隔离 | 所有表加 `tenant_id`,启用 PG RLS | 提供 RLS 策略模板 |
| 增值服务 | 高级功能走平台支付 API | 支付渠道 + 分润结算 |
| 审计 | 关键操作上报平台 `audit_logs` | 审计日志聚合查询 |
| 可观测 | 暴露 Prometheus 指标 | 平台 Grafana 统一看板 |
| 数据导出 | GDPR 导出/删除接口 | 用户注销级联清理 |
### 3.4 档位选择决策表
| 应用特征 | 推荐档位 | 理由 |
|---|---|---|
| 新建/重构中、协议友好、核心标杆 | **L2 起步** | 一步到位,避免二次改造 |
| 成熟稳定、改动风险高(如 GPL 项目) | **L1 → L2 渐进** | 先外围集成,验证后再深化 |
| 内部工具/实验性 | **L1 即可** | 快速验证,不过度投入 |
| 金融/医疗/政企客户可达 | **必须 L3** | 合规刚需 |
---
## 4. 标准接入架构
### 4.1 整体拓扑
```
┌──────────────────────────────┐
│ 用户浏览器 │
└────────┬─────────────────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌────────────────┐ ┌────────────────┐ ┌────────────────────┐
│ 平台前台 │ │ 应用服务 A │ │ 应用服务 B │
│ (已登录态) │ │ (独立子域名) │ │ (独立子域名) │
│ │ │ │ │ │
│ /apps/novel ───┼─►│ novel.qihuyun │ │ drawio.qihuyun │
│ /apps/drawio ──┼─►│ OIDC 登录 │ │ OIDC 登录 │
│ /apps/video ───┼─►│ │ │ │
└────────────────┘ └───────┬────────┘ └─────────┬──────────┘
│ │
▼ ▼
┌────────────────────────────────────────────────┐
│ 七虎 AI 网关 (FastAPI) │
│ ┌──────────────────────────────────────────┐ │
│ │ 1. 代理 Key 校验 → 解析 user_id+app_id │ │
│ │ 2. 订阅/配额校验 → 拒绝或放行 │ │
│ │ 3. 模型路由 (LiteLLM) → 上游模型 │ │
│ │ 4. 计量写入 token_usage_logs │ │
│ │ 5. 流式响应返回 │ │
│ └──────────────────────────────────────────┘ │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ Casdoor (OIDC IdP) │ PostgreSQL(RWS) │
│ Redis(会话/缓存) │ Meilisearch(搜索) │
└────────────────────────────────────────────────┘
```
### 4.2 单应用接入时序(L2 档位)
```
用户 平台前台 应用服务 Casdoor AI 网关
│ │ │ │ │
│ 点击"AI小说创作" │ │ │ │
│──────────────────────►│ │ │ │
│ │ 302 → 应用授权入口 │ │ │
│ │───────────────────►│ │ │
│ │ │ 重定向到 Casdoor │ │
│ │ │────────────────────►│ │
│ │ │ │ │
│ (用户已登录平台,静默授权) │ │ │
│ │ │ 302 + code ──────────────────────────────►│
│ │ │ │ │
│ │ │ 用 code 换 token │
│ │ │────────────────────►│ │
│ │ │◄──── JWT + userinfo ─│ │
│ │ │ │ │
│ │ │ 建立本地会话 │ │
│ │ │ 注入 user_id 到请求头 │ │
│ │ │ │ │
│ 在应用内发起 AI 请求 │ │ │ │
│ │ │ POST /v1/chat/completions │
│ │ │ Authorization: Bearer <proxy_key> │
│ │ │ X-Platform-User-Id: <user_id> │
│ │ │───────────────────────────────────────────►│
│ │ │ │ │
│ │ │ │ 校验 → 路由 → 计量 │
│ │ │ │ │
│ │ │◄──── 流式响应 ──────│ │
│◄──── 渲染结果 ────────│ │ │ │
```
---
## 5. 各应用接入改造要点(首批 3 个)
### 5.1 MuMuAINovel · 深度接入(L2)
**为何首批第一**:它是你主动提出、且最贴合"平台统一付费"诉求的项目;已有 LinuxDO OAuth 证明认证层可替换;OpenAI 兼容协议证明模型可调代理。
**改造清单**:
1. 新增 `CasdoorOIDCProvider` 类(照搬现有 LinuxDO 适配器模式)
2. 环境变量双模式:`PLATFORM_MODE=true/false` 切换自托管/平台托管
3. `OPENAI_BASE_URL=https://api.qihuyun.com/app/api/aiserver/v1`
4. `OPENAI_API_KEY=${PLATFORM_PROXY_KEY}`(平台颁发的应用级 Key)
5. Docker Compose 加 `depends_on: [casdoor, ai-gateway]`
**许可证处理(⚠️ GPL-3.0 重点)**:
- 方案 B:OIDC 适配器 + AI 代理层做成**独立中间件/Sidecar**,不修改 MuMuAINovel 核心源码 → 规避 GPL 传染性
- 在平台"开源致谢"页声明 MuMuAINovel 及 GPL-3.0 协议
- 部署容器命名为 `mumuainovel-adapter` + `mumuainovel-core` 两层
**预期效果**:用户在七虎 PaaS 订阅 Pro+小说套餐 → 点击进入 MuMuAINovel → 静默登录 → 创作时消耗的是平台套餐内 Token → 用量实时出现在 Token 驾驶舱。
### 5.2 next-ai-draw-io · 标准接入(L2)
**为何首批第二**:Apache-2.0 协议最友好(无传染性);已有 `ACCESS_CODE_LIST` 密码机制说明认证层可扩展;支持 10+ AI Provider 且都走环境变量配置,模型代理最简单。
**改造清单**:
1. 新增 Casdoor OIDC 适配器(项目用 Next.js,可用 `next-auth` 库快速接入)
2. 通过环境变量统一 AI Provider 为平台网关:
```
AI_PROVIDER=openai
AI_MODEL=qihuyun-default
OPENAI_API_KEY=${PLATFORM_PROXY_KEY}
OPENAI_BASE_URL=https://api.qihuyun.com/app/api/aiserver/v1
```
3. 用 `NEXT_PUBLIC_*` 注入平台用户上下文(user_id、subscription_tier)
4. 禁用 `ACCESS_CODE_LIST`(平台登录后无需二次密码)
**协议优势**:Apache-2.0 允许商业使用、修改、私有化部署,无开源传染风险。平台对其做的任何修改可选择性开源,也可私有。
**预期效果**:开发者在七虎 PaaS 点"AI 绘图"→ 进入 next-ai-draw-io → 用自然语言画云架构图/流程图 → 所有 AI 调用走平台网关计量。
### 5.3 OpenCut · 标准接入(L2)
**为何首批第三**:MIT 协议最自由;78.5K Stars 证明市场验证充分;"视频剪辑"是平台"自媒体/短视频创作"定位的核心场景;规划中的 MCP Server 与平台 Agent 生态天然契合。
**改造清单**:
1. 认证:OpenCut 新版本正在重写,Editor API + 插件系统开放,OIDC 插件可作为官方插件形式接入
2. AI 功能代理:OpenCut 的 AI 接入(智能剪辑、自动字幕、翻译)走平台网关
3. 部署:Docker Compose 已含 PG + Redis,新增 `casdoor-sidecar` 容器做认证代理
4. 文件存储:用户上传的视频素材走平台对象存储(S3 兼容),不落应用本地盘
**特殊处理**:OpenCut 的视频渲染是**计算密集型**(GPU 合成、FFmpeg 编码),需单独规划资源配额:
- 容器资源限制:CPU/内存/GPU 配额按会员等级差异化
- 渲染任务异步化:提交→排队→渲染→回调通知(避免 HTTP 长连接超时)
- 大文件上传走分片 + 平台 CDN
**预期效果**:自媒体用户在平台订阅"创作套餐"→ 使用 OpenCut 剪辑短视频 → AI 字幕/翻译/去字幕走平台模型 → 渲染消耗平台算力配额。
---
## 6. 平台侧改造需求(支撑所有应用接入)
### 6.1 必须新增的平台能力
| 能力 | 说明 | 优先级 |
|---|---|---|
| **应用注册中心** | `market_apps` 表扩展(app_id, name, type='app_service', entry_url, proxy_key, is_platform_hosted, docker_compose_tpl) | P0 |
| **代理 Key 体系** | 应用级 Key 颁发/轮换/吊销,关联 app_id + 配额 | P0 |
| **AI 网关中间件** | 校验代理 Key → 订阅校验 → 路由 → 计量 → 审计 | P0 |
| **OIDC 应用模板** | Casdoor 中预置应用配置,一键注册新应用 | P0 |
| **订阅套餐映射** | 会员套餐可包含"应用服务"权益(如 Pro+小说、创作套餐) | P0 |
| **用量看板(按应用)** | Token 驾驶舱新增"按应用"维度统计 | P1 |
| **应用生命周期** | 部署/启停/升级/回滚/健康检查 | P1 |
| **审计聚合** | 各应用上报的操作日志统一入 `audit_logs` | P2 |
### 6.2 数据库 Schema 扩展
```sql
-- 应用注册表(扩展现有 market_apps)
CREATE TABLE market_apps (
id VARCHAR(50) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
type VARCHAR(20) NOT NULL DEFAULT 'skill', -- 'skill' | 'app_service'
category VARCHAR(50),
description TEXT,
icon_url VARCHAR(500),
entry_url VARCHAR(500), -- 平台托管型应用的访问入口
deployment_type VARCHAR(20), -- 'hosted' | 'external' | 'embedded'
docker_compose_tpl TEXT, -- Docker Compose 模板(hosted 型)
proxy_key_hash VARCHAR(256), -- 平台颁发的代理 Key(bcrypt)
auth_mode VARCHAR(20), -- 'casdoor_oidc' | 'platform_token' | 'none'
protocol_license VARCHAR(50), -- MIT / Apache-2.0 / GPL-3.0 等
integration_level INT DEFAULT 1, -- 1=L1浅 2=L2中 3=L3深
status VARCHAR(20) DEFAULT 'pending', -- pending/active/suspended
version VARCHAR(50),
repository_url VARCHAR(500),
is_featured BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 应用实例(每个租户/用户部署一个实例)
CREATE TABLE app_instances (
id BIGSERIAL PRIMARY KEY,
app_id VARCHAR(50) REFERENCES market_apps(id),
tenant_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
instance_url VARCHAR(500),
container_id VARCHAR(200),
status VARCHAR(20) DEFAULT 'running',
deployed_at TIMESTAMP DEFAULT NOW(),
last_active_at TIMESTAMP,
resource_quota JSONB, -- {"cpu": 2, "memory_gb": 4, "gpu": 0}
rls_tenant_id BIGINT GENERATED ALWAYS AS (tenant_id) STORED
);
-- 应用订阅关联
CREATE TABLE app_subscriptions (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
app_id VARCHAR(50) REFERENCES market_apps(id),
plan_id VARCHAR(50),
status VARCHAR(20) DEFAULT 'active',
started_at TIMESTAMP DEFAULT NOW(),
expires_at TIMESTAMP,
payment_method VARCHAR(20), -- 'subscription_quota' | 'pay_per_use'
rls_tenant_id BIGINT
);
-- 扩展 token_usage_logs 增加 app 维度
ALTER TABLE token_usage_logs
ADD COLUMN IF NOT EXISTS app_id VARCHAR(50),
ADD COLUMN IF NOT EXISTS app_name VARCHAR(200),
ADD COLUMN IF NOT EXISTS billing_model VARCHAR(20); -- 'subscription' | 'pay_per_use'
-- RLS 策略(多租户隔离)
ALTER TABLE app_instances ENABLE ROW LEVEL SECURITY;
CREATE POLICY app_instances_tenant_isolation ON app_instances
USING (tenant_id = current_setting('app.current_tenant_id')::BIGINT);
```
### 6.3 AI 网关代理 Key 中间件(FastAPI 骨架)
```python
# /app/api/aiserver/v1/chat/completions
from fastapi import Request, HTTPException, Depends
from fastapi.responses import StreamingResponse
import httpx, os
PLATFORM_AI_BACKEND = os.getenv("PLATFORM_AI_BACKEND") # 真实上游
@app.post("/app/api/aiserver/v1/chat/completions")
async def proxy_chat_completions(request: Request, body: dict):
# 1. 校验代理 Key
auth = request.headers.get("Authorization", "")
proxy_key = auth.replace("Bearer ", "")
app = await resolve_app_by_proxy_key(proxy_key)
if not app or not app["is_active"]:
raise HTTPException(401, "Invalid or revoked proxy key")
# 2. 解析用户 + 订阅校验
user_id = request.headers.get("X-Platform-User-Id")
subscription = await check_subscription(user_id, app["id"])
if not subscription or subscription["status"] != "active":
raise HTTPException(402, "Active subscription required for this app")
# 3. 配额检查
usage = await get_current_period_usage(user_id, app["id"])
if usage["tokens"] >= subscription["token_quota"]:
raise HTTPException(429, "Token quota exceeded, please upgrade")
# 4. 转发到真实上游(LiteLLM 或直连模型)
upstream_body = rewrite_request(body, target_model=subscription["allowed_model"])
async with httpx.AsyncClient(timeout=300) as client:
upstream_resp = await client.post(
f"{PLATFORM_AI_BACKEND}/v1/chat/completions",
json=upstream_body,
headers={"Authorization": f"Bearer {os.getenv('UPSTREAM_API_KEY')}"}
)
# 5. 计量(流式则异步累计)
await record_usage(
user_id=user_id,
app_id=app["id"],
app_name=app["name"],
model=upstream_body.get("model"),
prompt_tokens=upstream_resp.json().get("usage", {}).get("prompt_tokens", 0),
completion_tokens=upstream_resp.json().get("usage", {}).get("completion_tokens", 0),
billing_model="subscription"
)
return StreamingResponse(upstream_resp.aiter_bytes(), media_type="application/json")
```
---
## 7. 许可证风险管理
### 7.1 主流开源协议对比
| 协议 | 商业使用 | 修改后需开源 | 传染范围 | 适用接入策略 |
|---|---|---|---|---|
| **MIT** | ✅ | ❌(只需保留版权声明) | 无 | 自由集成、可改可闭源、最友好 |
| **Apache-2.0** | ✅ | ❌(需声明修改) | 无 | 自由集成、需保留 NOTICE |
| **GPL-3.0** | ✅ | ✅(衍生作品须 GPL) | 强传染 | **必须外围集成,不修改核心** |
| **AGPL-3.0** | ✅ | ✅(网络服务也须开源) | 网络服务传染 | 避免修改,仅做协议适配 |
### 7.2 各候选项目的合规策略
| 项目 | 协议 | 风险点 | 合规方案 |
|---|---|---|---|
| **MuMuAINovel** | GPL-3.0 | 修改核心代码 → 衍生作品须 GPL | **外围集成**:OIDC/AI代理做成独立 Sidecar,不改核心 |
| **OpenCut** | MIT | 几乎无 | 自由修改、可闭源,最省心 |
| **next-ai-draw-io** | Apache-2.0 | 需保留 NOTICE | 保留版权声明 + NOTICE 文件即可 |
| **HyperFrames** | Apache-2.0 | 同上 | 同上 |
| **dashi-ppt-skill** | MIT | 无 | 转技能上架,无顾虑 |
| **ai-job-search** | MIT | 无 | 转技能上架,无顾虑 |
### 7.3 平台级合规清单
每个接入应用必须:
- [ ] 在平台"开源致谢"页列出项目名称、作者、协议、仓库链接
- [ ] 保留原始 LICENSE 文件,不删除版权声明
- [ ] GPL 项目:修改(如有)以独立仓库开源,并在 README 声明
- [ ] 用户协议中说明"本平台部分功能基于开源项目构建"
- [ ] 联系原作者获取商业授权(GPL 项目强烈推荐,建立合作)
---
## 8. 落地路线图
### 8.1 三阶段推进
```
阶段一 · 奠基(第 1-4 周)
├── W1: 平台侧改造
│ ├── 扩展 market_apps 表 + RLS 策略
│ ├── AI 网关代理 Key 中间件
│ ├── Casdoor 应用注册模板
│ └── 订阅套餐映射
├── W2-3: MuMuAINovel L1 接入(OIDC 打通)
└── W4: next-ai-draw-io L1+L2 接入(双模式切换)
阶段二 · 标杆(第 5-8 周)
├── W5-6: MuMuAINovel 升级 L2(模型代理+计量)
├── W7: OpenCut L1+L2 接入
├── W8: 平台"应用服务"前台页面上线(卡片式入口)
阶段三 · 生态(第 9-12 周)
├── W9-10: 技能市场 + 应用服务统一审核流水线
├── W11: 应用内增值购买 + 分润结算
└── W12: HyperFrames 接入评估 + 第二批候选筛选
```
### 8.2 里程碑与验收标准
| 里程碑 | 验收标准 |
|---|---|
| **M1:单点登录打通** | 用户在平台登录后,点击 3 个应用入口均能静默进入,无二次登录 |
| **M2:模型统一路由** | 3 个应用的所有 AI 调用均走平台网关,上游模型可一键切换 |
| **M3:计量闭环** | 平台 Token 驾驶舱可按"应用"维度展示用量,数据延迟 < 1 分钟 |
| **M4:订阅闭环** | 用户订阅套餐包含应用权益,过期后应用自动提示升级 |
| **M5:上架流程** | 第 4 个应用接入耗时 < 1 周(前 3 个的平均值的 50%) |
---
## 9. 风险与应对
| 风险 | 概率 | 影响 | 应对 |
|---|---|---|---|
| GPL 项目协议传染 | 中 | 高 | 外围集成策略 + 法律审查 + 作者商业授权 |
| 应用升级导致接入层破坏 | 中 | 中 | Docker 镜像锁定版本 + 适配层测试 + 灰度升级 |
| AI 网关成单点瓶颈 | 中 | 高 | LiteLLM 水平扩容 + Redis 缓存 + 熔断降级 |
| 多租户数据串扰 | 低 | 极高 | PG RLS 强制 + 集成测试 + 混沌工程 |
| 视频渲染资源耗尽 | 中 | 中 | 容器配额 + 任务队列 + 会员差异化 |
| 第三方应用安全漏洞 | 中 | 高 | 容器沙箱 + gVisor + 依赖扫描 + 最小权限 |
---
## 10. 与既有文档的承接关系
本文档是《AI_PaaS_Platform_Analysis_and_Execution_Plan.md》的**专项延伸**,承接关系如下:
| 既有章节 | 本文承接点 |
|---|---|
| 第二部分 §2.3 插件体系 | 应用服务是"插件"的终极形态——独立进程级插件 |
| 第三部分 dashi-ppt 改造 | dashi-ppt 转"技能"上架,本文界定它不该做"应用" |
| 第四部分 技能开发标准 | 本文 §2 的"应用 vs 技能"决策树与之互补 |
| 第五部分 §5.2.5 技能市场 | 应用市场是技能市场的"重型补充" |
| 第五部分 §5.4 优先级表 #5 | MuMuAINovel 接入即"落地标杆技能真实执行器"的具象化 |
---
## 附录 A:应用接入 SOP 检查清单
每个新应用接入必须逐条勾选:
### A.1 选型评估
- [ ] 通过 §1.2 六维评估,总分 ≥ 3.5
- [ ] 许可证兼容(MIT/Apache 优先,GPL 走外围集成方案)
- [ ] 与平台定位契合(覆盖至少 1 个核心场景)
- [ ] 技术栈可容器化(Docker 镜像可用)
### A.2 L1 接入(认证)
- [ ] 应用侧新增 Casdoor OIDC 适配器并通过联调
- [ ] 平台侧 Casdoor 注册应用、颁发 Client ID/Secret
- [ ] 平台前台"应用服务"卡片可跳转并静默登录
- [ ] 登出平台后,应用会话同步失效
### A.3 L2 接入(模型+计费)
- [ ] 应用 AI 调用全部指向平台网关
- [ ] 平台代理 Key 颁发、轮换、吊销流程可用
- [ ] AI 网关中间件通过代理 Key 校验、订阅校验、计量写入
- [ ] Token 驾驶舱"按应用"维度统计正确
- [ ] 订阅过期后应用优雅降级(非 500 错误)
### A.4 L3 接入(深度)
- [ ] 应用数据库启用 PG RLS,tenant_id 隔离验证通过
- [ ] 审计日志上报平台 `audit_logs`
- [ ] 暴露 Prometheus 指标,平台 Grafana 可采集
- [ ] GDPR 数据导出/删除接口可用
- [ ] 安全审计通过(渗透测试 + 依赖扫描)
### A.5 上架运营
- [ ] 平台"开源致谢"页已添加项目信息
- [ ] LICENSE 文件保留且完整
- [ ] 应用详情页(截图、介绍、入口、定价)已配置
- [ ] 监控告警已配置(可用性、延迟、错误率)
- [ ] 回滚预案已演练
---
## 附录 B:术语表
| 术语 | 含义 |
|---|---|
| **应用服务(App Service)** | 独立可运行的 Web 应用,通过单点登录接入平台,共享平台模型与计费 |
| **OIDC** | OpenID Connect,基于 OAuth 2.0 的身份认证协议 |
| **Casdoor** | 开源的统一身份认证平台,本项目用作 OIDC IdP |
| **代理 Key(Proxy Key)** | 平台颁发给应用的长期密钥,用于 AI 网关识别"哪个应用在代哪个用户调用" |
| **AI 网关** | 平台统一接管所有模型调用的中间件,承担认证、路由、限流、计量、审计 |
| **外围集成** | 不修改目标项目核心源码,通过 Sidecar/中间件/环境变量方式接入,规避 GPL 传染 |
| **RLS** | Row Level Security,PostgreSQL 行级安全策略,实现多租户数据隔离 |
| **LiteLLM** | 统一 100+ LLM 供应商的开源网关,OpenAI 兼容格式 |
| **L1/L2/L3** | 本文件定义的三级集成深度(浅/中/深) |
---
> **文档版本**:v1.0.0
> **生成日期**:2026-07-27
> **下一步行动**:
> 1. 将此文件喂给 WorkBuddy,按 §8 路线图推进阶段一(W1 平台侧改造)
> 2. 将本文档作为《AI_PaaS_Platform_Analysis_and_Execution_Plan.md》的新章节合并
> 3. 对每个首批应用(MuMuAINovel/next-ai-draw-io/OpenCut)单独生成改造代码骨架
> **反馈渠道**:平台内部 Issue Tracker / 架构组邮件