Apache Burr: 상태 머신으로 만드는 신뢰할 수 있는 AI 에이전트 프레임워크
Apache Burr: Build reliable AI agents and applications
TL;DR Highlight
액션과 전이만 정의하면 상태 저장·UI 디버깅·재생이 되는 Python 에이전트 프레임워크
Who Should Read
LangChain류 에이전트 프레임워크가 추상화 때문에 디버깅이 힘들어 대안을 찾는 Python 백엔드 개발자
Core Mechanics
- Burr는 액션과 전이로 앱을 만든다
- Apache Burr(Incubating)는 챗봇부터 멀티 에이전트까지 만드는 순수 Python 라이브러리다.
- DSL이나 YAML 없이 함수와 데코레이터로 액션과 전이를 정의한다.
- 상태를 읽고 쓰는 액션 단위 설계
- @action(reads=[...], writes=[...])으로 액션이 읽고 쓰는 state 키를 선언한다.
- ApplicationBuilder로 액션, 전이, 초기 state, tracker를 붙여 앱을 빌드한다.
- UI로 모든 단계를 추적한다
- Burr UI에서 앱의 각 단계를 실시간으로 모니터링하고 디버깅한다.
- state가 바뀌는 과정을 그대로 볼 수 있다.
- 저장·재개·사람 개입 기능 내장
- state를 디스크, DB, 커스텀 백엔드에 자동 저장하고 중단한 지점부터 재개한다.
- 어느 단계에서든 실행을 멈추고 사람 입력을 기다릴 수 있어 승인 워크플로에 쓴다.
- 병렬 실행과 테스트·재생 지원
- 액션을 병렬로 돌리고 fan out/fan in으로 복잡한 DAG(방향 있는 그래프)를 만든다.
- 과거 실행을 재생하고 개별 액션을 단위 테스트할 수 있다.
- 기존 스택과 함께 쓴다
- OpenAI, Anthropic, LangChain, Hamilton, Streamlit, FastAPI, Haystack, Instructor, Pydantic, PostgreSQL 연동이 소개돼 있다.
- 락인과 래퍼가 없다고 주장한다.
Community Reactions
- 프레임워크 없이 1:1 코드가 낫다는 의견
- 에이전트는 컨텍스트 구성, LLM 호출, 툴 실행, 출력 파싱의 반복이라 전통적 개발 관점에서 복잡하지 않다는 의견이 있었다.
- 프레임워크 추상화가 핵심 로직을 가리고 맞지 않는 구조를 강요한다고 했다.
- Django 앱 챗봇 MVP를 프레임워크 없이 Claude/Codex로 에이전트 루프를 짜서 만들었더니 잘 돈다는 경험도 있었다.
- Burr 위에 MCP를 얹어 쓴 경험
- Burr 상태 머신을 MCP로 마운트해 에이전트가 따라갈 레일을 만들었다는 경험이 공유됐다.
- 상태 머신이 복잡해져도 MCP 툴은 상태 이동으로 제한된다고 한다.
- 개인·업무 프로젝트에서 안정적인 상태 워크플로와 무료 관측성이 좋았다고 했다.
- 차별점이 불분명하다는 반론
- 샘플 코드가 builder 패턴을 쓴 langgraph 같다는 의견이 있었다.
- 상태 머신은 '신뢰성(작업을 끝내는 것)'과 무관하다는 반론도 있었다.
- 랜딩 페이지가 AI 생성 템플릿 같다는 비판이 많았다.
- 관측성 부재와 인증 질문
- DIY 에이전트가 가장 먼저 빼먹는 것이 관측성이고 프로덕션에서 제일 아쉽다는 의견이 있었다.
- 에이전트 인증 방식은 문서에서 못 찾았다는 질문이 올라왔다.
- 메인테이너가 직접 질문에 답하겠다고 했다.
How to Apply
- 로컬에서 Burr 챗봇 예제 돌려보기
- 오늘 pip install burr로 설치하고 위 코드 예제를 실행한다.
- with_tracker("local")로 실행 기록을 남긴 뒤 Burr UI에서 state 변화를 확인한다.
- 기존 에이전트 루프를 액션으로 쪼개기
- 컨텍스트 구성, LLM 호출, 툴 실행을 각각 @action으로 분리한다.
- 각 액션의 reads/writes를 명시하고 with_transitions로 순서를 잇는다.
- 승인이 필요한 단계에 사람 개입 넣기
- 결제·메일 발송 같은 위험한 액션 앞에서 실행을 멈추도록 설계한다.
- 승인 입력 후 이어서 실행하도록 구성한다.
- 실패한 실행을 재생해 테스트 케이스로 만들기
- 프로덕션에서 실패한 실행의 state 스냅샷을 저장한다.
- 해당 액션을 단위 테스트로 옮겨 재현한다.
Try It
# 터미널에서 실행 (설치: pip install "burr[start]"; OPENAI_API_KEY 필요)
from burr.core import action, State, ApplicationBuilder
from openai import OpenAI
@action(reads=["messages"], writes=["messages"])
def chat(state: State, llm_client) -> State:
r = llm_client.chat.completions.create(model="gpt-4o-mini", messages=state["messages"])
reply = {"role": "assistant", "content": r.choices[0].message.content}
return state.update(messages=[*state["messages"], reply])
app = (
ApplicationBuilder()
.with_actions(chat)
.with_transitions(("chat", "chat"))
.with_state(messages=[{"role": "user", "content": "안녕"}])
.with_entrypoint("chat")
.with_tracker("local")
.build()
)
app.run(halt_after=["chat"], inputs={"llm_client": OpenAI()})
# 이후 터미널에서 `burr` 실행해 UI 확인Terminology
관련 논문
모델이 그렇게 좋다면 OpenAI는 왜 회사 100개를 직접 안 차릴까
HN 댓글 답: 코드는 쉬워도 뭘 만들지 아는 건 별개라 토큰을 판다
OpenShell: 자율 AI 에이전트를 가두는 NVIDIA의 안전한 샌드박스 런타임
정책 파일로 에이전트의 파일·네트워크·자격증명 접근을 커널 수준에서 통제한다
Omnara: Claude Managed Agents의 오픈소스 대안 (셀프호스팅 가능)
어떤 모델·머신에서도 에이전트를 돌리는 오픈소스 managed agent 플랫폼
Rust off Rails: 코드 없이 Markdown 60개로 만든 AI 에이전트용 웹 스택
Markdown 규칙 60개로 에이전트가 Rust 웹앱을 짜게 한다는 프레임워크
LayerFS: AI 코딩 에이전트를 위한 파일시스템
에이전트마다 임시 Workspace를 마운트하고 결과만 커밋하는 파일시스템
Launch HN: Alter (YC S25) – 멀티유저 에이전트용 접근 제어
에이전트마다 별도 신원·정책·감사로 API 키 공유 문제를 푼다
Claude로 코드의 공격 표면(attack surface) 줄이기
Claude로 25개 오픈소스를 분석해 불필요하게 열린 코드 493건을 찾았다
WhatsApp 도움말 페이지에 숨겨진 LLM 지시문: 규제기관을 추천하지 말라
WhatsApp 도움말에 화면엔 안 보이는 AI 지시문 102개가 숨어 있었다