Auto-Reply 管道

一句话概括

Auto-Reply 管道是入站消息到 LLM 调用之间的决策引擎 — 它解析命令、解析指令、门控 agent 执行、管理流式传输,并投递回复。

职责

  • 将入站消息通过多阶段决策管道分发
  • 解析斜杠命令(/help/new/model/think/status 等)
  • 解析指令(thinking level、verbose、reasoning、elevated)并持久化到会话
  • 决定是否触发 LLM 调用或本地处理消息
  • 编排 agent 执行并支持模型降级链
  • 管理流式传输(部分回复、块回复、工具结果、推理)
  • 处理跨渠道路由(如 Telegram 消息由 Slack 会话处理)
  • 配置启用时对出站 payload 应用 TTS

架构图

关键源码文件

文件行数角色
src/auto-reply/dispatch.ts97入口dispatchInboundMessage(),dispatcher 生命周期
src/auto-reply/reply/dispatch-from-config.ts510核心路由器:去重、hooks、终止、跨渠道路由、TTS、投递
src/auto-reply/reply/agent-runner-execution.ts586Agent 执行器runAgentTurnWithFallback(),流式、错误恢复、模型降级
src/auto-reply/reply.ts447回复入口,agent 轮次编排
src/auto-reply/thinking.ts227Thinking/verbose/reasoning/elevated 级别类型和归一化
src/auto-reply/tokens.ts40特殊 token:HEARTBEAT_OKNO_REPLY
src/auto-reply/reply/directive-handling.*.ts指令解析、持久化、级别解析
src/auto-reply/reply/commands.ts~600命令路由和执行
src/auto-reply/reply/block-reply-pipeline.ts块流式管道

数据流

入站

Channel Plugin(归一化消息)

dispatch.ts — dispatchInboundMessage()

dispatch-from-config.ts — dispatchReplyFromConfig()

  ├── 1. shouldSkipDuplicateInbound() → 重复则跳过
  ├── 2. 触发插件 hooks(message_received)
  ├── 3. 快速终止检查(stop 命令)
  ├── 4. 跨渠道路由(如果消息来源 ≠ 会话渠道)
  ├── 5. getReplyFromConfig()
  │     ├── 会话初始化(创建或加载)
  │     ├── 命令检测 + 授权
  │     ├── 指令解析(/think:high、/verbose:on)
  │     ├── 如果纯指令 → 返回确认,不调 LLM
  │     ├── 内联动作(/status、/info、/reset)
  │     └── runPreparedReply() → agent 执行
  └── 6. 后处理(TTS、投递、诊断)

跳过条件(不调 LLM)

管道在以下情况跳过 LLM 调用:

  • 消息归一化后为空(且无媒体)
  • 检测到未授权的控制命令
  • 纯指令消息(如仅 /think:high
  • 内联命令已直接处理(如 /status
  • 快速终止被触发(stop 命令)
  • 检测到重复消息

出站

Agent 执行结果(payloads)

剥离游离的 HEARTBEAT_OK token

过滤 NO_REPLY 静默 token

应用 TTS(如已配置)

路由到目标渠道

ReplyDispatcher.sendFinalReply()

Token 优化影响

机制Token 影响详情
门控避免不必要的 LLM 调用命令处理、纯指令消息、去重 — 全部跳过昂贵的 LLM 调用
Thinking level 控制每次调用可变开销xhigh 思考消耗的 token 远多于 off;自动降级防止浪费
模型降级失败时重试成本失败调用在降级前消耗 token;管道尽量减少浪费
流式无直接 token 影响流式不改变 token 数量,但块管道影响感知延迟

Thinking level 层级

解析顺序(首个命中):
  1. 内联指令(/think:high)
  2. 会话持久化级别
  3. Agent 配置默认值
  4. 模型特定默认值

级别:off < minimal < low < medium < high < xhigh
  - xhigh:仅 GPT-5.x codex 模型
  - 二元 provider(Z.ai):仅 on/off
  - 模型不支持时自动降级

错误恢复(agent-runner-execution.ts)

错误恢复方式会话影响
上下文溢出重置会话丢失历史
压缩失败重置会话丢失历史
角色排序冲突重置会话丢失历史
Gemini 函数调用排序重置会话丢失历史
临时 HTTP 错误(502/521)延迟后重试一次无会话影响
模型不支持降级到下一模型无会话影响

与其他模块的关系

  • 依赖

    • agents/pi-embedded-runner/runEmbeddedPiAgent() 用于执行
    • sessions/ — 会话条目管理、模型/级别覆盖
    • config/ — agent 配置、模型解析
    • channels/ — 跨渠道路由、输入指示器
    • skills/ — skill 命令处理
    • memory/ — 回复后记忆刷新
  • 被依赖

    • gateway/ — 接收分发的消息
    • cron/ — 使用隔离 agent 执行路径
    • Channel plugins — 触发 dispatchInboundMessage()

我的认知盲区

  • 完整命令注册表 — 有多少命令以及哪些能短路 LLM 调用
  • 块回复管道内部 — 合并策略和块大小
  • 群聊激活逻辑 — agent 如何决定是否在群聊中响应
  • reply/queue/ — 用于速率限制或排序的消息队列
  • 精确的流式回调顺序和竞态条件处理
  • followup-runner.ts — 何时以及如何触发后续运行
  • elevated-allowlist-matcher.ts — 提权权限解析

相关贡献

  • 暂无

变更频率

  • dispatch-from-config.ts:高 — 路由逻辑、hooks 和投递随新功能演进
  • agent-runner-execution.ts:高 — 随边缘情况发现添加错误恢复模式
  • thinking.ts:中 — 新模型发布时添加新 thinking level 或 provider 特定处理
  • dispatch.ts:低 — 薄入口层,很少变更
  • tokens.ts:低 — token 常量稳定