メインコンテンツへスキップ

beaでAIエージェントにBeancount台帳を渡す

beaを使ってAIエージェントに2つの簿記タスクを任せる:プレビュー優先のレビューで銀行CSVを取り込み、BQLとレポート出力から残高の質問に答える。

外部のAIエージェントに2つの簿記業務を任せ、すべての台帳変更をあなたのレビュー下に置く:プレビュー優先のチェック付きで銀行CSVをインポートし、その後クエリとレポート出力から残高の質問に回答する。

CLIクイックスタートでbeaをインストールする。ローカルのインポート、クエリ、レポートコマンドはBeancount.ioアカウントを必要としない。チャットエージェントは独自のサブスクリプションまたはAPIキーのみが必要。組み込みのbea askヘルパーだけがホスト型認証情報を必要とするが、これらのレシピはそれを使用しない。

ツールを選ぶ際は?AIエージェント向け会計ツール5選が、Beancount.io、hledger、Xero、QuickBooks Online、Puzzleを同じエージェントワークフロー基準で比較し、日付入りの情報源を掲載している。

エージェントが行うこととbeaが行うこと​

エージェントはカテゴリを提案し、クエリを起草する。Beaは台帳構造を検証し、合計を計算する。以下のすべてのコマンドは自分で実行する。エージェントが直接台帳に書き込むことはない。

レシピ1:エージェント提案のカテゴリで明細をインポートする​

銀行のエクスポートを検証済みエントリに変換する。エージェントが分類ルールを提案する。プレビューと重複レビューが、何を書き込むかを決定する。

前提条件​

beaと新しいデモディレクトリが必要。アカウントもPythonインポーターも不要。

入力の準備​

ディレクトリと台帳を作成する。明示的な--fileターゲットにより、すべてのコマンドがデモ帳簿を指すように保つ。

mkdir ai-agent-demo && cd ai-agent-demo
bea --no-input init books --currency USD --date 2026-08-01 --opening-balance "Assets:Checking 1000"
bea --file books/main.bean add open --date 2026-08-01 --account Expenses:Transport:Fuel -c USD

このサンプルをstatement.csvとして保存する:

Date,Payee,Narration,Amount
2026-08-02,Whole Foods,groceries,-20.00
2026-08-03,Shell,gas,-40.00
2026-08-04,Unknown Shop,mystery,-9.99

この分類ルールをrules.tomlとして保存する:

[[rule]]
match = "whole foods|trader joe|corner market"
account = "Expenses:Groceries"
 
[[rule]]
match = "shell|chevron|exxon"
account = "Expenses:Transport:Fuel"

タスクプロンプトのコピー​

このプロンプトをCSVの内容とともに外部エージェントに貼り付ける:

Propose Beancount categorization rules for my bank CSV rows.
Suggest one TOML rule per merchant with a match pattern and a
destination expense account. Never change dates, payees, or amounts.
Leave rows you cannot categorize confidently unmatched: they post to
Expenses:Uncategorized with flag ! for my review. I run bea import
preview and apply locally. You do not write my ledger.

CLI相当コマンドの実行​

まずプレビューし、次にレビュー済みエントリを適用して結果を検証する:

bea --file books/main.bean import statement.csv --csv date=Date,amount=Amount,payee=Payee,narration=Narration --account Assets:Checking --rules rules.toml
bea --file books/main.bean import statement.csv --apply
bea --file books/main.bean check
bea --file books/main.bean list transaction --flag '!'
bea --file books/main.bean query "SELECT account, sum(position) WHERE account = 'Assets:Checking' GROUP BY account"

期待される出力の確認​

プレビューは3 ready, 0 exact duplicates, 0 possible duplicatesを報告し、終了コード0で終了する。何も書き込まれない。適用実行はWrote 3 entriesを報告する。チェックはエラーなしを報告する。!キューはUnknown Shopから-9.99 USDの一致しない1行を一覧表示する。残高クエリは当座預金に930.01 USDを報告する。適用を繰り返すと0 ready, 3 exact duplicatesを報告し、0エントリを書き込む。

レビューと修正​

!行を読んだ後、意図的に台帳で再分類する。合格したチェックは台帳の残高が一致することを証明するだけだ。Expenses:Uncategorizedが正しい勘定科目かどうかについては何も示さない。重複ポリシー、競合処理、高度なPythonパスについては、銀行CSVウォークスルーに従う。

レシピ2:書き込みなしで残高の質問に回答する​

デモ帳簿から1つの質問に回答する:2026年8月に食料品と燃料にいくら使ったか。エージェントがクエリを起草する。読み取り専用コマンドが回答を生成する。

前提条件​

レシピ1のデモ台帳または自分の帳簿が必要。以下のすべてのコマンドは読み取り専用。

タスクプロンプトのコピー​

このプロンプトを外部エージェントに貼り付ける:

Draft a Beancount query (BQL) that answers: how much did I spend on
groceries and fuel in August 2026. Use my account names exactly as
listed by bea list open. Propose read-only commands only: bea query
or bea report with an explicit --file target. Do not propose ledger
edits to fix a surprising total. A surprising total means the query
or the books need review, not a compensating entry.

