# 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 导出/导入的确切包格式。
