author: PsiACE, Frost Ming, Yihong
source: https://github.com/bubbuild/bub
tags: [agent, ai, runtime, python, tape, hooks, pluggy, telegram, cli]
rating: ⭐⭐⭐⭐⭐ (5/5)
Bub — Tape 设计语言的参考 Agent 运行时
一句话版本
Bub 是一个 Python Agent 运行时,核心代码只有 ~200 行,用插拔式 Hook 替代复杂框架——每轮对话的每个环节(会话解析、上下文构建、模型调用、消息发送)都是一个可以替换的钩子。它是 Tape 设计语言的参考实现,适合想自己造 Agent 但不希望从头搓的人。
基本信息
- 作者: PsiACE(Chojan Shang)、Frost Ming、Yihong — 均为知名 Python/开源开发者
- 仓库: bubbuild/bub(1.3k stars)
- 协议: Apache-2.0
- 语言: Python 3.12+
- 安装:
pip install bub - 官网: bub.build
- 插件中心: hub.bub.build
- 被引用: tape.systems 官方称 "practiced in bub.build";scnace 在 Tape x Topic 和 Tape x Bee 中均有提及
核心设计
Hook-First 架构
Bub 的核心理念是 "~200 lines of core code. Hooks reshape every turn stage.",通过 pluggy 库实现插件化:
resolve_session → load_state → build_prompt → run_model
↓
dispatch_outbound ← render_outbound ← save_state
| Hook 阶段 | 职责 | 默认实现 |
|---|---|---|
| `resolve_session` | 解析入站消息的会话 ID | 从 message.channel:message.chat_id 派生 |
| `load_state` | 从 Tape 重建上下文状态 | 读取 Tape 记录 |
| `build_prompt` | 组装系统提示 + 历史 + 工具描述 | 从 Tape entries 构建 |
| `run_model` | 调用 LLM | litellm 封装 |
| `save_state` | 持久化到 Tape | 追加 append-only 记录 |
| `render_outbound` | 格式化回复 | 文本输出 |
| `dispatch_outbound` | 发送到频道(CLI/Telegram 等) | 按频道路由 |
关键特性: 内置实现只是默认插件。任何阶段都可以被外部插件覆盖,且 后注册的插件优先级更高。
Tape 上下文模型
Bub 不维护可变的 session state。每轮对话的上下文都从 append-only Tape 中重建:
# tape.py 核心逻辑
tape = self._llm.tape(tape_name)
await tape.append_async(TapeEntry.event(name=name, data=payload))
await tape.handoff_async("session/start", state={"owner": "human"})
Tape 实现使用 republic 库(同一组织的另一个库),支持:
- 全量查询(
.query_async.all()) - 按 kind 过滤(
.query_async.kinds("anchor")) - fork/merge 上下文分支
- Handoff 阶段切换
频道无关
CLI、Telegram 和自定义频道共享同一套 process_inbound() 管线:
bub chat— 交互式 REPLbub gateway— 频道监听器模式(Telegram 等)bub run "message"— 一次性调用- 自定义频道通过
provide_channelshook 添加
操作员等价
人和 Agent 在对话中使用相同的操作模型——相同的边界、相同的证据链、相同的 Handoff 语义。没有特殊的"操作员类"。
技术架构
源码结构
src/bub/
framework.py — ~200 行核心框架(BubFramework 类)
hookspecs.py — Hook 合同定义(11 个 Hook)
hook_runtime.py — Hook 执行器
envelope.py — 消息信封模型
types.py — 类型定义
skills.py — 技能发现
tools.py — 工具注册
configure.py — 配置加载
builtin/ — 内置 Hook 实现
hook_impl.py — 默认行为
tape.py — Tape 服务(info, search, anchors, handoff, fork)
agent.py — 默认 Agent 行为
cli.py — CLI 命令注册
store.py — Tape 存储后端
tools.py — 内置工具(文件读/写/执行等)
auth.py — 认证
context.py — 上下文构建
settings.py — 设置
shell_manager.py
channels/ — 频道适配器
base.py — Channel 基类
cli/ — CLI 频道
telegram.py — Telegram 频道
handler.py — 消息处理器
manager.py — 频道管理器
message.py — 消息模型
src/skills/ — 内置技能
关键依赖
| 依赖 | 用途 |
|---|---|
| `pluggy` | Hook 系统(pytest 同款) |
| `republic` | Tape 存储实现(TapeStore, TapeEntry, TapeQuery) |
| `pydantic` | 数据模型 |
| `typer` | CLI 框架 |
| `python-telegram-bot` | Telegram 集成 |
| `any-llm-sdk` | LLM 调用封装 |
| `prompt-toolkit` | 交互式 CLI |
| `loguru` | 日志 |
| `rapidfuzz` | 模糊匹配(技能发现) |
AGENTS.md 亮点
Bub 的 AGENTS.md 同样非常严谨,覆盖:
- 模块组织规则(core/src/bub/, builtin/, channels/)
- 构建/测试命令(uv sync, make install, make test, make check)
- 编码规范(Python 3.12+, Ruff lint, mypy typing, 120 line length)
- 测试指南(pytest, 行为导向命名)
- 提交规范(Conventional Commits)
- 安全注意事项(.env secrets, BUB_* env vars, Telegram allowlist)
与 Tape 生态的关系
Bub 是整个 Tape 生态的核心运行时:
tape.systems (设计语言)
↓ 实践于
bub (Agent 运行时)
↓ 扩展于
bub.build (社区 + 插件中心)
↓
tape x topic (scnace 的企业知识库方案)
tape x bee (scnace 的任务编排方案)
关键点:
- Bub 的
republic库直接实现了 Tape 的 Entry/Anchor/Handoff 模型 ForkTapeStore实现了 Tape 的 fork/merge 策略- Topic/Bee 都是基于 Bub 运行的扩展
- scnace 的 "visual-base" 项目也是基于 Bub 构建的
评分对比
| 维度 | 评分 | 说明 |
|---|---|---|
| **设计简洁度** | ⭐⭐⭐⭐⭐ | ~200 行核心,Hook 系统极其优雅 |
| **可扩展性** | ⭐⭐⭐⭐⭐ | 每个阶段都可替换,Plugin 体系成熟 |
| **Tape 实现** | ⭐⭐⭐⭐⭐ | 完整实现了 append-only / anchor / handoff / fork-merge |
| **多频道支持** | ⭐⭐⭐⭐ | CLI + Telegram,更多频道需自建 |
| **生态成熟度** | ⭐⭐⭐⭐ | 1.3k stars,社区活跃,但有实验色彩 |
| **中文社区** | ⭐⭐⭐⭐⭐ | 核心贡献者均为中文开发者,文档有中文版 |
与同类对比
| 特性 | Bub | OpenClaw | Hermes Agent | Nanobot |
|---|---|---|---|---|
| 核心代码量 | ~200 行 | 大量 | 中等 | ~4K 行 |
| Hook 系统 | ✅ pluggy | ❌ 插件但非 hook | ❌ | ❌ |
| Tape 上下文 | ✅ 原生 | ✅ lossless-claw | ❌ | ❌ |
| Agent Skill | ✅ agentskills.io | ✅ | ❌ | ❌ |
| 多频道 | CLI+Telegram | 全平台 | 多平台 | 多平台 |
| 语言 | Python | Node.js | Python | Python |
| Stars | 1.3k | 80k+ | 40k+ | 42k+ |
深度分析
惊艳点
1. ~200 行核心 — 是真正意义上的"微内核"。pluggy hook 系统让扩展性远超代码量
2. Tape 原生实现 — 作为 tape.systems 的参考实现,Entry/Anchor/Handoff 模型完整落地
3. 操作员等价 — 人和 Agent 共享同一套操作模型,没有隐藏的"管理员模式"
4. republic 库 — Tape 存储层独立为库,可被其他项目重用
5. 中文社区驱动 — PsiACE、Frost Ming、Yihong 都是华人开发者,文档有中文版
6. 插件中心 hub.bub.build — 社区可以发布和发现 Bub 插件
不足/风险
1. 生态尚小 — 1.3k stars vs OpenClaw 80k+,插件数量有限
2. Python 依赖 — 对 Python 3.12+ 有要求
3. 多频道仍需自建 — 只内置 CLI 和 Telegram
4. Agent 能力较基础 — 相比 OpenClaw 缺少原生记忆管理、DAG 任务流等
5. 实验色彩 — README 和网站透露出"仍在探索"的感觉
对我们项目的意义
Bub 是 lossless-claw + tape.systems 理念的更完整实现:
- Bub 的 Tape 模型(republic)与 lossless-claw 的 DAG 摘要各有侧重
- Bub 的 Hook 架构是 lossless-claw 可以借鉴的扩展方式
- 操作员等价原则值得 OpenClaw 生态参考
- scnace 的 visual-base 项目证明 Bub 可以落地到具体产品