CLI相当コマンドの実行​

起草されたクエリを明示的な台帳ターゲットに対して実行し、レポートでクロスチェックする:

bea --file books/main.bean query "SELECT account, sum(position) WHERE account ~ 'Expenses' GROUP BY account"
bea --file books/main.bean report income-statement --time 2026-08

マシンコンシューマーはサブコマンドの前にグローバル--jsonフラグを追加する:

bea --file books/main.bean --json query "SELECT account, sum(position) WHERE account ~ 'Expenses' GROUP BY account"

JSONエンベロープ、終了コード、グローバルフラグの配置はCLIリファレンスに従う。クエリ言語ガイドがBQLの全機能を文書化している。

期待される出力の確認​

クエリはExpenses:Groceriesに20.00 USD、Expenses:Transport:Fuelに40.00 USD、Expenses:Uncategorizedに9.99 USDを報告する。食料品と燃料を合わせると60.00 USD。損益計算書も一致する:8月の経費69.99 USD、純利益-69.99 USD。JSONバリアントはdata.rows内の同じ行を、data.columns内の列メタデータとともに返す。

レビューと修正​

間違った勘定科目名に対するクエリは、stderrに(no rows)を出力し、それでも終了コード0で終了する。名前をbea list openの出力と比較し、クエリを再実行する。驚くべき合計を修正するために、台帳を編集して回答に合わせることは決してしない。クエリを修正するか帳簿を修正し、その後bea checkを再実行する。

最初のチャレンジ:3つの合成行の残高を一致させる​

明示的な入力と独立に導出された回答を持つ、持ち運び可能な最初のチャレンジ。以下の3つのファイルをダウンロードし、インポートを実行し、2つの合計を確認する。アカウントも製品チェックアウトも不要。

2026年9月1日にUSDで当座預金1000 USDで帳簿を開く。9月の3行を記帳する:2000.00 USDのクライアント支払い、29.00 USDのホスティング請求書、12.50 USDのカフェ訪問。当座預金は2958.50 USDで終了する、1000 + 2000 - 29 - 12.50から。9月の利益は1958.50 USD、2000 - 29 - 12.50から。両方の期待値はその算術から来ており、レポート出力からではない。

入力の準備​

ディレクトリを作成し、テンプレートが持たない2つの勘定科目を開く。Expenses:DiningはすでにCLIテンプレートに含まれている。

mkdir agent-challenge && cd agent-challenge
bea --no-input init books --currency USD --date 2026-09-01 --opening-balance "Assets:Checking 1000"
bea --file books/main.bean add open --date 2026-09-01 --account Income:Consulting -c USD
bea --file books/main.bean add open --date 2026-09-01 --account Expenses:Software -c USD

これらの3つのコマンドが以下の台帳を生成する。タイピングの代わりにmain.beanとしてダウンロードする。

option "title" "Personal ledger"
option "operating_currency" "USD"
 
; Add more accounts with bea add open. Amounts on credit accounts are negative.
; bea import books rows it cannot categorize to Expenses:Uncategorized with flag '!'.
2026-09-01 open Assets:Checking USD
2026-09-01 open Assets:Savings USD
2026-09-01 open Assets:Cash USD
2026-09-01 open Liabilities:CreditCard USD
2026-09-01 open Income:Salary USD
2026-09-01 open Income:Interest USD
2026-09-01 open Expenses:Groceries USD
2026-09-01 open Expenses:Dining USD
2026-09-01 open Expenses:Rent USD
2026-09-01 open Expenses:Transport USD
2026-09-01 open Expenses:Utilities USD
2026-09-01 open Expenses:Fees USD
2026-09-01 open Expenses:Uncategorized USD
2026-09-01 open Equity:OpeningBalances USD
 
2026-09-01 * "Opening balances"
  Assets:Checking          1000 USD
  Equity:OpeningBalances  -1000 USD
 
2026-09-01 open Income:Consulting USD
 
2026-09-01 open Expenses:Software USD

この明細をstatement.csvとして保存するか、statement.csvとしてダウンロードする:

Date,Payee,Amount
2026-09-02,Client,2000.00
2026-09-03,Hosting,-29.00
2026-09-04,Cafe,-12.50

これらのルールをrules.tomlとして保存するか、rules.tomlとしてダウンロードする。各ルールはスターター台帳が開く勘定科目を指定する。

[[rule]]
match = "client"
account = "Income:Consulting"
 
[[rule]]
match = "hosting"
account = "Expenses:Software"
 
[[rule]]
match = "cafe"
account = "Expenses:Dining"

チャレンジの実行​

まずプレビューし、次に適用して検証する。金額、日付、フィールド名、勘定科目名はすべてのロケールで同一。翻訳されているのは周囲の散文のみ。

bea --file books/main.bean import statement.csv --csv date=Date,amount=Amount,payee=Payee --account Assets:Checking --rules rules.toml
bea --file books/main.bean import statement.csv --csv date=Date,amount=Amount,payee=Payee --account Assets:Checking --rules rules.toml --apply
bea --file books/main.bean check
bea --file books/main.bean query "SELECT account, sum(position) WHERE account = 'Assets:Checking' GROUP BY account"
bea --file books/main.bean report income-statement --time 2026-09

