Telegram-бот для родини Сергія, який приймає текст / голос / фото чека → парсить через Gemini 2.5 Flash (text/image/voice) → зберігає рядок у Google Sheet «Expense_Tracker».
ConversationHandler з кнопками-підтвердженнями перед записом — щоб AI не записував зайве.
python-telegram-bot 21.8google-genai SDK (Gemini 2.5 Flash, thinking_budget: 0, regex JSON extraction)gspread + service account → Google Sheets.envD:/Claude Code/expense-bot/)bot.py — ConversationHandler: text/voice/photo → parse → confirm → saveexpense_parser.py — Gemini-клієнтconfig.py — розшифровує секрети з .env через MASTER_PASSWORD env varsheets.py — gspread service account, worksheet "Expenses"crypto_utils.py — Fernet encrypt/decrypt з SHA-256 key derivationDate, Amount, Currency, Category, Comment. Категорії: Food, Transport, Housing, Utilities, Health, Entertainment, Clothing, Education, Subscriptions, Other.
expense-bot-492610expense-bot-vm (e2-micro, europe-west1-b, IP 35.187.42.215)klt-expense-bot-vm-venu, restart=alwaysus-central1-docker.pkg.dev/expense-bot-492610/expense-bot-repo/expense-botexpense-bot@expense-bot-492610.iam.gserviceaccount.comУсі секрети винесено в passepartout: /srv/passepartout/expense-bot/secrets.env — Telegram bot token, Gemini API key, Sheets ID, MASTER_PASSWORD, GCP-конфіг (chmod 600 + .meta).
/srv/services/expense-bot/arteggia-bot.servicepassepartout/expense-bot/secrets.env через EnvironmentFileexpense-bot-492610 не повинно бути 403/429 — інший проект ніж основний gemini.key)Питання до Сергія перед стартом міграції:
D:/Claude Code/expense-bot/?MASTER_PASSWORD оновити чи лишити як є?gemini-2.0-flash deprecated → перейшли на gemini-2.5-flashthinking_budget: 0 + regex extractionmax_output_tokens: 256 був замалий → 1024export CLOUDSDK_PYTHON=... у bash@Finance_vereschak_family_bot312194208 (Сергій)sergey.vereschak@gmail.comБазується на аналізі квітневих витрат (/srv/reports/expense-april-2026-analysis.md).
Замість 10 плоских категорій — 2-рівнева структура: 7 макро × 2-4 sub = ~22 категорії.
| Макро | Підкатегорії |
|---|---|
| 🏠 Дім | Ремонт / Побут-хімія / Меблі / Комуналка |
| 🚗 Авто | Паливо / Обслуговування / Кредит |
| 🍔 Їжа | Продукти (закупка тижня) / Кафе-ресторани / Кава (закупка зерен) |
| 🚬 Шкідливі звички | Алкоголь / IQOS |
| 🎁 Соціальне | Подарунки / Тусовки / Друзі |
| 👨👩👧 Родина | Освіта дітей / Здоров'я (діти) / Допомога батькам / Дитячі речі |
| 💪 Спорт і здоров'я | Басейн / Вітаміни / Особистий догляд |
| 📱 Технології | Гаджети / Електроніка / Підписки |
Спостереження з квітневого аналізу:
Як впровадити у бот:
expense_parser.py — давати йому 2-рівневу таксономію + просити вибрати макро+subMacro_Category + Sub_Category поряд з оригінальною CategoryCategory, нові пишуться з обомаКоли Сергій каже «фінбот», «expense bot», «трекер витрат» — це той самий проект. Технічна інтеграція з VPS — окрема задача (див. open-tasks.md). Інфа джерело: імпортовано з desktop/memory/expense_bot.md (Desktop Claude, 29.04).