直接把本页全部内容复制粘贴给你的 AI 助手,它即可快速了解 LangBot 的整体架构、各组件如何组织、运行期如何连接,以及如何配置开发环境,无需你再逐条解释。
AGENTS.md(CLAUDE.md 为其软链接)保持一致,是 LangBot 项目面向开发者与 AI 助手的”一页上手”说明。
项目概览
LangBot 是一个开源的、LLM 原生的即时通信机器人开发平台,提供开箱即用的 IM 机器人开发体验,内置 Agent、RAG、MCP 等 LLM 应用能力,支持全球主流 IM 平台,并提供丰富的 API 以供二次开发。 LangBot 拥有完整的 Web 前端,几乎所有操作都可以通过前端完成。- 后端:Python(
>=3.11,<4.0),使用uv管理依赖;Web 框架为 Quart(Flask 的异步版本)。HTTP API 与预编译好的前端都由后端在http://127.0.0.1:5300上提供服务。 - 前端:
web/是 Vite + React Router 7 + shadcn/ui + Tailwind CSS 的 SPA,使用pnpm管理依赖(注意:不是 Next.js,dev脚本就是vite)。 - 插件系统:插件 SDK、CLI(
lbp)、插件运行时、Box 沙箱运行时以及 LangBot 与插件共享的实体/API 定义,全部位于独立仓库langbot-plugin-sdk。LangBot 通过pyproject.toml中固定版本的langbot-plugin包依赖它。
仓库目录结构
组件如何组织
LangBot 后端的核心包src/langbot/pkg/ 按职责拆分为若干子模块,彼此低耦合:
| 模块 | 职责 |
|---|---|
core | 应用生命周期:启动阶段(stages)按序加载配置、连接数据库、拉起各子系统,并管理后台任务。 |
platform | 各 IM 平台的适配器(Discord、Telegram、QQ、企业微信、飞书等),负责收发消息、管理机器人与会话。 |
provider | LLM 提供商与请求器(OpenAI 兼容、各家原生 API),以及供 Agent 调用的工具提供者。 |
pipeline | 消息处理流水线:把一条消息经过触发、AI 处理、输出、安全等阶段串联起来。 |
plugin | LangBot 主程序与插件运行时之间的桥接层,负责连接、收发动作、转发事件。 |
box | 代码沙箱子系统,为技能/工具提供隔离的代码执行环境,按可用性选择 Docker / nsjail / E2B 后端。 |
skill / rag / vector | 技能、检索增强生成与向量存储能力。 |
persistence | ORM 实体定义与 Alembic 数据库迁移,单套脚本同时兼容 SQLite 与 PostgreSQL。 |
langbot-plugin-sdk 中定义,由 lbp comp 生成)则围绕一个 BasePlugin 组织,目前支持六种组件类型:
- Command(命令):用户主动触发的指令(如
!weather tokyo)。 - Tool(工具):供 LLM 在 Agent 执行过程中调用的函数(如查天气、查数据库)。
- EventListener(事件监听器):监听消息流水线中的事件(如自动回复、内容过滤)。
- KnowledgeEngine(知识引擎):自定义知识库的检索/接入实现,供 RAG 使用。
- Parser(解析器):自定义消息/内容的解析处理。
- Page(页面):插件提供的自定义 Web 页面,可嵌入 LangBot 管理面板。
运行期如何连接
- 前端 ↔ 后端:开发时前端独立跑在
:3000,通过web/.env的VITE_API_BASE_URL访问后端:5300;生产环境前端被预编译为静态文件由后端同域提供。 - 后端 ↔ 插件运行时:
- 用户直接启动 LangBot(非容器)时,后端自己拉起运行时并通过 stdio 通信(轻量/个人场景)。stdio 不能自动重连——断开后需重启 LangBot;常见故障是上一个后端遗留的孤儿运行时进程仍占用
5400/5401,杀掉后重启即可。 - LangBot 运行在容器中时,通过 WebSocket 连接到独立的运行时(生产场景)。控制端口默认
5400,调试端口默认5401。相关配置:data/config.yaml的plugin.runtime_ws_url(如ws://langbot_plugin_runtime:5400/control/ws)。
- 用户直接启动 LangBot(非容器)时,后端自己拉起运行时并通过 stdio 通信(轻量/个人场景)。stdio 不能自动重连——断开后需重启 LangBot;常见故障是上一个后端遗留的孤儿运行时进程仍占用
- 后端 ↔ Box 运行时:Box 子系统通过控制通道连接到 Box 运行时(默认端口
5410),运行时在 Docker / nsjail / E2B 中执行沙箱代码。相关配置(data/config.yaml的box:段):box.enabled(总开关)、box.backend('local'/'docker'/'nsjail'/'e2b')、box.runtime.endpoint(外部 Box 运行时地址,如ws://127.0.0.1:5410,留空则本地自动托管)。与插件运行时类似,配置该地址并以--standalone-box启动即可连接外部 Box 运行时。 - 调试运行时、CLI 与 SDK 的完整方法见《调试插件运行时、CLI、SDK》,详细参数与架构在
langbot-plugin-sdk仓库的AGENTS.md中。
开发环境配置
完整说明见《开发配置》。要点如下:后端
data/config.yaml 生成配置文件。默认使用 SQLite(零配置),同时支持 PostgreSQL;迁移在启动时自动执行。
前端
需要 Node.js 与 pnpm。pnpm dev 会读取 web/.env 中的 VITE_API_BASE_URL,使开发态前端能访问后端 :5300。
代码格式化
仓库 CI 会跑 lint + format 检查。安装 pre-commit 钩子,让同样的检查在每次提交前于本地运行:数据库迁移
修改 ORM 模型后生成迁移:autogenerate 能检测 schema 变更(增删列/表、类型变更),但数据迁移(如修改 JSON 字段内容)需手写进生成的脚本。env.py 设置了 render_as_batch=True,会自动处理 SQLite 的 ALTER TABLE 限制,无需按数据库类型分支。迁移在 LangBot 启动时自动执行。
开发规范
- LangBot 是全球化项目:所有代码注释与文档字符串必须为英文,所有面向用户的文案必须支持 i18n(至少
en_US+zh_Hans,仓库已有日文处则补ja_JP)。 - LangBot 同时被 toC 与 toB 场景采用,请始终考虑兼容性与安全性。
- 提交信息格式:
<type>(<scope>): <subject>type:feat、fix、docs、style、refactor、perf、test、chore等。scope:受影响的包/模块/文件/类。subject:简洁的变更描述。
一些原则
- Keep it simple, stupid.
- 如无必要,勿增实体。
- 八荣八耻: 以瞎猜接口为耻,以认真查询为荣。 以模糊执行为耻,以寻求确认为荣。 以臆想业务为耻,以人类确认为荣。 以创造接口为耻,以复用现有为荣。 以跳过验证为耻,以主动测试为荣。 以破坏架构为耻,以遵循规范为荣。 以假装理解为耻,以诚实无知为荣。 以盲目修改为耻,以谨慎重构为荣。
