Burr は、アプリケーションを状態機械として構築するための軽量な Python ライブラリである。アプリケーションは一連のアクション ― デコレートされた関数またはオブジェクト ― から構成される。各アクションは、状態とユーザーから受け取る入力を宣言し、他の任意のフレームワークに処理を委ねることもできる独自のロジックを持ち、状態をどのように更新するかを指定する。状態は不変であり、開発元はこれによって実行中の任意の時点で状態を調べられるのだと説明している。アクションは、必要に応じて条件付きにできる遷移でつなぎ合わされるため、アプリケーションはフローチャートやグラフとして見ることができ、オーケストレーション、監視、永続化は Burr 自体が担う。
開発元の DAGWorks は、Burr を AI アシスタント、検索拡張生成(RAG)アプリケーション、ヒューマン・イン・ザ・ループの AI インターフェース向けと位置づけており、そのユーザーは典型的にはチャットボットを構築した後にエージェントへと進んでくる人々だと述べている。ここで用いている情報源は DAGWorks 自身のブログ記事であるため、Burr が何をもたらすかについての主張はベンダーによるものである。
機能
同記事における 関数呼び出し の解説は、このライブラリの機能の大部分を使っている。あるアクションがモデルを呼び出してツールを選ばせ、どのツールをどの引数で実行するかを返す。次に .bind() 機能によって、パラメーター化された 1 つのツール呼び出しアクションが、パラメーターに毎回異なる値をバインドすることでツールごとの個別のアクションに変わる。記事は、すべてのツールがグラフ上で見えるようにするという明確な理由から、単一の振り分け用アクションよりもこの方法を好んでいる。最後のアクションが生の結果をユーザー向けに整形し、遷移が入力へとループして戻ることで、次の質問ができるようになる。
オブザーバビリティは、オープンソースのユーザーインターフェースと組み合わせる 1 行の変更として説明されており、その UI では任意の時点で状態を調べたり、ステップまたはスパンごとのトークン数を確認したり、チャット補完の OpenTelemetry データを調べたりできる。@trace() デコレーターはこれをツール関数そのものにまで拡張し、その呼び出しが同じ UI に記録されるようにする。また、特定のケースをテストケースとして再現することもできる。本番運用向けとして、記事は、読者が選んだデータベースに対してセッションを追跡するための永続化 API と、FastAPI サーバー内にデプロイするための状態の型付け機能を挙げている。
採用とエコシステム
記事は Burr の価値を、同じ API 呼び出しを直接書く場合に比べて何が加わるかという観点で説明している。ワークフローがグラフであるため自己文書化されて読みやすいこと、変更が特定のアクションに局所化され、実行間で比較できること、そしてエラー条件のようなグラフレベルの関心事を、既存のコードに手を触れずに新しいアクションとエッジとして追加できることである。デバッグについての主張はツール呼び出しに特化してなされており、記事は、モデルがそもそもツールを選ぶかどうかについて気まぐれで、ときに指示の中で迷子になることがあったと報告し、それを Burr の UI 上で試行錯誤したプロンプトエンジニアリングによって解決したと述べている。
このツール呼び出しの例は OpenAI の API を対象に書かれており、記事は他のプロバイダーにも素直に拡張できるとしている。その中での Burr の役割は、ツール呼び出しまたは関数呼び出しをサポートする任意のプロバイダー API の上に載る薄いレイヤーとして説明されている。