Skip to content

RFC Proposal:gateway与飞书接入探讨方案 #424

@creatang

Description

@creatang

1. 目标问题

当前 NeoCode 已有 Gateway 对外协议,但缺少“飞书作为第三方入口”的标准接入方案,导致:

  1. 外部消息入口与 NeoCode 运行链路未统一。
  2. 事件回流、异常处理、重连恢复缺少一致约定。
  3. 协议升级时第三方客户端兼容风险高。

本 RFC 目标是定义一套可落地、可恢复、可演进的飞书接入方案。

2. 现状与边界

2.1 现状

  1. Gateway 已提供稳定核心方法:authenticate/ping/bindStream/run/cancel/list/load/resolvePermission/event
  2. gateway.run 为异步受理模型,最终态依赖 gateway.event
  3. 错误语义已标准化(gateway_code),并有兼容性规范(Stable/Experimental)。

2.2 边界分工(必须遵守)

  1. 飞书适配器:负责飞书协议、签名校验、幂等去重、消息编排与回写。
  2. Gateway:负责鉴权、ACL、协议归一、路由转发、事件中继。
  3. Runtime:负责推理执行、工具调用、权限请求与结果事件生成。
  4. 非目标:不在 Gateway 内实现飞书逻辑;不把 Gateway 暴露公网;主链路不依赖 wake.openUrl

3. 核心设计

3.1 方案选择

采用“飞书适配器进程 + Gateway WS 长连接”模式。

3.2 为什么是这个方案

  1. 与现有第三方接入手册完全一致,复用稳定 RPC 契约。
  2. WS 可同时承载请求与 gateway.event,适合飞书流式回写。
  3. 最小侵入:不改 Gateway/Runtime 核心行为,交付风险低。
  4. 兼容可控:只依赖 Stable Core,避免 Experimental 波动。

3.3 协议流程(强约束)

  1. 连接 GET /ws
  2. gateway.authenticate
  3. gateway.bindStream(session_id, run_id?)
  4. gateway.run(...)
  5. 消费 gateway.event(以 run_done/run_error 判终态)
  6. 用户中断时 gateway.cancel(run_id)
  7. 权限场景走 gateway.resolvePermission

3.4 关键数据模型

  1. session_idhash(app_id:chat_id:thread_id)(稳定映射会话上下文)。
  2. run_id:每条飞书触发消息唯一(ULID/UUID),用于取消与追踪。
  3. request_id:每次 RPC 唯一。
  4. 幂等键:飞书 event_id

3.5 异常与恢复策略

  1. gateway_code 做错误分支主键,不依赖 message 文本。
  2. 重连顺序固定:reconnect -> authenticate -> bindStream
  3. run accepted 后若长时间无终态事件,触发超时告警并执行兜底取消/补偿逻辑。

4. 落地清单

Phase 1(MVP)

  1. 实现飞书适配器进程骨架(配置、日志、健康检查)。
  2. 打通 WS + authenticate/bindStream/run/event 闭环。
  3. 支持文本请求与最终答复回写。

Phase 2(可靠性)

  1. 增量流式回写(chunk 聚合 + 节流)。
  2. 支持 cancel(run_id)
  3. 接入错误字典分级处理与重试策略。

Phase 3(交互完善)

  1. 权限审批卡片(请求->用户决策->resolvePermission)。
  2. 事件幂等去重与重放保护。
  3. 指标与告警(终态超时、连接抖动、鉴权失败)。

Phase 4(生产化)

  1. 多群/多租户路由策略。
  2. 升级兼容回归(双版本)。
  3. 运维手册与故障演练脚本。

5. 验收标准

5.1 正常路径

  1. 飞书消息可触发 gateway.run 并收到 run accepted
  2. gateway.event 持续回流,最终收到 run_done
  3. 回写内容与 run/session 对应关系正确(无串话)。

5.2 异常路径

  1. 缺 token/错误 token 时返回 unauthorized,且不进入执行。
  2. 参数缺失或非法字段返回 missing_required_field/invalid_frame/invalid_action
  3. Runtime 超时返回 timeout,客户端执行退避重试或失败收敛。
  4. ACL 拒绝返回 access_denied,客户端不盲重试。

5.3 恢复路径

  1. 网关断连后可自动重连并完成 authenticate + bindStream 恢复。
  2. 恢复后新请求可正常执行,旧 run 的状态可查询或有明确终止策略。
  3. 连接恢复过程中无重复执行(幂等有效)。

6. 风险与回滚

6.1 主要风险

  1. 事件消费背压导致延迟或断连。
  2. 第三方参数不规范导致高比例请求失败。
  3. 升级造成字段兼容偏差。
  4. token 泄露带来安全风险。

6.2 风险缓解

  1. 请求协程与事件协程解耦,回写节流与队列监控。
  2. 接入前置参数校验层,严格对齐 RPC Schema。
  3. 仅依赖 Stable Core;忽略未知字段;上线前双版本回归。
  4. token 仅本地安全存储,日志脱敏,定期轮换。

6.3 回滚方案

  1. 保留飞书适配器功能开关(按租户/群维度关闭)。
  2. 回滚到“仅同步结果模式”(关闭流式)。
  3. 必要时完全切回人工/旧机器人链路,不影响 Gateway 主服务。
  4. 回滚后保留 run/session 审计日志用于问题复盘。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions