burr is a free, open source machine learning infrastructure project written in Python and released under Apache-2.0. It has 2,553 GitHub stars, 195 forks and 99 open issues, and was last pushed 5 days ago. On this registry it ranks #43 of 57 tracked projects in Machine Learning Infrastructure, with 5 head-to-head comparisons available.

What is burr?

Apache Burr (incubating) is an Apache-licensed Python framework for building applications that make decisions — chatbots, agents, and simulations — which you monitor, trace, persist, and execute on your own infrastructure.

What it is

Apache Burr lives in the AI and machine learning infrastructure space as an LLMOps and MLOps tool, and it models an application as a state machine, meaning a graph or flowchart of actions joined by transitions. The building blocks are plain Python: functions decorated with @action that declare which state keys they read and write, assembled through an ApplicationBuilder with with_actions, with_transitions, with_state, and with_entrypoint, then executed with app.run. The project ships three pieces: a dependency-free, low-abstraction Python library for building and managing state machines, a UI that shows execution telemetry for introspection and debugging, and a set of integrations for persisting state, connecting to telemetry, and wiring in other systems. Burr is explicitly LLM-friendly without being LLM-dependent — the README notes you can query a model however you like inside an action, or not use one at all.

The concrete problem Burr solves is the plumbing that surrounds any stateful, decision-heavy application: managing state, tracking complex decisions, adding human feedback, and enforcing an idempotent, self-persisting workflow. Rather than hand-rolling state handling, trace logging, and save-and-load logic around model calls, an application declares its actions and transitions and lets Burr record what happened and where the state went. Pluggable persisters, such as the ones for memory, save and load application state, so a run can be inspected or resumed instead of reconstructed from log files.

Key capabilities

  • State machine execution model built from @action functions that declare reads and writes over State, wired together with ApplicationBuilder and with_transitions.
  • Partial and resumable runs through app.run(halt_after=["ai_response"], inputs={"prompt": "..."}), which stops at a named action and returns the resulting state.
  • Telemetry UI started with the burr command, loaded with default data and a demo chat application under the Demos sidebar so execution can be watched changing in real time.
  • Real-time tracking, monitoring, and tracing of a running system through that UI, aimed at introspection and debugging.
  • Pluggable persisters, including a memory persister, for saving and loading application state.
  • Framework-agnostic LLM integration: the README states Burr integrates with your favorite frameworks and that the library does not care how LLMs are called.
  • Dependency-free core library, with an optional CLI distributed through the [start], [learn], and [cli] extras that requires Python 3.10+, while core usage remains compatible with Python 3.9.

Who uses it and how

  • Teams building chatbots and agents that need to see what a system actually did, using the telemetry UI for tracing instead of inferring behavior after the fact.
  • Workflows that require human feedback in the loop, modeled as an explicit state or transition rather than an out-of-band prompt.
  • Applications that must be idempotent and self-persisting, where a persister reloads state so a run continues rather than restarting.
  • LLM application developers who already use another framework and want Burr for state, tracing, and persistence without replacing their existing stack.
  • Simulation and graph-shaped workloads, reflected in the project topics for DAGs, graphs, state management, LLMOps, and MLOps.
  • Individual developers evaluating the framework through the bundled examples, such as examples/hello-world-counter run with python application.py.

Getting started

Install the burr package from PyPI, adding the optional [start], [learn], or [cli] extras when the CLI is wanted, and run the burr command to open the telemetry UI. To run the counter example, clone github.com/apache/burr, change into burr/examples/hello-world-counter, and run python application.py.

How it compares

The facts provided name no comparable or paid products that Apache Burr replaces, so it stands alone in this registry on that axis. No competing self-hosted alternative, hosted service, or licence comparison is documented here to contrast against.

When to use it — and when not to

A self-hoster must run the telemetry UI process and choose and operate a persister if state should survive between runs, and the demo chatbot only chats when the OPENAI_API_KEY environment variable is set, although the UI still demonstrates the flow without one. The optional CLI extras raise the floor to Python 3.10+, and the project carries the Apache incubating label, with 99 open issues at the time of the supplied data. Anyone wanting a fully managed hosted service, a non-Python stack, or a framework that dictates how models are called should look elsewhere, because Burr deliberately supplies the state, tracing, and persistence layer and leaves the model call to the developer.

project readme (upstream, from github) — read inline

Apache Burr (incubating)

Discord Downloads PyPI Downloads GitHub Last Commit X

Apache Burr (incubating) makes it easy to develop applications that make decisions (chatbots, agents, simulations, etc...) from simple python building blocks.

Apache Burr works well for any application that uses LLMs, and can integrate with any of your favorite frameworks. Burr includes a UI that can track/monitor/trace your system in real time, along with pluggable persisters (e.g. for memory) to save & load application state.

