1. 目标问题
当前 NeoCode 已有 Gateway 对外协议,但缺少“飞书作为第三方入口”的标准接入方案,导致:
- 外部消息入口与 NeoCode 运行链路未统一。
- 事件回流、异常处理、重连恢复缺少一致约定。
- 协议升级时第三方客户端兼容风险高。
本 RFC 目标是定义一套可落地、可恢复、可演进的飞书接入方案。
2. 现状与边界
2.1 现状
- Gateway 已提供稳定核心方法:
authenticate/ping/bindStream/run/cancel/list/load/resolvePermission/event。
gateway.run 为异步受理模型,最终态依赖 gateway.event。
- 错误语义已标准化(
gateway_code),并有兼容性规范(Stable/Experimental)。
2.2 边界分工(必须遵守)
- 飞书适配器:负责飞书协议、签名校验、幂等去重、消息编排与回写。
- Gateway:负责鉴权、ACL、协议归一、路由转发、事件中继。
- Runtime:负责推理执行、工具调用、权限请求与结果事件生成。
- 非目标:不在 Gateway 内实现飞书逻辑;不把 Gateway 暴露公网;主链路不依赖
wake.openUrl。
3. 核心设计
3.1 方案选择
采用“飞书适配器进程 + Gateway WS 长连接”模式。
3.2 为什么是这个方案
- 与现有第三方接入手册完全一致,复用稳定 RPC 契约。
WS 可同时承载请求与 gateway.event,适合飞书流式回写。
- 最小侵入:不改 Gateway/Runtime 核心行为,交付风险低。
- 兼容可控:只依赖 Stable Core,避免 Experimental 波动。
3.3 协议流程(强约束)
- 连接
GET /ws
gateway.authenticate
gateway.bindStream(session_id, run_id?)
gateway.run(...)
- 消费
gateway.event(以 run_done/run_error 判终态)
- 用户中断时
gateway.cancel(run_id)
- 权限场景走
gateway.resolvePermission
3.4 关键数据模型
session_id:hash(app_id:chat_id:thread_id)(稳定映射会话上下文)。
run_id:每条飞书触发消息唯一(ULID/UUID),用于取消与追踪。
request_id:每次 RPC 唯一。
- 幂等键:飞书
event_id。
3.5 异常与恢复策略
- 以
gateway_code 做错误分支主键,不依赖 message 文本。
- 重连顺序固定:
reconnect -> authenticate -> bindStream。
run accepted 后若长时间无终态事件,触发超时告警并执行兜底取消/补偿逻辑。
4. 落地清单
Phase 1(MVP)
- 实现飞书适配器进程骨架(配置、日志、健康检查)。
- 打通 WS +
authenticate/bindStream/run/event 闭环。
- 支持文本请求与最终答复回写。
Phase 2(可靠性)
- 增量流式回写(chunk 聚合 + 节流)。
- 支持
cancel(run_id)。
- 接入错误字典分级处理与重试策略。
Phase 3(交互完善)
- 权限审批卡片(请求->用户决策->
resolvePermission)。
- 事件幂等去重与重放保护。
- 指标与告警(终态超时、连接抖动、鉴权失败)。
Phase 4(生产化)
- 多群/多租户路由策略。
- 升级兼容回归(双版本)。
- 运维手册与故障演练脚本。
5. 验收标准
5.1 正常路径
- 飞书消息可触发
gateway.run 并收到 run accepted。
gateway.event 持续回流,最终收到 run_done。
- 回写内容与 run/session 对应关系正确(无串话)。
5.2 异常路径
- 缺 token/错误 token 时返回
unauthorized,且不进入执行。
- 参数缺失或非法字段返回
missing_required_field/invalid_frame/invalid_action。
- Runtime 超时返回
timeout,客户端执行退避重试或失败收敛。
- ACL 拒绝返回
access_denied,客户端不盲重试。
5.3 恢复路径
- 网关断连后可自动重连并完成
authenticate + bindStream 恢复。
- 恢复后新请求可正常执行,旧 run 的状态可查询或有明确终止策略。
- 连接恢复过程中无重复执行(幂等有效)。
6. 风险与回滚
6.1 主要风险
- 事件消费背压导致延迟或断连。
- 第三方参数不规范导致高比例请求失败。
- 升级造成字段兼容偏差。
- token 泄露带来安全风险。
6.2 风险缓解
- 请求协程与事件协程解耦,回写节流与队列监控。
- 接入前置参数校验层,严格对齐 RPC Schema。
- 仅依赖 Stable Core;忽略未知字段;上线前双版本回归。
- token 仅本地安全存储,日志脱敏,定期轮换。
6.3 回滚方案
- 保留飞书适配器功能开关(按租户/群维度关闭)。
- 回滚到“仅同步结果模式”(关闭流式)。
- 必要时完全切回人工/旧机器人链路,不影响 Gateway 主服务。
- 回滚后保留 run/session 审计日志用于问题复盘。
1. 目标问题
当前 NeoCode 已有 Gateway 对外协议,但缺少“飞书作为第三方入口”的标准接入方案,导致:
本 RFC 目标是定义一套可落地、可恢复、可演进的飞书接入方案。
2. 现状与边界
2.1 现状
authenticate/ping/bindStream/run/cancel/list/load/resolvePermission/event。gateway.run为异步受理模型,最终态依赖gateway.event。gateway_code),并有兼容性规范(Stable/Experimental)。2.2 边界分工(必须遵守)
wake.openUrl。3. 核心设计
3.1 方案选择
采用“飞书适配器进程 + Gateway WS 长连接”模式。
3.2 为什么是这个方案
WS可同时承载请求与gateway.event,适合飞书流式回写。3.3 协议流程(强约束)
GET /wsgateway.authenticategateway.bindStream(session_id, run_id?)gateway.run(...)gateway.event(以run_done/run_error判终态)gateway.cancel(run_id)gateway.resolvePermission3.4 关键数据模型
session_id:hash(app_id:chat_id:thread_id)(稳定映射会话上下文)。run_id:每条飞书触发消息唯一(ULID/UUID),用于取消与追踪。request_id:每次 RPC 唯一。event_id。3.5 异常与恢复策略
gateway_code做错误分支主键,不依赖 message 文本。reconnect -> authenticate -> bindStream。run accepted后若长时间无终态事件,触发超时告警并执行兜底取消/补偿逻辑。4. 落地清单
Phase 1(MVP)
authenticate/bindStream/run/event闭环。Phase 2(可靠性)
cancel(run_id)。Phase 3(交互完善)
resolvePermission)。Phase 4(生产化)
5. 验收标准
5.1 正常路径
gateway.run并收到run accepted。gateway.event持续回流,最终收到run_done。5.2 异常路径
unauthorized,且不进入执行。missing_required_field/invalid_frame/invalid_action。timeout,客户端执行退避重试或失败收敛。access_denied,客户端不盲重试。5.3 恢复路径
authenticate + bindStream恢复。6. 风险与回滚
6.1 主要风险
6.2 风险缓解
6.3 回滚方案