期待される出力の確認​

プレビューは3 ready, 0 exact duplicates, 0 possible duplicatesを報告し、終了コード0で終了する。適用実行はWrote 3 entriesを報告する。チェックはエラーなしを報告する。残高クエリは当座預金に2958.50 USDを保持する。損益計算書は、経費41.50 USDに対してコンサルティング収入2000.00 USDを示し、純利益1958.50 USDとなる。適用を繰り返すと0 ready, 3 exact duplicatesを報告し、0エントリを書き込む。

レシピが繰り返しジョブになるとき​

上記のプロンプトは手動で駆動される単発タスクに適している。毎週繰り返すジョブには、製品リポジトリ内のバージョン管理されたスキルが適している。以下の各リンクはスキルの現在のソースを開き、独自のセットアップとトリガー手順を持つ。このCMSはこれらのファイルのコピーを保持しない。

  • beancount-initで空のディレクトリから新しい台帳を開始する。台帳ファイル、Favaランナー、Pythonプロジェクトを作成する。
  • beancount-importで銀行エクスポートを分類済みエントリに変換する。各行をステージングし、台帳履歴からカテゴリを提案し、すでにインポートされた行をスキップし、確認後にのみ書き込む。上記のレシピ1はこのジョブの手動形式。
  • beancount-reconcileで1つの勘定科目が明細と一致することを証明する。台帳と明細の差分を取り、確認後に期間末残高アサーションを記録する。
  • beancount-askで帳簿から質問に回答する。読み取り専用クエリを実行し、各クエリをその数値の横に表示する。上記のレシピ2はこのジョブの手動形式。
  • beancount-closeで月次締めを行う。すべてのアクティブな勘定科目を照合し、定期エントリとレビューフラグをチェックし、締めをコミットとして記録する。

完全なコレクションは正規スキルツリーにある。

シェル対応エージェントにbeaを与えるか、クライアントにスキルをロードする​

これらは2つの別々のステップです。beaのインストールはスキルをインストールしたり設定したりすることはありません。

シェル対応エージェントはパス上にコマンドが必要です。CLIクイックスタートでインストールし、その後エージェントはレシピが示す同じbeaコマンドを実行します。エージェントが提案し、あなたがレビューし、beaが検証します。

スキルは、そのクライアント自身のスキルメカニズムを通じて、エージェントクライアント自体にロードされます。製品リポジトリは、両方のサポートされるクライアントに対して1つの正規ツリーを公開します:Claude Codeは.claude/skillsの下でそれを読み、Codexは.agents/skillsの下で、同じソースへのリンクディレクトリとして。クライアントのスキル場所を必要なスキルフォルダに指定し、トリガーフレーズと更新について現在のソースを読み続けてください。

bea askは独自のスキルを別途ロードします。台帳の隣のSKILL.mdから — bea askをスキルで拡張するを参照。

bea askなしのask風質問​

レシピ2は外部エージェントと読み取り専用のbea queryおよびbea reportコマンドで台帳の質問に回答します。そのパスはローカルです。アカウントも追加インストールも不要。

bea askは別の組み込みヘルパーです。上記のレシピでもbeancount-askスキルでもありません。ホスト型AIサービスを通じて質問をルーティングするため、CLIリファレンスに文書化されているように、askエクストラとホスト型認証情報が必要です。まず基本CLIをインストールし、ホスト型回答が必要な場合にのみエクストラを追加してください。

引用出力とCLI検証​

上記のすべてのコマンドは、公開されたbea 0.1.0パッケージに対して新しいディレクトリで実行されました。引用されたカウント、残高、メッセージはCLI検証です。

1つのクライアントが、事前にルールを提供せずにダウンロードの新しいコピーで最初のチャレンジを完了しました。Muse Code 1.1.1(モデルmuse-spark-1.3-contributor)が独自の分類を導出し、3件の準備完了をプレビューして何も書き込まず、3エントリを適用し、2958.50 USDの当座預金と1958.50 USDの9月利益を報告しました — 上記の期待値と一致。適用失敗が1回(サンドボックスキャッシュロック、XDG_CACHE_HOMEで回復)は記録に保持されています。完全なプロンプト、ツールシーケンス、検証は実行トランスクリプトで読むか、デモスクリプトとそのキャプチャ出力で動作パスを再生できます。

その実行は単一実行のCLI出力検証であり、モデルベンチマークではありません。他のクライアント、一般的な会計精度、または無人本番使用について何も主張するものではありません。

完全な証明ストーリー — 入力、方法論、観察結果、失敗、制限、ダウンロード — はあなたのエージェントはこれらの帳簿の残高を合わせられますか?として公開されています。

これらのワークフローの背後にある広範な研究は、Beancount.ioの会計自動化研究ハブであるBean Labsで探索してください。

出典: https://beancount.io/ja/docs/Solutions/accounting-with-ai-agents