mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-24 01:15:24 +08:00
copy: call every plan 计划 instead of 套餐 (#2763)
The Chinese copy used 套餐 (package) for the subscription plan in the cloud banner, the model errors and the multi-tenant docs. Name the same concept 计划 everywhere; Traditional Chinese keeps 計劃.
This commit is contained in:
@@ -154,7 +154,7 @@
|
||||
|
||||
1. 注册自动创建个人 Workspace、owner membership、Free subscription、
|
||||
entitlement snapshot 和 outbox 事件,且重试不重复创建。
|
||||
2. 邀请、成员变更、套餐变更和 Workspace 撤销只影响目标 Workspace。
|
||||
2. 邀请、成员变更、计划变更和 Workspace 撤销只影响目标 Workspace。
|
||||
3. 全量快照与增量事件覆盖乱序、重复、断点续传、缺页、签名错误、
|
||||
high-water gap、snapshot coverage 和消费者重启。
|
||||
4. Core、Plugin Runtime 或 Box 重启后,权威 desired state 可恢复;
|
||||
@@ -173,7 +173,7 @@
|
||||
最终关闭,`mcp_projection_retirements` 和
|
||||
`mcp_projection_reconcile_active` 在冷却期归零。
|
||||
|
||||
### V-06:套餐、Box 与 stdio MCP
|
||||
### V-06:计划、Box 与 stdio MCP
|
||||
|
||||
1. Free/非 Pro Workspace 不会自动获得 managed sandbox。
|
||||
2. 合资格 Workspace 最多只有一个持久 `global` sandbox,且新增 Workspace
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
| 编号 | 结论 | 首期状态 |
|
||||
| ----- | --------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
|
||||
| D-001 | 一个共享 Plugin Runtime 控制面;每个运行中的 plugin installation 独占一个 nsjail 子进程;只有 digest 相同且已验证的代码 artifact 可以只读共享 | `IMPLEMENTED — egress/disk-quota pending; restart-storm fault injection pending` |
|
||||
| D-002 | 一个共享 Box Runtime;Cloud 固定使用 nsjail;符合套餐的 Workspace 最多一个持久 `global` 逻辑 sandbox,普通执行按需启动 nsjail 进程 | `IMPLEMENTED FAIL-CLOSED — hard filesystem quota provider pending` |
|
||||
| D-002 | 一个共享 Box Runtime;Cloud 固定使用 nsjail;符合计划的 Workspace 最多一个持久 `global` 逻辑 sandbox,普通执行按需启动 nsjail 进程 | `IMPLEMENTED FAIL-CLOSED — hard filesystem quota provider pending` |
|
||||
| D-003 | SaaS 业务数据使用 PostgreSQL shared schema、应用层作用域和 RLS 双重隔离;pgvector 使用同一 PostgreSQL,作为 SaaS 默认向量后端 | `PARTIALLY IMPLEMENTED — transaction/outbox/deployment gates remain` |
|
||||
| D-004 | stdio MCP 与 Box availability 解耦;Cloud v2 首期强制关闭 stdio MCP,避免为每个 Workspace 创建额外的 `mcp-shared` persistent sandbox | `IMPLEMENTED` |
|
||||
| D-005 | 目录启动使用事务一致的全量快照,运行时按事件涉及的 Workspace 拉取增量;每个 Core replica 独立消费事件,共享 PostgreSQL 投影和 inbox | `IMPLEMENTED — production fault injection pending` |
|
||||
@@ -47,7 +47,7 @@ Workspace 的具体创建、释放、数据导出和单 Workspace 恢复机制
|
||||
统一评估原则:
|
||||
|
||||
1. 注册 Account、自动创建空 Workspace 时,不启动 Plugin worker 或 Box sandbox。
|
||||
2. 启用插件后,每个 installation 的常驻成本来自其独立安全边界;首次使用托管 sandbox 后,符合套餐的 Workspace 才承担一个持久逻辑 session 的成本。
|
||||
2. 启用插件后,每个 installation 的常驻成本来自其独立安全边界;首次使用托管 sandbox 后,符合计划的 Workspace 才承担一个持久逻辑 session 的成本。
|
||||
3. 可信 supervisor、artifact cache、数据库连接池和 Runtime 容量可以多租户共享。
|
||||
4. 一个不可信插件进程不能服务多个 installation;一个 sandbox/session 不能服务多个 Workspace。
|
||||
5. 默认使用共享 Runtime;dedicated 只作为未来高隔离、大客户或合规资源等级,不建立第二套外部协议。
|
||||
@@ -221,7 +221,7 @@ v1 connection 的兼容期限,以及进入多 replica 后的 lease TTL、fenci
|
||||
- requirements 中存在 Runtime 基础镜像未预装的包时,Supervisor 仍能先完成共享依赖环境准备再启动 worker;
|
||||
安装失败不会留下持续重启的半启动进程,也不会影响同 digest 已就绪环境的其他 installation。
|
||||
|
||||
## 4. D-002:Box 多租户控制面和套餐边界
|
||||
## 4. D-002:Box 多租户控制面和计划边界
|
||||
|
||||
状态:`IMPLEMENTED FAIL-CLOSED — production quota provider pending`
|
||||
|
||||
@@ -236,12 +236,12 @@ v1 connection 的兼容期限,以及进入多 replica 后的 lease TTL、fenci
|
||||
- grant-enforced readiness 强制 cgroup、namespace、mount、共享卷、Workspace hard quota、Skill hard quota、ephemeral storage 和 inode quota 全部被证明。
|
||||
普通 nsjail backend 对尚未实现的硬磁盘能力明确返回 false,因此当前 Cloud Box 会按设计拒绝启动,直到新部署提供真实 quota provider。
|
||||
|
||||
### 4.2 首期套餐与 entitlement 模型
|
||||
### 4.2 首期计划与 entitlement 模型
|
||||
|
||||
- 闭源订阅管理/Control Plane 负责把套餐映射为版本化 entitlement;Core 和 Box Runtime 不硬编码 `plan == pro`。
|
||||
- 首期复用 Cloud Control Plane(可结合现有 Space 的订阅模块)承载闭源套餐、计费和 entitlement 投影,
|
||||
- 闭源订阅管理/Control Plane 负责把计划映射为版本化 entitlement;Core 和 Box Runtime 不硬编码 `plan == pro`。
|
||||
- 首期复用 Cloud Control Plane(可结合现有 Space 的订阅模块)承载闭源计划、计费和 entitlement 投影,
|
||||
不再拆一个独立 billing/tenant microservice;开源 Core 只实现通用 capability 和数值限额。
|
||||
- 首期套餐投影为:Pro 的 `managed_sandbox_sessions = 1`,其他套餐为 `0`。建议 capability 形态:
|
||||
- 首期计划投影为:Pro 的 `managed_sandbox_sessions = 1`,其他计划为 `0`。建议 capability 形态:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -260,7 +260,7 @@ v1 connection 的兼容期限,以及进入多 replica 后的 lease TTL、fenci
|
||||
- 工具发现层根据 entitlement 隐藏/禁用托管 sandbox。Core 校验 Control Plane 的 entitlement 后,
|
||||
通过受认证控制连接向 Box Runtime 下发短期 `SandboxAdmissionGrant`,绑定
|
||||
`instance_uuid + workspace_uuid + execution_generation + entitlement_revision + expires_at + max_sessions + max_managed_processes`。
|
||||
Runtime 只验证和执行该内部 grant,不理解 Pro 等套餐名称,也不相信业务调用方提交的 plan、session ID 或 host path。
|
||||
Runtime 只验证和执行该内部 grant,不理解 Pro 等计划名称,也不相信业务调用方提交的 plan、session ID 或 host path。
|
||||
- entitlement 缺失、过期或无法验证时失败关闭。并发创建必须用原子 admission 保证同一 Workspace 永远不超过一个 managed session。
|
||||
- entitlement 被撤销后停止 managed process 并关闭逻辑 session;Workspace 数据保留/删除策略随未来 Workspace 释放机制一并决定。
|
||||
|
||||
@@ -292,7 +292,7 @@ v1 connection 的兼容期限,以及进入多 replica 后的 lease TTL、fenci
|
||||
低于正常附件上限,不能当作等价 Cloud 文件机制。无法共享路径时必须先扩展传输协议,否则 deployment readiness 失败。
|
||||
- 现有执行前后目录扫描只能提供软检查,不能阻止单次命令写满共享卷。生产 Cloud 的 Workspace 总空间上限必须由
|
||||
Box-owned volume 的 filesystem project quota/subvolume quota 在写入点原子执行;Box Runtime 负责设置和验证,不能因 Core 看不到路径而跳过。
|
||||
- Cloud 的 nsjail CPU、内存、PID、单文件和总空间限制使用运维配置统一设置;套餐只决定 session 数量,
|
||||
- Cloud 的 nsjail CPU、内存、PID、单文件和总空间限制使用运维配置统一设置;计划只决定 session 数量,
|
||||
不允许 Workspace 放宽 sandbox 上限。
|
||||
- Box Runtime 必须在 cgroup v2 hard limit、namespace 和 mount 条件满足后才通过 readiness;不能在共享 SaaS 中告警后降级运行。
|
||||
- 同 Workspace 的 `global` session 可以复用持久 `/workspace`,但不同 Workspace 即使使用相同文件名、进程名或逻辑 session ID,
|
||||
@@ -444,7 +444,7 @@ P1 的 resolver、映射、在线迁移、连接池预算、shard-affine replica
|
||||
- 修复前,stdio MCP 的启用条件只检查 transport 为 `stdio` 且 Box available,没有独立 feature gate。
|
||||
- 修复前,所有 stdio MCP 使用固定的 `mcp-shared` 逻辑 session,并强制 `persistent=True`。
|
||||
- 在该旧逻辑下,如果多租户 Cloud 只通过 `box.enabled` 开放能力,每个配置 stdio MCP 的 Workspace 都会额外保留一个 persistent sandbox,
|
||||
绕过“每 Workspace 最多一个 managed `global` sandbox”的成本和套餐边界。
|
||||
绕过“每 Workspace 最多一个 managed `global` sandbox”的成本和计划边界。
|
||||
|
||||
### 6.2 首期决定
|
||||
|
||||
@@ -458,7 +458,7 @@ mcp:
|
||||
|
||||
- OSS 默认 `true`,保持当前本地部署兼容;Cloud v2 通过 `MCP__STDIO__ENABLED=false` 强制关闭。
|
||||
- 该开关与 `box.enabled`、`managed_sandbox` entitlement 和 sandbox session 数量相互独立,不能从任一条件推导。
|
||||
- 后续如开放给特定套餐,可在实例开关之上再叠加 Workspace capability;实例开关为 `false` 时任何 entitlement 都不能绕过。
|
||||
- 后续如开放给特定计划,可在实例开关之上再叠加 Workspace capability;实例开关为 `false` 时任何 entitlement 都不能绕过。
|
||||
- HTTP/SSE/其他远程 MCP transport 不受此开关影响。
|
||||
|
||||
### 6.3 强制检查点
|
||||
@@ -492,8 +492,8 @@ mcp:
|
||||
- Box 通过“共享 Runtime + 每个合资格 Workspace 一个持久逻辑 session + one-shot nsjail exec”避免每租户部署服务和空闲容器。
|
||||
- stdio MCP 独立关闭,防止从 Box availability 隐式产生第二套 persistent sandbox。
|
||||
- PostgreSQL 和 pgvector 共享数据库组件,但使用显式 tenant key、应用层 scope 和 RLS 防止共享存储变成共享权限。
|
||||
- 订阅管理只在闭源 Control Plane 维护套餐与计费规则,并向开源 Core 投影签名/版本化 entitlement;
|
||||
Core/Runtime 执行通用 capability 和数值限额,不复制套餐名称或计费逻辑。
|
||||
- 订阅管理只在闭源 Control Plane 维护计划与计费规则,并向开源 Core 投影签名/版本化 entitlement;
|
||||
Core/Runtime 执行通用 capability 和数值限额,不复制计划名称或计费逻辑。
|
||||
- 目录同步只在启动或恢复时读取全量快照;常态变更按 Workspace 聚合为签名增量,新增租户不会使每次目录事件退化为全实例重投影。
|
||||
|
||||
## 8. 当前不做分布式时仍保留的能力
|
||||
|
||||
@@ -26,7 +26,7 @@ Cloud v2 采用以下模型:
|
||||
6. 一个共享 Plugin Runtime 控制面管理所有 Workspace,但每个运行中的 plugin installation 独占一个 nsjail 进程;enabled-resident 是 desired semantics,只读代码和依赖可按已验证摘要共享。
|
||||
7. 一个共享 Box Runtime 管理所有 Workspace;首期符合 entitlement 的 Workspace 最多拥有一个持久 `global` 逻辑 sandbox,实际命令继续以 nsjail 子进程执行。
|
||||
8. SaaS 业务数据使用 PostgreSQL shared schema、应用层 scope 与 RLS 双重隔离;pgvector 位于同一个业务数据库并作为 SaaS 默认向量后端。
|
||||
9. stdio MCP 有独立实例开关,Cloud v2 首期强制关闭,不能由 Box availability 或套餐能力隐式开启。
|
||||
9. stdio MCP 有独立实例开关,Cloud v2 首期强制关闭,不能由 Box availability 或计划能力隐式开启。
|
||||
10. 闭源 Control Plane 可以作为模块化单体复用现有账户、支付和运营能力,但历史 Cloud 的租户专属部署模型不进入新架构。
|
||||
11. Workspace 创建、释放、export、单 Workspace restore 和在线迁移的具体流程仍待后续决策。
|
||||
|
||||
@@ -357,7 +357,7 @@ nbf, exp, grace_until
|
||||
```
|
||||
|
||||
Core 校验 issuer、audience、subject、instance、revision、时间和签名;旧 revision 不覆盖新快照。
|
||||
套餐名称和价格规则只存在于闭源 Control Plane,Core 与 Runtime 只理解通用 capability 和数值限额。
|
||||
计划名称和价格规则只存在于闭源 Control Plane,Core 与 Runtime 只理解通用 capability 和数值限额。
|
||||
|
||||
Control Plane 故障时,已缓存且仍有效的快照可继续执行;过期后只能进入明确、有限的 grace 模式或失败关闭。
|
||||
|
||||
@@ -663,8 +663,8 @@ installation 总磁盘配额需要可原子拒绝写入的 quota provider,不
|
||||
}
|
||||
```
|
||||
|
||||
闭源订阅模块把套餐映射为该通用 capability;Core 与 Runtime 不判断 `plan == pro`。
|
||||
预期 Pro 得到 `managed_sandbox_sessions = 1`,其他套餐为 `0`。
|
||||
闭源订阅模块把计划映射为该通用 capability;Core 与 Runtime 不判断 `plan == pro`。
|
||||
预期 Pro 得到 `managed_sandbox_sessions = 1`,其他计划为 `0`。
|
||||
|
||||
### 12.2 Sandbox 模型
|
||||
|
||||
|
||||
@@ -122,9 +122,9 @@ LangBot ──> K8s Job per execution
|
||||
| **应用层** | Redis 原子计数器 | 并发 session 数/执行次数/CPU 时间预算 |
|
||||
| **计费层** | 月度聚合 | 按租户计费(session-hours/execution-count) |
|
||||
|
||||
### Profile 与套餐映射
|
||||
### Profile 与计划映射
|
||||
|
||||
| 套餐 | Profile | locked 字段 | 配额 |
|
||||
| 计划 | Profile | locked 字段 | 配额 |
|
||||
|------|---------|------------|------|
|
||||
| Free | `offline_readonly` | network, host_path_mode, rootfs | 10 exec/天, 0.5 CPU, 256MB |
|
||||
| Pro | `default` | (无) | 100 exec/天, 1 CPU, 512MB |
|
||||
|
||||
Reference in New Issue
Block a user