给外部AI智能体安排两项记账工作,并让你审查每一项账本变更:先预览再检查地导入银行CSV,然后通过查询和报表输出回答余额问题。
通过CLI快速入门安装bea。本地导入、查询和报表命令不需要Beancount.io账户。你的聊天智能体只需要自己的订阅或API密钥。只有内置的bea ask辅助工具需要托管凭据,而这些配方不使用它。
在选择工具?五种面向AI智能体的记账工具在相同的智能体工作流标准下比较了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个就绪,0个完全重复,0个可能重复并以0退出。它不写入任何内容。应用运行报告已写入3个条目。检查报告没有错误。!队列列出来自Unknown Shop的一行未匹配记录,金额为-9.99 USD。余额查询报告活期账户中有930.01 USD。重复应用报告0个就绪,3个完全重复并写入0个条目。
审查和纠正
在阅读!行之后,在你的账本中谨慎地重新分类它。通过的检查只证明账本平衡。它并没有说明Expenses:Uncategorized是否是正确的账户。关于重复策略、冲突处理以及高级Python路径,请参阅银行CSV演练。
配方2:回答不带写入的余额问题
从演示账簿回答一个问题: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。
第一个挑战:平衡三个合成行
一个可移植的入门挑战,具有明确的输入和独立推导的答案。下载以下三个文件,运行导入,并检查两个总数。不需要账户,也不需要产品结账。
在2026-09-01以USD开设账簿,活期账户中有1000 USD。记录三个9月的行:一笔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得出。两个预期都来自这个算术,而不是报表输出。
准备输入
创建目录并开设模板未包含的两个账户。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这三个命令产生下面的账本。下载为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个就绪,0个完全重复,0个可能重复并以0退出。应用运行报告已写入3个条目。检查报告没有错误。余额查询显示活期账户中有2958.50 USD。损益表显示2000.00 USD的咨询收入对41.50 USD的费用,净利润为1958.50 USD。重复应用报告0个就绪,3个完全重复并写入0个条目。
当配方变成重复性工作
上面的提示词适合手动驱动的一次性任务。你每周重复的工作适合产品仓库中的版本化技能。下面的每个链接都打开技能的当前源代码,其中包含自己的设置和触发说明。此CMS不保存这些文件的副本。
- 从空目录开始一个新账本,使用beancount-init。它创建账本文件、Fava运行器和一个Python项目。
- 将银行导出转换为分类条目,使用beancount-import。它暂存每一行,从账本历史中建议类别,跳过已导入的行,并且只在确认后写入。上面的配方1是这项工作的手动形式。
- 证明一个账户与其账单匹配,使用beancount-reconcile。它将账本与账单进行差异比较,并在确认后落地一个期末余额断言。
- 从账簿中回答问题,使用beancount-ask。它运行只读查询,并将每个查询与结果数字并排显示。上面的配方2是这项工作的手动形式。
- 结束一个月,使用beancount-close。它核对每个活跃账户,检查重复条目和审查标志,并将关账记录为一次提交。
完整的集合位于规范技能树中。
给能运行Shell的智能体提供bea,或将技能加载到客户端中
这是两个独立的步骤。安装bea永远不会安装或配置技能。
能运行Shell的智能体需要命令在其路径上。通过CLI快速入门安装它,然后智能体运行配方中显示的相同bea命令。智能体提出建议,你审查,bea验证。
技能通过客户端自己的技能机制加载到智能体客户端本身中。产品仓库向两个受支持的客户端暴露一个规范的树:Claude Code在.claude/skills下读取它,Codex在.agents/skills下读取,作为指向同一源代码的链接目录。将客户端的技能位置指向你需要的技能文件夹,并继续阅读其当前源代码以获取触发短语和更新。
bea ask单独加载自己的技能,从你的账本旁边的SKILL.md — 参见使用技能扩展bea ask。
不通过bea ask回答类似提问
配方2使用外部智能体加上只读的bea query和bea report命令回答账本问题。该路径是本地的。它不需要账户,也不需要额外安装。
bea ask是一个单独的内置辅助工具。它既不是上面的配方,也不是beancount-ask技能。它通过托管AI服务路由问题,因此需要ask附加组件和托管凭据,如CLI参考中所述。先安装基础CLI,然后仅在你想要托管答案时才添加附加组件。
引用的输出和CLI验证
上面的每个命令都是在全新目录中针对已发布的bea 0.1.0包执行的。引用的计数、余额和消息是CLI验证。
一位客户在完全新的下载副本上完成了第一个挑战,没有预先提供规则。Muse Code 1.1.1(模型muse-spark-1.3-contributor)推导了自己的分类,预览了3个就绪且未写入任何内容,应用了3个条目,并报告了2958.50 USD的活期余额和1958.50 USD的9月利润 — 与上面的预期一致。它的一次失败应用(一个沙盒化的缓存锁,通过XDG_CACHE_HOME恢复)保留在记录中。在运行记录中阅读完整的提示词、工具序列和验证,或使用演示脚本及其捕获输出重放有效路径。
该运行是对单次执行的CLI输出验证,不是模型基准。它不对其他客户端、一般会计准确性或无人值守的生产使用做出任何声明。
完整的证明故事 — 输入、方法论、观察到的结果、失败、限制和下载 — 发布在你的智能体能平衡这些账簿吗?。
在Bean Labs探索这些工作流背后的更广泛研究,这是Beancount.io的会计自动化研究中心。