跳转至

架构总览

普通用户不需要读懂所有细节。如果你想理解"为什么机器人有时候不回复"或"为什么改完配置要重启",这里给你一个大概印象。

消息处理流程

一条消息进入机器人后经过这几步:

  1. 频道白名单:是否允许接收此频道消息。
  2. Assignee 检查:群聊频道是否把 Bot 设为负责人。
  3. 格式转换:平台消息经 Translator 转成内部记录。
  4. Will 判断:决定"先观察"还是"触发回复"。
  5. 模型调用:如果触发,调用模型、执行工具、生成回复。
  6. 分段投递:结果按节奏发回群里。
平台消息
  → Messenger 接收
  → 白名单 + assignee 检查
  → Translator 格式转换
  → ChannelRuntime 入队
  → Will 判断
  → Agent Runtime(模型 + 工具)
  → 分段投递回平台

关键组件

Messenger:消息入口与出口

Messenger 注册 Koishi 中间件,接收平台 Session。它负责:

  • 检查频道白名单和 assignee
  • 选择 Translator 转换消息格式
  • 投递回复,按字符速度 pacing 分段发送
  • 失败时通知 Runtime

Channels:频道存储

每个频道有独立数据目录,保存会话文件、收到的图片、工具生成的文件。Channels 负责创建和管理这些目录。

RuntimeManager:频道运行管理

每个频道有一个 ChannelRuntime。RuntimeManager 按需创建、缓存和销毁它们,保证同一频道不会出现多个互相干扰的回复流程。

ChannelRuntime:消息队列

同一频道的消息按顺序处理。如果机器人正在回复,新消息进入同一对话流程排队,不会开新线程抢回复。

Agent Runtime:模型和工具执行

真正调用模型、执行工具、生成回复的通用运行时。它不关心 Koishi 或具体平台,只处理消息、工具和模型之间的交互。位于 @yesimbot/agent-runtime 包中。

为什么改配置要重启

频道开始时会固定当时的模型、工具和插件设置(Runtime Snapshot)。避免一边聊一边切换底层配置造成混乱,新配置通常等重启后完整生效。

投递失败会怎样

如果回复发送失败,Messenger 会把失败通知同一频道的 ChannelRuntime,让对话流程知道发送未成功。这比假装已发出要好,方便排查问题。