Перейти к основному содержимому

Дайте ИИ-агенту книгу учёта Beancount с помощью bea

Дайте ИИ-агенту две бухгалтерские задачи с bea: импорт банковского CSV с предварительным просмотром и ответ на вопрос о балансе через BQL и вывод отчёта.

Поручите внешнему ИИ-агенту две задачи по бухгалтерии, сохраняя каждое изменение в книге под вашим контролем: импорт банковского CSV с проверкой на основе предварительного просмотра, затем ответ на вопрос о балансе на основе запроса и вывода отчёта.

Установите bea с помощью краткого руководства по CLI. Локальные команды импорта, запроса и отчёта не требуют учётной записи Beancount.io. Вашему чат-агенту нужна только собственная подписка или ключ API. Только встроенному помощнику bea ask нужны размещённые учётные данные, и эти рецепты его не используют.

Выбираете инструменты? Пять бухгалтерских инструментов для ИИ-агентов сравнивает 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. Запрос баланса сообщает 930.01 USD на расчётном счёте. Повторное применение сообщает 0 ready, 3 exact duplicates и записывает 0 записей.

Проверка и исправление​

Перекатегоризируйте строку ! осознанно в вашей книге после её прочтения. Успешная проверка лишь доказывает, что книга сбалансирована. Она ничего не говорит о том, правильный ли это счёт Expenses:Uncategorized. О политике дубликатов, обработке конфликтов и продвинутом пути на Python см. пошаговое руководство по импорту банковских CSV.

Рецепт 2: ответ на вопрос о балансе без записи​

Ответьте на один вопрос по демонстрационным книгам: сколько ушло на продукты и топливо в августе 2026 года. Агент составляет запрос. Команды только для чтения дают ответ.

Предварительные требования​

Вам нужна демонстрационная книга из рецепта 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.

Проверьте ожидаемый вывод​

Запрос сообщает 20.00 USD для Expenses:Groceries, 40.00 USD для Expenses:Transport:Fuel и 9.99 USD для Expenses:Uncategorized. Продукты плюс топливо составляют 60.00 USD. Отчёт о прибылях и убытках согласен: 69.99 USD августовских расходов с чистой прибылью -69.99 USD. JSON-вариант возвращает те же строки внутри data.rows с метаданными столбцов в data.columns.

Проверка и исправление​

Запрос по неправильному имени счёта выводит (no rows) в stderr и всё равно завершается с кодом 0. Сравните имя с выводом bea list open и выполните запрос снова. Никогда не исправляйте неожиданный итог, редактируя книгу, чтобы она соответствовала ответу. Исправьте запрос или исправьте книги, затем снова выполните bea check.

Первое задание: балансировка трёх синтетических строк​

Простое первое задание с явными входными данными и независимо выведенным ответом. Скачайте три файла ниже, выполните импорт и проверьте два итога. Никакой учётной записи и никакого оформления заказа.

Откройте книги на 2026-09-01 в USD с 1000 USD на расчётном счёте. Добавьте три сентябрьские строки: платёж клиента на 2000.00 USD, счёт за хостинг на 29.00 USD и визит в кафе за 12.50 USD. Расчётный счёт заканчивается на 2958.50 USD, из 1000 + 2000 - 29 - 12.50. Сентябрьская прибыль составляет 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 ready, 0 exact duplicates, 0 possible duplicates и завершается с кодом 0. Применение сообщает Wrote 3 entries. Проверка не сообщает об ошибках. Запрос баланса показывает 2958.50 USD на расчётном счёте. Отчёт о прибылях и убытках показывает 2000.00 USD дохода от консалтинга против 41.50 USD расходов, с чистой прибылью 1958.50 USD. Повторное применение сообщает 0 ready, 3 exact duplicates и записывает 0 записей.

Когда рецепт становится повторяемой задачей​

Промпты выше подходят для одноразовых задач, выполняемых вручную. Для еженедельных задач подходят версионированные навыки в репозитории продукта. Каждая ссылка ниже открывает текущий исходный код навыка с его собственными инструкциями по настройке и запуску. Эта CMS не хранит копий этих файлов.

  • Начните новую книгу с пустой директории с помощью beancount-init. Он создаёт файл книги, запускатель Fava и Python-проект.
  • Превратите банковскую выписку в категоризированные записи с помощью beancount-import. Он размещает каждую строку, предлагает категории из истории книги, пропускает уже импортированные строки и записывает только после подтверждения. Рецепт 1 выше — ручная форма этой задачи.
  • Докажите, что один счёт соответствует своей выписке, с помощью beancount-reconcile. Он сравнивает книгу с выпиской и фиксирует сверку баланса на конец периода после подтверждения.
  • Ответьте на вопрос по книгам с помощью beancount-ask. Он выполняет запросы только для чтения и показывает каждый запрос рядом с его результатом. Рецепт 2 выше — ручная форма этой задачи.
  • Закройте месяц с помощью beancount-close. Он сверяет каждый активный счёт, проверяет повторяющиеся записи и флаги обзора и фиксирует закрытие как коммит.

Полная коллекция находится в каноническом дереве навыков.

Дайте агенту с доступом к оболочке bea или загрузите навык в клиент​

Это два отдельных шага. Установка bea никогда не устанавливает и не настраивает навыки.

Агенту с доступом к оболочке нужна команда в его пути. Установите её с помощью краткого руководства по CLI, и тогда агент выполняет те же команды bea, которые показаны в рецептах. Агент предлагает, вы проверяете, а bea проверяет.

Навык загружается в клиент агента через собственный механизм навыков этого клиента. Репозиторий продукта предоставляет одно каноническое дерево для обоих поддерживаемых клиентов: Claude Code читает его в .claude/skills, а Codex — в .agents/skills, как связанные директории в один и тот же источник. Укажите местоположение навыков клиента на нужную папку навыка и продолжайте читать его текущий исходный код для фраз-триггеров и обновлений.

bea ask загружает свои собственные навыки отдельно из SKILL.md рядом с вашей книгой — см. Расширение bea ask навыками.

Вопросы в стиле ask без bea ask​

Рецепт 2 отвечает на вопросы по книге с помощью внешнего агента плюс команды bea query и bea report только для чтения. Этот путь локальный. Он не требует учётной записи и дополнительной установки.

bea ask — отдельный встроенный помощник. Он не является ни рецептом выше, ни навыком beancount-ask. Он направляет вопрос через размещённый ИИ-сервис, поэтому требует дополнительный пакет 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 — что соответствует ожиданиям выше. Его одна неудачная попытка применения (заблокированный кэш в песочнице, восстановленный через XDG_CACHE_HOME) сохранена в записи. Прочитайте полный промпт, последовательность инструментов и проверку в транскрипте выполнения или воспроизведите рабочий путь с помощью демонстрационного скрипта и его захваченного вывода.

Этот запуск — проверка вывода CLI для одного выполнения, а не бенчмарк модели. Он не говорит ничего о других клиентах, общей точности бухгалтерии или неавтоматизированном производственном использовании.

Полная история доказательства — входные данные, методология, наблюдаемые результаты, сбои, ограничения и загрузки — опубликована как Может ли ваш агент сбалансировать эти книги?.

Изучите более широкие исследования за этими рабочими процессами на Bean Labs, исследовательском центре автоматизации бухгалтерии Beancount.io.

Источник: https://beancount.io/ru/docs/Solutions/accounting-with-ai-agents