Skip to content

架构总览 ​

VanBotJS 采用适配器模式:每个平台一个适配器,负责「协议 ⇄ 统一内部模型」的转换;所有兼容性 / 标准化业务下沉到内核,插件只写业务。

┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│  QQ / OneBot │   │  微信公众号    │   │ B站直播间     │
│  ws / http   │   │  http 回调    │   │  wss 弹幕     │
└──────┬───────┘   └──────┬───────┘   └──────┬───────┘
┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│ QQ官方机器人   │   │  Telegram    │   │ KOOK/Discord │
└──────┬───────┘   └──────┬───────┘   └──────┬───────┘
       │  统一事件 BotEvent │                  │
       └─────────┬────────┴──────────────────┘
                 ▼
    内核归一化(traceId / ID字符串 / 能力集 / 未知段占位)
                 ▼
        globalBus (事件总线) + 中间件(快照)
                 ▼
     PluginManager → plugin/*.ts(definePlugin.onEvent)
                 ▼
   内核发送降级(applySendFallback)→ bot.callApi("send_msg", …)
                 ▼
   各适配器 callApi() 把消息翻译回平台并发送

职责划分 ​

适配器(协议翻译) ​

只做原始协议 ⇄ 内部 BotEvent / MessageSegment 的转换,以及 callApi 把统一动作翻译成平台 API。不做兼容业务,不处理降级。

内核(复杂度下沉) ​

  • 事件归一化:traceId / ID 字符串化 / 时间统一 / 未知段占位 / 能力集;
  • 中间件(快照追踪);
  • 发送降级流水线;
  • 插件管理(加载 / 热插拔 / 热重载)。

插件(纯业务) ​

通过 definePlugin 声明元数据、监听事件、用 ctx.reply 回复、注册 Skill、调用受控代理 API。禁止硬编码平台字符串,只能判断能力标记。

统一发送 ​

插件不区分平台:群聊传 groupId,私聊传 userId,统一走 send_msg;能力不支持的段由内核自动降级。

Just run の Bot · 一套插件,全平台机器人