mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-07-16 17:36:07 +00:00
343 lines
16 KiB
Markdown
343 lines
16 KiB
Markdown
# EBA 产品化与发布计划
|
||
|
||
> 状态:规划草案,2026-07-01
|
||
>
|
||
> 范围:将已经合并的 AgentRunner 插件化和 Event Based Agent 适配器工作产品化,使非技术用户也能快速上手。本文聚焦产品缺口、发布门禁和 SaaS 多命名空间租户能力。本文不引入新的协议 schema;协议事实仍以 [PROTOCOL_V1.md](./PROTOCOL_V1.md) 为准,Host 模型事实仍以 [HOST_SDK_INFRASTRUCTURE.md](./HOST_SDK_INFRASTRUCTURE.md) 为准。
|
||
|
||
## 1. 产品方向
|
||
|
||
当前技术方向是正确的:LangBot 应该把平台输入视为事件,为每个事件解析出一个有效路由,并通过 AgentRunner Host 边界调用一个处理资产。但这还不是一个非技术用户无需理解内部架构就能采用的产品。
|
||
|
||
产品层模型应当是:
|
||
|
||
- **机器人(Bot)**:平台连接与事件路由入口。机器人拥有适配器凭据、平台权限、入站事件可见性,以及这些事件的路由表。
|
||
- **处理器(Processor)**:可复用的事件处理资产。当前处理器类型包括 **Agent** 和 **Pipeline**。未来可以增加 **Workflow**。
|
||
- **Pipeline**:一等的无代码消息处理器,通过完整 Stage 链提供预处理、AI、后处理、扩展和输出控制。Pipeline 只处理消息,应当只能绑定到 `message.*` 事件。
|
||
- **Agent**:由 runner 驱动的事件优先处理器。Agent 可以根据自身声明的事件支持范围处理消息事件和非消息事件。
|
||
- **Solution(方案包)**:未来的分发/导出单元,包含处理器、路由模板、依赖清单、变量和文档。Solution 不应包含具体机器人凭据、租户密钥或已安装资产的 UUID 绑定。
|
||
|
||
`EBA` 是内部工程术语。它可以出现在内部设计文档中,但不应出现在主要产品流程里。面向用户的语言应优先使用“频道”“事件路由”“处理器”“消息流水线”“自动化”“路由模板”等表达。
|
||
|
||
## 2. 当前基础
|
||
|
||
已合并分支已经具备内部冒烟测试所需的技术基础:
|
||
|
||
- EBA 适配器可以把平台活动规范化为稳定的 Host 事件名。
|
||
- 机器人可以持久化 `event_bindings`,并将事件路由到 Agent、Pipeline 或丢弃目标。
|
||
- 旧消息输入可以投射到标准的 `message.received` 事件路径。
|
||
- Pipeline 仍可作为只处理消息的无代码处理器使用。
|
||
- AgentRunner 插件化提供了 Host 与 Runner 的契约、事件优先上下文、结果流和运行时集成边界。
|
||
- 官方 local runner 和 external runner 插件可以验证 runner 行为已经不再硬编码在 LangBot Core 中。
|
||
- WebUI 已具备 Agent/处理器管理页面,以及机器人侧事件路由页面。
|
||
- 机器人事件路由已具备 dry-run 诊断、运行时状态展示,以及安全的合成测试事件派发;测试事件会走已保存的 runtime 路由,但抑制真实平台出站动作。
|
||
- MCP 工具面已暴露机器人事件路由状态查询和合成测试事件派发,便于 QA agent 或外部调试工具复用。
|
||
|
||
这是一个技术收敛里程碑,还不是产品就绪版本。
|
||
|
||
## 3. 距离非技术产品的缺口
|
||
|
||
### 3.1 概念负担
|
||
|
||
当前用户仍需要理解过多内部概念:EBA、适配器事件名、runner 标识、插件运行时健康状态、事件模式、优先级和绑定目标。面向非技术用户的产品应当通过意图和结果来引导:
|
||
|
||
- “收到一条消息时,用这个处理器回复。”
|
||
- “有新群成员加入时,发送欢迎语。”
|
||
- “收到好友请求时,让 Agent 判断是否接受。”
|
||
|
||
`group.member_joined` 这类原始事件模式应继续保留在高级模式中,但默认 UI 应按友好名称和平台能力对事件进行分组。
|
||
|
||
### 3.2 上手路径
|
||
|
||
首次使用路径应当从用例开始,而不是从架构开始:
|
||
|
||
1. 选择一个频道。
|
||
2. 连接账号或 webhook。
|
||
3. 选择该频道支持的事件预设。
|
||
4. 选择或创建一个处理器。
|
||
5. 发送测试事件。
|
||
6. 如果失败,阅读简单的运行轨迹。
|
||
|
||
当前产品仍假设用户能诊断后端、插件运行时、Box 运行时、适配器和 runner 插件是否都已连接。对于开发者这是可接受的,但对非技术用户不可接受。
|
||
|
||
### 3.3 适配器就绪度
|
||
|
||
每个适配器都需要产品能力清单,而不仅是工程实现:
|
||
|
||
- 支持的事件列表及友好标签;
|
||
- 支持的出站动作;
|
||
- 所需凭据和配置步骤;
|
||
- 本地部署、自托管、SaaS 可用性;
|
||
- 测试信号可用性;
|
||
- 废弃/遗留状态;
|
||
- 已知限制。
|
||
|
||
废弃适配器应在产品中明确标记为“已废弃”或“遗留”。新的事件型适配器应按频道名称和能力描述,而不是使用 EBA 缩写。
|
||
|
||
### 3.4 处理器体验
|
||
|
||
处理器页面应管理可复用的 Agent 与 Pipeline,而不是让用户一次性理解所有事件路由决策。
|
||
|
||
- 创建 Agent 时应提供有倾向性的 runner 模板。
|
||
- 创建 Pipeline 时应继续保持无代码消息流水线路径。
|
||
- 未来 Workflow 的执行语义稳定后,可以作为另一种处理器类型引入。
|
||
- 支持的事件范围应作为能力信息和高级约束展示,而不是作为创建流程的主要概念。
|
||
- 依赖健康状态应可见:runner 插件是否安装、运行时是否连接、所需模型是否配置、所需资源是否可访问。
|
||
|
||
### 3.5 机器人事件路由体验
|
||
|
||
机器人页面应成为平台特定事件路由的主要配置位置,因为平台事件在已连接频道的上下文中最容易被用户理解。
|
||
|
||
最低产品要求:
|
||
|
||
- 基于适配器能力生成友好的事件选择器;
|
||
- 目标选择器按事件兼容性过滤;
|
||
- 对非消息事件隐藏 Pipeline;
|
||
- 对重叠路由给出冲突警告;
|
||
- 优先级先用视觉方式解释,而不是首先展示原始数字;
|
||
- 提供路由测试按钮,可以注入或重放样例事件;
|
||
- 每条路由展示状态,包括最近一次匹配的 run 和最近失败原因;
|
||
- 提供安全的兜底路由,包括显式丢弃。
|
||
|
||
### 3.6 可观测性
|
||
|
||
非技术用户需要的是简短运行轨迹,而不是原始日志:
|
||
|
||
```text
|
||
收到事件 -> 命中路由 -> 启动处理器 -> 动作已投递
|
||
```
|
||
|
||
当失败发生时,UI 应指出失败层级:
|
||
|
||
- 频道未连接;
|
||
- 适配器不支持该事件;
|
||
- 没有路由命中;
|
||
- 处理器已禁用;
|
||
- runner 插件不可用;
|
||
- 模型/资源缺失;
|
||
- 投递权限被拒绝。
|
||
|
||
### 3.7 文档和模板
|
||
|
||
发布需要面向产品场景的文档和模板:
|
||
|
||
- 客服机器人;
|
||
- 群欢迎和群管理;
|
||
- 好友请求审核;
|
||
- Dify 支持的外部 Agent;
|
||
- 使用 LangBot 模型和知识库的本地 Agent;
|
||
- 用于多阶段消息处理的 Pipeline。
|
||
|
||
文档应先描述产品模型,只在高级架构章节中暴露内部术语。
|
||
|
||
## 4. 推荐 UX 边界
|
||
|
||
之前“把所有事件编排都放进 Agent”的方向应当收窄。更好的边界是:
|
||
|
||
- **机器人页面负责事件路由**,因为事件面是平台特定的,用户也自然会在机器人上配置频道行为。
|
||
- **处理器页面负责处理器资产**,因为 Agent 与 Pipeline 都应能跨机器人复用,并且未来可以被打包进 Solution。
|
||
- **Pipeline 保持为一种处理器类型**,而不是隐藏在 Agent 术语背后的历史对象。
|
||
|
||
这样可以降低心智负担:
|
||
|
||
- 用户在机器人页面问:“当这个机器人遇到某件事时,应该做什么?”
|
||
- 用户在处理器页面问:“我想复用什么处理逻辑?”
|
||
|
||
这也支持同一个机器人上的不同事件使用不同处理器类型:一个事件可以使用 Pipeline,另一个事件可以使用 Agent,未来另一个事件可以使用 Workflow。
|
||
|
||
## 5. 未来导出、分发和导入单元
|
||
|
||
导出/导入不在当前实现范围内,但产品边界不应阻塞它。
|
||
|
||
正确的未来分发单元是 **Solution**,不是机器人,也不是单独的 Agent。
|
||
|
||
Solution 应包含:
|
||
|
||
- 处理器:Agent、Pipeline、未来 Workflow 定义;
|
||
- 路由模板:事件模式、友好名称、目标逻辑引用、默认优先级和可选条件;
|
||
- 依赖清单:所需 runner 插件、适配器能力要求、模型、工具和资源;
|
||
- 变量:用户提供的值,例如 API key、频道选择、模型选择和 prompt 参数;
|
||
- 文档:配置意图和预期行为。
|
||
|
||
Solution 不应包含:
|
||
|
||
- 具体机器人凭据;
|
||
- 已安装运行时 token;
|
||
- 租户或命名空间 UUID;
|
||
- 密钥;
|
||
- 原始平台账号标识;
|
||
- 已解析的机器人事件绑定 UUID。
|
||
|
||
导入时,应在目标命名空间内解析路由模板。用户需要先选择机器人/频道,并授予所需权限。
|
||
|
||
## 6. SaaS 多命名空间架构
|
||
|
||
产品在公开 SaaS 发布前必须支持多命名空间 SaaS 架构。事件路由模型很敏感,因为适配器、凭据、处理器、运行时、状态和日志都会跨越信任边界。
|
||
|
||
### 6.1 命名空间模型
|
||
|
||
采用分层命名空间模型:
|
||
|
||
| 范围 | 用途 |
|
||
| --- | --- |
|
||
| 租户(Tenant) | 计费、法律归属、顶层隔离。 |
|
||
| 工作空间(Workspace) | 租户内的协作和产品工作区。 |
|
||
| 命名空间(Namespace) | 机器人、处理器、运行时 token、资源和日志的可部署隔离边界。自托管部署可以只有一个默认命名空间。 |
|
||
| 机器人范围 | 平台适配器实例和事件路由表。 |
|
||
| 处理器范围 | Agent、Pipeline、Workflow 及相关配置。 |
|
||
| 运行时范围 | 插件运行时、runner 注册、lease 和执行权限。 |
|
||
| 资源范围 | 知识库、模型凭据、文件、状态和密钥。 |
|
||
|
||
在 SaaS GA 前,核心持久化对象都应携带 `tenant_id`、`workspace_id` 和 `namespace_id`。自托管部署可以在迁移时种子化一个默认租户/工作空间/命名空间。
|
||
|
||
### 6.2 事件入口隔离
|
||
|
||
每个入站事件都必须先解析命名空间,再进行路由匹配:
|
||
|
||
```text
|
||
adapter ingress -> tenant/workspace/namespace resolution -> event normalization -> event log append -> route match -> processor run
|
||
```
|
||
|
||
Webhook 和回调端点应编码或查找命名空间范围内的适配器安装。来自一个命名空间的平台事件,绝不能匹配另一个命名空间的路由,即使适配器名称、机器人名称或原始平台 ID 发生碰撞。
|
||
|
||
### 6.3 路由目标规则
|
||
|
||
运行时路由绑定可以使用已安装 UUID,但导出的路由模板必须使用逻辑引用。在 SaaS 中:
|
||
|
||
- 默认情况下,机器人路由只能指向同一命名空间内的处理器;
|
||
- 跨命名空间目标默认禁止,除非由策略明确共享;
|
||
- Pipeline 目标仍然只允许处理消息;
|
||
- 路由冲突评估应限制在命名空间内;
|
||
- 路由审计事件必须包含租户、工作空间、命名空间、机器人、路由、目标和 run 标识。
|
||
|
||
### 6.4 运行时和插件隔离
|
||
|
||
插件运行时和 runner 注册表需要命名空间范围的授权:
|
||
|
||
- 运行时注册 token 只作用于一个命名空间,或显式允许的一组命名空间;
|
||
- runner 发现结果按命名空间权限过滤;
|
||
- lease 和 heartbeat 按命名空间隔离;
|
||
- run-scoped API token 不能访问 run 所在命名空间之外的对象;
|
||
- 插件存储、状态和临时文件的 storage key 应包含命名空间;
|
||
- 早期 SaaS 可以接受共享运行时,但每个 API 调用都必须被 scoped 并审计;
|
||
- 企业或高风险租户应支持专用运行时。
|
||
|
||
### 6.5 密钥、资源和状态
|
||
|
||
密钥和资源不能全局寻址:
|
||
|
||
- 适配器凭据存放在命名空间范围的密钥存储中;
|
||
- 模型提供商凭据可以根据策略按租户/工作空间/命名空间设定范围;
|
||
- 知识资源声明允许哪些命名空间使用;
|
||
- Agent 持久状态按租户/工作空间/命名空间/处理器分区,除非共享策略另有规定;
|
||
- 事件日志和会话记录按命名空间隔离,并受保留策略约束。
|
||
|
||
### 6.6 Marketplace 和已安装资产
|
||
|
||
Marketplace 包可见性不等于已安装资产可见性:
|
||
|
||
- Marketplace 包可以是公开、租户私有或工作空间私有;
|
||
- 安装会创建命名空间本地资产,或命名空间本地引用;
|
||
- 已安装处理器和路由模板默认复制,避免意外跨租户变更;
|
||
- 更新必须显式且可审计。
|
||
|
||
### 6.7 SaaS 测试要求
|
||
|
||
SaaS beta 前必须验证:
|
||
|
||
- 租户 A 的事件不能匹配租户 B 的路由;
|
||
- 命名空间 A 的运行时不能 claim 命名空间 B 的 run;
|
||
- 命名空间 A 的处理器不能读取命名空间 B 的资源;
|
||
- Solution 导入不能保留源租户 UUID 或密钥;
|
||
- 路由重放不能暴露另一个命名空间的原始事件 payload;
|
||
- 管理员可以查看审计轨迹,但不能访问密钥值。
|
||
|
||
## 7. 发布计划
|
||
|
||
### Phase 0:技术收敛
|
||
|
||
目标:证明合并分支可以基于事件绑定和外置 runner 运行。
|
||
|
||
必要门禁:
|
||
|
||
- 机器人事件路由以 `event_bindings` 作为唯一路由来源。
|
||
- 旧机器人 pipeline 路由字段已移除或迁移。
|
||
- Pipeline 可作为只处理消息的处理器运行。
|
||
- Agent runner 插件冒烟测试通过,覆盖 local runner 和 Dify runner。
|
||
- 迁移命名和 downgrade 路径有效。
|
||
- 主 UI 不再在面向用户的适配器名称中暴露 “EBA”。
|
||
|
||
### Phase 1:面向技术用户的私有 Beta
|
||
|
||
目标:让贡献者和早期自托管用户可用。
|
||
|
||
必要门禁:
|
||
|
||
- 文档和 UI 中存在适配器能力矩阵;
|
||
- 路由编辑器会过滤不兼容目标;
|
||
- runner/plugin 健康检查可见;
|
||
- local Agent 和 Dify Agent 有引导式配置路径;
|
||
- 每条路由有运行轨迹;
|
||
- 废弃适配器被一致标记;
|
||
- 失败信息能指出失败层级。
|
||
|
||
### Phase 2:面向非技术用户的产品 Beta
|
||
|
||
目标:让用户无需阅读架构文档也能完成常见场景。
|
||
|
||
必要门禁:
|
||
|
||
- 首次使用机器人向导从用例和频道开始;
|
||
- 事件预设默认隐藏原始事件模式;
|
||
- 存在路由模拟或测试事件能力;
|
||
- 存在常见处理器模板;
|
||
- 冲突警告和兜底行为清晰;
|
||
- 文档先使用产品语言,再介绍高级术语;
|
||
- SaaS 命名空间 schema 已实现,或已经具备迁移准备。
|
||
|
||
### Phase 3:SaaS Beta
|
||
|
||
目标:安全地为多个租户运行产品。
|
||
|
||
必要门禁:
|
||
|
||
- 所有路由、运行时、状态、日志和资源事实都具备租户/工作空间/命名空间字段;
|
||
- 命名空间范围的运行时注册和 run claim 已强制执行;
|
||
- 命名空间范围的密钥和适配器安装已强制执行;
|
||
- 路由匹配和审计限制在命名空间内;
|
||
- 配额、保留策略和管理员审计界面存在;
|
||
- 自托管默认命名空间迁移已有文档。
|
||
|
||
### Phase 4:GA
|
||
|
||
目标:让产品具备广泛采用所需的可靠性。
|
||
|
||
必要门禁:
|
||
|
||
- Solution 导出/导入已实现,并支持依赖和变量解析;
|
||
- Marketplace 分发支持命名空间本地安装;
|
||
- 跨命名空间共享策略是显式的;
|
||
- 安全评审覆盖适配器、运行时 token、runner API、密钥、日志和路由重放;
|
||
- 升级和回滚流程已有文档;
|
||
- 产品遥测可以衡量上手流失和路由失败类别。
|
||
|
||
## 8. 验收清单
|
||
|
||
只有满足以下条件,才可以认为发布版本达到产品就绪:
|
||
|
||
- 非技术用户可以连接一个受支持频道,选择场景,绑定处理器,测试它,并在不编辑原始 JSON 的情况下理解结果;
|
||
- 产品 UI 在主要流程中避免使用 EBA 这类内部术语;
|
||
- 机器人页面负责平台事件路由,处理器页面负责可复用的 Agent 与 Pipeline;
|
||
- Pipeline 仍作为无代码消息处理器可见,并且不会出现在非消息事件目标中;
|
||
- 同一个机器人的不同事件可以路由到不同处理器类型;
|
||
- 路由失败能按层级解释;
|
||
- 命名空间隔离通过 schema、service check、运行时 token、storage key 和测试强制执行;
|
||
- 导出/导入实现后,使用带路由模板的 Solution 包,而不是具体机器人绑定。
|
||
|
||
## 9. 待决策问题
|
||
|
||
- 组合处理器入口统一使用 “Processor / 处理器”;Agent 与 Pipeline 是其中平级的类型。
|
||
- Workflow 应作为独立持久化处理器类型,还是作为 Agent runner 类别。
|
||
- SaaS 命名空间初期是否与工作空间一一映射,还是高级租户在首个 SaaS beta 就需要一个工作空间下多个命名空间。
|
||
- 哪些适配器允许在 SaaS 共享运行时中运行,哪些需要专用运行时隔离。
|
||
- 未来 Solution 导出/导入的确切包格式。
|