Skip to main content

A common shape for agents that live alongside people.

Project description

Bub

Bub logo

A hook-first runtime for agents that live alongside people.

Bub is a small Python runtime for building agents in shared environments. It started in group chats, where multiple humans and agents had to work in the same conversation without hidden state, hand-wavy memory, or framework-specific magic.

Built on agents.md and Agent Skills , Bub stays intentionally small. Every turn stage is a pluggy hook. Builtins are included but replaceable. The same runtime drives CLI, Telegram, and any channel you add.

Website · GitHub

Quick Start

pip install bub

Or from source:

git clone https://github.com/bubbuild/bub.git
cd bub
uv sync  # enough to run Bub from source

For local development, use make install instead so the website toolchain and prek hooks are installed too.

uv run bub chat                         # interactive session
uv run bub run "summarize this repo"    # one-shot task
uv run bub gateway                      # channel listener mode

Why Bub

  • Hook-first runtime. Every turn stage is a hook. Override one stage or replace the whole flow without forking the runtime.
  • Tape context. Context is rebuilt from append-only records, not carried around as mutable session state. Easier to inspect, replay, and hand off.
  • One runtime across surfaces. The same inbound pipeline runs across CLI, Telegram, and custom channels. Adapters change the surface, not the runtime model.
  • Batteries included. CLI, Telegram, tools, skills, and model execution ship with the core runtime. Use the defaults first, replace them later.
  • Operator equivalence. Humans and agents work inside the same runtime boundaries, with the same evidence trail and handoff model. No hidden operator class.

How It Works

Every inbound message goes through one turn pipeline. Each stage is a hook.

resolve_session → load_state → build_prompt → run_model
                                                   ↓
              dispatch_outbound ← render_outbound ← save_state

Builtins are registered first. External plugins load after them. At runtime, later plugins take precedence. There are no framework-only shortcuts.

Key source files:

Extend It

from bub import hookimpl
from bub.envelope import content_of


class EchoPlugin:
    @hookimpl
    def build_prompt(self, message, session_id, state):
        return f"[echo] {content_of(message)}"

    @hookimpl
    async def run_model(self, prompt, session_id, state):
        return prompt


echo_plugin = EchoPlugin()
[project.entry-points."bub"]
echo = "my_package.plugin:echo_plugin"

See the Build docs for hook guides, packaging, and plugin structure.

CLI

Command Description
bub chat Interactive REPL
bub run MESSAGE One-shot turn
bub gateway Channel listener (Telegram, etc.)
bub install Install or sync Bub plugin deps
bub update Upgrade Bub plugin deps
bub login openai OpenAI Codex OAuth

Lines starting with , enter internal command mode (,help, ,skill name=my-skill, ,fs.read path=README.md).

bub hooks still exists for diagnostics, but it is hidden from top-level help. bub install and bub update manage a separate uv project for Bub plugins, defaulting to ~/.bub/bub-project or BUB_PROJECT.

Configuration

Variable Default Description
BUB_MODEL openrouter:openrouter/free Model identifier
BUB_API_KEY Provider key (optional with bub login openai)
BUB_API_BASE Custom provider endpoint
BUB_API_FORMAT completion completion, responses, or messages
BUB_CLIENT_ARGS JSON object forwarded to the underlying model client
BUB_MAX_STEPS 50 Max tool-use loop iterations
BUB_MAX_TOKENS 16384 Max tokens per model call
BUB_MODEL_TIMEOUT_SECONDS Model call timeout (seconds)

Background

Bub is shaped by one constraint: real collaboration is messier than a solo demo. In shared environments, operators need visible boundaries, auditable history, and extension points that do not collapse into framework sprawl.

Read more:

Docs

  • Getting Started — install Bub and run the first turn
  • Concepts — the mental model behind the runtime
  • Channels — run Bub in CLI, Telegram, or your own channel
  • Skills — discover, inspect, and author Agent Skills in Bub
  • Build — write plugins, override hooks, ship tools and skills
  • Deployment — Docker, environment, upgrades

Development

make install
make check
make test
make docs
make docs-test

See CONTRIBUTING.md.

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bub-0.3.9.tar.gz (104.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bub-0.3.9-py3-none-any.whl (96.7 kB view details)

Uploaded Python 3

File details

Details for the file bub-0.3.9.tar.gz.

File metadata

  • Download URL: bub-0.3.9.tar.gz
  • Upload date:
  • Size: 104.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.14

File hashes

Hashes for bub-0.3.9.tar.gz
Algorithm Hash digest
SHA256 0731f4326b2e45e6cd66e08881ca5ca9fac8522b2359a1c8d93c323de70104c5
MD5 bb90f782f74776b589d164c2efb1aca2
BLAKE2b-256 e29c442b6c35b1faea7b463248dfd27e2273cac8706b9e7a1529b210ee02c6e7

See more details on using hashes here.

File details

Details for the file bub-0.3.9-py3-none-any.whl.

File metadata

  • Download URL: bub-0.3.9-py3-none-any.whl
  • Upload date:
  • Size: 96.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.14

File hashes

Hashes for bub-0.3.9-py3-none-any.whl
Algorithm Hash digest
SHA256 d143b9aaf94950711f818110a0fdce20770208c79d835d946ac3a298dcfb0c3d
MD5 c25338bae249687521841e6de5c34922
BLAKE2b-256 31bcd206cbea7b6e869a7ec5a2c6c671fca13f61b24820a7c1a53a1fcb64e0bf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page