数据截至 (上游 commit 7803d562546a)
LangBot 是什么 + 全景与阅读地图
30 秒导读: LangBot 是一个开源、生产级的「把大模型/Agent 接到聊天软件」的平台。你写好一个 AI 机器人,它负责把这个机器人同时上架到 Discord、Telegram、Slack、微信、QQ、飞书、钉钉等十几个平台;一个进程内就包办了 HTTP 服务、Web 管理面板、各平台协议适配、消息流水线、插件、知识库(RAG)、沙箱和 MCP。本章讲大盘——它是什么、整体怎么转、有哪些部件、以及后面 01–05 章各讲什么。
1. 这是什么(零基础也能懂)
一句话定义: LangBot 是一个生产级 IM(即时通讯)机器人平台——它站在「大模型」和「聊天软件」中间,把前者接到后者上去。
它解决谁的什么问题。 假设你想做一个客服机器人:用 DeepSeek 或 GPT 回答问题,还要能查你的知识库。麻烦在于——你的用户分散在很多个聊天平台:有人用微信,有人用 Discord,公司内部用飞书/钉钉。每个平台的接入协议、消息格式、鉴权方式都不一样。
如果自己从零做,你要为每个平台写一遍「收消息 → 调模型 → 发回去」,还要各自处理限流、权限、敏感词、多轮上下文、掉线重连……LangBot 把这些一次性做完:你只配置「用哪个模型、接哪些平台、走什么流程」,它负责剩下的脏活。
它能做什么(核心能力):
- 多平台接入 —— 一套代码适配 Discord / Telegram / Slack / LINE / QQ / 微信 / 企业微信 / 飞书 / 钉钉 / KOOK / Matrix / 邮件等(见 README 的 Supported Platforms 表)。
- AI 对话与 Agent —— 多轮对话、工具调用(tool calling)、多模态、流式输出;内置 RAG 知识库,并能对接 Dify / Coze / n8n / Langflow 等外部工作流。
- 生产特性 —— 访问控制、限流、敏感词过滤、监控、异常处理。
- 可视化管理 —— 浏览器里的 Web 面板配置一切,不用手改 YAML。
- 可扩展 —— 插件生态 + 组件扩展 + MCP 协议支持。
用起来什么样。 最小启动就是一行命令(README「One-Line Launch」):
uvx langbot
# 然后打开 http://localhost:5300 —— 在 Web 面板里配模型、接平台、建流水线
一个进程起来后,它自己就是一个 HTTP 服务(默认 :5300)、带一个 React 写的 Web 管理面板、并同时挂着你配置的那些平台适配器。
一句话直觉/类比: 把 LangBot 想成一台多制式的信号中继站。左边接了十几种「制式」不同的聊天网络(每种一根适配器天线),右边接了大模型和工具;中间是一条可配置的流水线,负责把进来的每条消息按你定的规则处理后再原路发回。你只调「用哪根天线、走哪条流水线」,不碰底层协议。
事实核对:
name = "langbot"、version = "4.10.4"、description = "Production-grade platform for building agentic IM bots",见pyproject.toml:2-4。依赖群也印证了它的定位——各 IM SDK(discord-py、python-telegram-bot、slack-sdk、lark-oapi、dingtalk-stream、line-bot-sdk、matrix-nio…)、模型 SDK(openai、anthropic、ollama、dashscope…)、向量库(chromadb、qdrant-client、pymilvus)、以及自家的langbot-plugin==0.4.6,见pyproject.toml:7-96。
2. 顶层全景(它大概怎么转)
本节给一张主线骨架图 + 各部件职责表 + 主线走一遍。只讲大盘,不进单个机制的代码(细节留给 01–05 章)。
2.1 主线骨架:Runtime Graph
ARCHITECTURE.md 明确说「最有用的心智模型是这张图」(见 ARCHITECTURE.md 的 The Runtime Graph 一节)。它就是一条消息从平台进来、到回复出去的主干道。
怎么读这张图: 从上到下是一条入站消息的处理顺序;每个方框是一个长生命周期部件,箭头是「交给下一棒」。左侧标注了这一步大概在做什么。
┌─────────────────────────┐
平台事件 │ 平台适配器 (sources/*) │ 把 Discord/微信/… 的原始事件
─────► │ AbstractAdapter │ 翻译成统一的消息/事件实体
└────────────┬────────────┘
▼
┌─────────────────────────┐
每个 bot │ RuntimeBot (botmgr) │ 套用路由规则:丢弃 / 推 webhook /
一个实例 │ │ 交给聚合器
└────────────┬────────────┘
▼
┌─────────────────────────┐
攒一攒 │ MessageAggregator │ 按会话批量/归一化,组装成一个 Query
└────────────┬────────────┘
▼
┌─────────────────────────┐
排队 │ QueryPool │ 待处理 Query 的队列 + 在途缓存
└────────────┬────────────┘
▼
┌─────────────────────────┐
调度 │ Controller │ 受全局并发 + 单会话并发约束地取 Query
└────────────┬────────────┘
▼
┌─────────────────────────┐
跑流程 │ RuntimePipeline │ 把 DB 里的流水线配置物化成一条
│ → PipelineStage 责任链 │ 「阶段责任链」,逐段处理(支持生成器分叉)
└────────────┬────────────┘
▼
┌───────────────────────────────────────────────┐
│ RequestRunner / ToolManager / │ 聊天阶段:发插件事件、
│ PluginRuntimeConnector / BoxService │ 跑 Agent 循环、调工具
└────────── ──────────┬──────────────────────────┘
▼
原路经适配器把回复发回平台
HTTP/Web 面板和 MCP 是平行的入口,它们不走上面这条消息主干,而是直接调同一套 service 层:
HTTP 客户端 / Web UI ─► Quart 路由组 ─► api/http/service/* ─► Application 管理器 / 持久化 / 运行时连接器
MCP 客户端 ─► /mcp 挂载点 ─► api/mcp/server.py 里的工具 ─► 同一套 service 层
2.2 部件一句话职责
下表是上图各方框的职责和落点。所有部件都是长生命周期的,统一挂在 Application 这个「服务定位器」上(见 §2.4)。
| 部件 | 干什么(一句话) | 类 / 文件:行 |
|---|---|---|
| 平台适配器 | 把某个平台的原始事件翻译成统一消息/事件实体 | src/langbot/pkg/platform/sources/*,基类来自 SDK AbstractMessagePlatformAdapter |
| RuntimeBot | 一个已配置 bot 的运行实例;套路由规则、记事件、推 webhook、管适配器生命周期 | RuntimeBot src/langbot/pkg/platform/botmgr.py:35 |
| PlatformManager | 管理所有 RuntimeBot,统一启动/停止适配器 | PlatformManager src/langbot/pkg/platform/botmgr.py:523 |
| MessageAggregator | 按会话把多条消息批量/归一化后,add_query 进池 | MessageAggregator src/langbot/pkg/pipeline/aggregator.py:64 |
| QueryPool | 存待处理的 Query,并缓存在途 Query(供插件向后兼容调用) | QueryPool src/langbot/pkg/pipeline/pool.py:114 |
| Controller | 调度 Query 处理,强制全局/单会话并发上限 | Controller src/langbot/pkg/pipeline/controller.py:14 |
| RuntimePipeline | 把 DB 流水线配置物化成运行时阶段链,用责任链执行器跑(支持生成器阶段) | RuntimePipeline src/langbot/pkg/pipeline/pipelinemgr.py:67 |
| PipelineManager | 从 DB 加载各条流水线、注册阶段字典 | PipelineManager src/langbot/pkg/pipeline/pipelinemgr.py:488 |
| ChatMessageHandler | 主 LLM 对话阶段:发插件事件、调 RequestRunner、处理流式/非流式、记遥测、追加历史 | ChatMessageHandler src/langbot/pkg/pipeline/process/handlers/chat.py:48 |
| RequestRunner | 具体「怎么问模型」的执行器(本地 Agent / 各外部工作流) | LocalAgentRunner src/langbot/pkg/provider/runners/localagent.py:159(@runner.runner_class('local-agent')) |
| ToolManager | 聚合四来源工具(原生 / 插件 / 外部 MCP / 技能),供 Runner 调用 | ToolManager src/langbot/pkg/provider/tools/toolmgr.py:26 |
| PluginRuntimeConnector | 通过 stdio/WebSocket 连到插件运行时(langbot-plugin-sdk) | PluginRuntimeConnector src/langbot/pkg/plugin/connector.py:154 |
| BoxService | 沙箱子系统门面:exec、会话、托管进程、技能 CRUD、配额、挂载 | BoxService src/langbot/pkg/box/service.py:102 |
| HTTPController | 建 Quart app、注册路由组、服务 SPA、用 MCP dispatcher 包 ASGI | HTTPController src/langbot/pkg/api/http/controller/main.py:62 |
| LangBotMCPServer | 在 /mcp 暴露一个精选的 agent 面向工具子集 | LangBotMCPServer src/langbot/pkg/api/mcp/server.py:58 |
2.3 主线走一遍(高层,不进代码)
一条消息端到端的旅程(细节见 01):
- 进 —— 某平台的 SDK 回调触发,
src/langbot/pkg/platform/sources/下的适配器把平台专有事件转成 LangBot 的统一消息/事件实体。 - 路由 ——
RuntimeBot套用流水线路由规则,决定:丢弃、推 webhook、还是交给消息聚合器(botmgr.py:475RuntimeBot.run起的适配器循环喂进来的) 。 - 聚合入队 ——
MessageAggregator按会话批量/归一化,add_query把一个Query放进QueryPool(aggregator.py:141/215/230)。 - 调度 ——
Controller在全局并发和单会话并发约束下取出 Query 交给流水线(controller.py:183run→consumer)。 - 跑流水线 ——
RuntimePipeline把该会话配置的阶段物化成一条责任链,逐段执行;责任链支持生成器阶段(某阶段可以yield多个中间结果,分叉出后续执行),这是流式/多轮的基础(pipelinemgr.py:286_execute_from_stage)。 - 对话核心 —— 聊天阶段
ChatMessageHandler发插件事件、调用配置的RequestRunner、处理流式/非流式回复、记遥测、追加对话历史。本地 Agent 循环在此调工具(细节见 03、04)。 - 出 —— 输出阶段把文本/卡片/分片/文件/错误提示,原路经最初那个平台适配器发回去。
注册机制的暗线:流水线的阶段、加载器、runner、适配器都靠装饰器 + 包导入副作用预注册(如
@runner.runner_class('local-agent'))。加新东西时要用对应的预注册机制,别另起一套注册表(见ARCHITECTURE.mdMessage Flow 末段)。