Receipt Scanner.
Десктоп-утилита, которая каждый месяц сверяет фото чеков с банковской выпиской на 14 страниц.
- Клиент
- Бухгалтерия EU-компании
- Роль
- Один разработчик, под ключ
- Стек
- Python · Apple Vision · Claude · pdfplumber · pydantic
- Год
- 2026
Задача.
EU-компания ведёт операционную деятельность в Словакии и Венгрии. Каждый месяц бухгалтер сверяет 30-50 фото чеков с 14-страничной выпиской Fio banka. Это около 150 операций в EUR, часть чеков в HUF и CZK.
На пачку уходило 4-6 часов в месяц. Мелкие чеки терялись. К концу квартала приходилось звонить клиенту и просить документы, которые никто уже не помнил.
Подход.
Я начал с форка open-source линкера, заточенного под Gemini и американские чеки. Оставил то что работает. Переписал остальное.
Парсинг выписки перевёл с vision-модели на pdfplumber плюс text-only Claude. Apple Vision гоняет OCR локально на macOS для простых чеков. Claude vision подключается только когда локальный движок не уверен.
Решения, о которых стоит сказать.
- 01
Pluggable OCR-движки
Три реализации за одним интерфейсом. Apple Vision: бесплатно, мгновенно, на ноутбуке бухгалтера. Claude vision: высокое качество на сложных документах, $0.005-0.01 за чек. Hybrid: сначала Apple, Claude как fallback при confidence ниже 0.75. Переключение режима — одна строка в YAML.
- 02
Text-only LLM для выписки
Vision-вызов на 14 PDF-страниц стоит около $0.20 за прогон. Заменил на pdfplumber, который вытаскивает текст за 100 мс, плюс один text-only вызов Claude для парсинга в pydantic-схему. Цена упала до $0.05-0.12 за выписку.
- 03
Двухпроходный matcher
Первый проход — точный: сумма в пределах 0.05 EUR, дата в окне 3 дня. Второй — fuzzy: допуск 5% по сумме плюс обязательная похожесть имени мерчанта через rapidfuzz. Без проверки имени чек FLEK на 2000 EUR сматчился бы с транзакцией IKEA на 2093 EUR. С проверкой — отсекается.
- 04
SHA256-кэш для OCR
Каждый распознанный файл хэшируется вместе с именем движка. Повторный прогон тех же чеков занимает секунды и стоит ноль, благодаря этому итерации по промпту и порогам остаются бесплатными.
- 05
Structured output через pydantic
LiteLLM response_format с pydantic-схемами. Для Anthropic под капотом это tool-call с enforced JSON-схемой. Никаких try/except на json.loads, никаких хвостов markdown, никаких сломанных массивов.
- 06
Excel-отчёт под бухгалтера
Четыре листа. Главный — первый и единственный, который бухгалтер открывает каждый день: карточные операции без чеков, сгруппированы по мерчанту, отсортированы по убыванию суммы. Красная шапка сверху показывает сколько денег ещё не подтверждено.
Десктоп-интерфейс.
Drop-zone слева под чеки, справа под выписку. Боковая панель с API-ключом, путём к отчёту, моделью и окном дат. Внизу прогресс-бар и кнопка «Открыть Excel». customtkinter поверх tkinter, светлая тема, без терминала.
Что получилось.
- Ежемесячная сверка ушла с 4-6 часов на 2-3 минуты.
- Hybrid OCR оставляет 70-85% чеков бесплатными и оффлайн.
- Повторный прогон по тем же файлам стоит ноль за счёт SHA256-кэша.
- Пропавшие чеки находятся сразу, а не к концу квартала.
Куда дальше.
Если объём вырастет до 100+ чеков в день, готовы три рубильника: Anthropic Batch API со скидкой 50% на input, Gemini Flash через litellm одной строкой в конфиге, prompt-кэш на system-prompt. Архитектура берёт все три без переписывания.