Link to documentation. Quick ( [!NOTE]

In version 0.43.0, the optional CLI included with [start], [learn], and [cli] requires Python 3.10+. Core library usage remains compatible with Python 3.9.

(see the docs if you're using poetry)

Then run the UI server:

burr

This will open up Burr's telemetry UI. It comes loaded with some default data so you can click around. It also has a demo chat application to help demonstrate what the UI captures, enabling you to see things changing in real-time. Hit the "Demos" side bar on the left and select chatbot. To chat it requires the OPENAI_API_KEY environment variable to be set, but you can still see how it works if you don't have an API key set.

Next, start coding / running examples:

git clone https://github.com/apache/burr && cd burr/examples/hello-world-counter
python application.py

You'll see the counter example running in the terminal, along with the trace being tracked in the UI. See if you can find it.

For more details see the getting started guide.

How does Apache Burr work?

With Apache Burr you express your application as a state machine (i.e. a graph/flowchart). You can (and should!) use it for anything in which you have to manage state, track complex decisions, add human feedback, or dictate an idempotent, self-persisting workflow.

The core API is simple -- the Burr hello-world looks like this (plug in your own LLM, or copy from the docs for gpt-X)

from burr.core import action, State, ApplicationBuilder

@action(reads=[], writes=["prompt", "chat_history"])
def human_input(state: State, prompt: str) -> State:
    # your code -- write what you want here, for example
    chat_item = {"role" : "user", "content" : prompt}
    return state.update(prompt=prompt).append(chat_history=chat_item)

@action(reads=["chat_history"], writes=["response", "chat_history"])
def ai_response(state: State) -> State:
    # query the LLM however you want (or don't use an LLM, up to you...)
    response = _query_llm(state["chat_history"]) # Burr doesn't care how you use LLMs!
    chat_item = {"role" : "system", "content" : response}
    return state.update(response=response).append(chat_history=chat_item)

app = (
    ApplicationBuilder()
    .with_actions(human_input, ai_response)
    .with_transitions(
        ("human_input", "ai_response"),
        ("ai_response", "human_input")
    ).with_state(chat_history=[])
    .with_entrypoint("human_input")
    .build()
)
*_, state = app.run(halt_after=["ai_response"], inputs={"prompt": "Who was Aaron Burr, sir?"})
print("answer:", app.state["response"])

Apache Burr includes:

  1. A (dependency-free) low-abstraction python library that enables you to build and manage state machines with simple python functions
  2. A UI you can use to view execution telemetry for introspection and debugging
  3. A set of integrations to make it easier to persist state, connect to telemetry, and integrate with other systems

Burr at work

What can you do with Apache Burr?

Apache Burr can be used to power a variety of applications, including:

  1. A simple gpt-like chatbot
  2. A stateful RAG-based chatbot
  3. An LLM-based adventure game
  4. An interactive assistant for writing emails

As well as a variety of (non-LLM) use-cases, including a time-series forecasting simulation, and hyperparameter tuning.

And a lot more!

Using hooks and other integrations you can (a) integrate with any of your favorite vendors (LLM observability, storage, etc...), and (b) build custom actions that delegate to your favorite libraries (like Apache Hamilton).

Apache Burr will not tell you how to build your models, how to query APIs, or how to manage your data. It will help you tie all these together in a way that scales with your needs and makes following the logic of your system easy. Burr comes out of the box with a host of integrations including tooling to build a UI in streamlit and watch your state machine execute.

Start building

See the documentation for getting started, and follow the example. Then read through some of the concepts and write your own application!

Comparison against common frameworks

While Apache Burr is attempting something (somewhat) unique, there are a variety of tools that occupy similar spaces:

Criteria Apache Burr Langgraph temporal Langchain Superagent Apache Hamilton
Explicitly models a state machine
Framework-agnostic
Asynchronous event-based orchestration
Built for core web-service logic
Open-source user-interface for monitoring/tracing
Works with non-LLM use-cases

Why the name Burr?

Apache Burr is named after Aaron Burr, founding father, third VP of the United States, and murderer/arch-nemesis of Alexander Hamilton. What's the connection with (Apache) Hamilton? We imagine a world in which Burr and Hamilton lived in harmony and saw through their differences to better the union. Originally Apache Burr was built as a harness to handle state between exec

readme truncated — read the full docs on github

Frequently asked questions

Is burr free to use?

burr is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does burr do?

Build applications that make decisions (chatbots, agents, simulations, etc...). Monitor, trace, persist, and execute on your own infrastructure.

What is burr written in?

burr is primarily written in Python. Its source is publicly available at https://github.com/apache/burr, and it has 2,553 GitHub stars.