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 但不希望从头搓的人。

基本信息

核心设计

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`调用 LLMlitellm 封装
`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 库(同一组织的另一个库),支持:

频道无关

CLI、Telegram 和自定义频道共享同一套 process_inbound() 管线:

操作员等价

人和 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 同样非常严谨,覆盖:

与 Tape 生态的关系

Bub 是整个 Tape 生态的核心运行时:


tape.systems (设计语言)
    ↓ 实践于
bub (Agent 运行时)
    ↓ 扩展于
bub.build (社区 + 插件中心)
    ↓
tape x topic (scnace 的企业知识库方案)
tape x bee (scnace 的任务编排方案)

关键点:

评分对比

维度评分说明
**设计简洁度**⭐⭐⭐⭐⭐~200 行核心,Hook 系统极其优雅
**可扩展性**⭐⭐⭐⭐⭐每个阶段都可替换,Plugin 体系成熟
**Tape 实现**⭐⭐⭐⭐⭐完整实现了 append-only / anchor / handoff / fork-merge
**多频道支持**⭐⭐⭐⭐CLI + Telegram,更多频道需自建
**生态成熟度**⭐⭐⭐⭐1.3k stars,社区活跃,但有实验色彩
**中文社区**⭐⭐⭐⭐⭐核心贡献者均为中文开发者,文档有中文版

与同类对比

特性BubOpenClawHermes AgentNanobot
核心代码量~200 行大量中等~4K 行
Hook 系统✅ pluggy❌ 插件但非 hook
Tape 上下文✅ 原生✅ lossless-claw
Agent Skill✅ agentskills.io
多频道CLI+Telegram全平台多平台多平台
语言PythonNode.jsPythonPython
Stars1.3k80k+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 理念的更完整实现

参考资料