Текучка Пузырика — Telegram бот
@puzyrikinboxbot — бот для захвата информации с телефона в wiki.
Стек
- aiogram 3.x (Telegram Bot API)
- Whisper base (локальная транскрибация, бесплатно)
- Claude Opus 4 через OpenRouter (описание фото/скринов, извлечение расходов)
- ChromaDB (paraphrase-multilingual-MiniLM-L12-v2) — индексация inbox
- Google Calendar API
- yaml, httpx, sentence-transformers
Основные функции
Захват (Capture)
- Текст → inbox + авто-детект расходов (≤80 символов) и дат
- Голосовые → Whisper → inbox + авто-детект дат
- Фото → Opus описание → inbox + извлечение расходов из банковских пушей
- Форварды → inbox с указанием источника
- Документы → файл в inbox/files/
- Видео/кружки → inbox (без транскрипции)
Защита от ложных расходов (фикс 16 апреля)
- Порог 80 символов — текст >80 символов = заметка, расход не детектится. "В посольстве сбор 75 евро, нужно собрать документы" → только inbox.
- FUTURE_MARKERS — regex фильтр: "потом", "надо будет", "будет стоить", "планирую", "собираюсь", "хочу купить", "думаю взять", "будем платить", "придётся" → не расход.
- Для фото — промпт Opus требует финансовый JSON только для чеков/пушей/квитанций. Информационные цены ("сбор 75 EUR на сайте посольства") — пока решается вечерним ревью.
Google Calendar
Авто-детект дат на русском → Google Calendar событие. Работает и в обычных сообщениях, и через /cal. Поддержка: дни недели, "завтра"/"послезавтра"/"сегодня", "16 апреля", DD.MM. Ремайндеры: за 1 час и за 24 часа.
Переключение таймзоны
/vakhta → Казахстан UTC+5, /riga → Латвия UTC+3. Влияет на: inbox дату, расходы, напоминание, детект дат. По умолчанию: UTC+3 (Рига).
Финансовый захват
Из фото (Opus Vision)
Скриншоты банковских пушей (Revolut, Kaspi, Swedbank) → JSON с amount/currency/group/subcategory/merchant.
OpenRouter lock (asyncio.Lock) — при пачке фото запросы идут последовательно, не забивают API.
Из текста (regex)
"пиво 5 евро", "парковка 25000 тенге" — только для коротких сообщений (≤80 символов). Валюты: EUR, USD, KZT, лат→EUR. Автокатегоризация по 30+ ключевым словам.
Курс валют
"курс 515" → EUR/KZT сохранён. Используется в /expenses.
Хранение
- finances/expenses.jsonl — расходы (JSON Lines)
- finances/rates.jsonl — курсы валют
- Поля расхода: amount, currency, group, subcategory, merchant, date, description, source, photo, saved_at
Категории расходов
- obyazalka_riga (1500 EUR): shkoly, tekuchka_detey, tekuchka_semya
- tekuchka (1400 EUR): itunes_podpiski, pivasik, produkty, bilety_samolyot, svyaz, kommunalka, transport, ipoteka_riga, sport_krasota, repetitory, detskiy_sport, drugoe
- ipoteki_arendy (1200 EUR): ipoteki, arenda_semya
- avtomobil: lizing, moyka, nalog, parkovka, remont, strahovka, toplivo, shtrafy, tehosmotr, zapchasti, tyuning
- puteshestviya: gostinitsy, sladosti, sotovaya_svyaz, transport, ekskursii, bilety, produkty, kafeshki, zapravka, drugoe
- finansy: oplata_uslug, komissiya_bankov, dolgi, tekushchie_kredity, kursovaya_raznitsa
- dom_kzt (KZT): dacha, mebel, sklad, remont, uborka, nalog_nedvizhimost, ohrana, pokupka_nedvizhimosti, raznaya_meloch, strahovka
- investitsii: investitsii, nakopleniya
- rabochie_poezdki (KZT): arenda_kvartiry, transport, zavtraki_obedy, parkovka, produkty, gostinitsy, raznaya_meloch, posidelki_s_kollegami
- obraz_zhizni: podarki, razvlecheniya, sladosti, kafeshki, dlya_sobaki, elektronika, kosmetika, igry, igrushki, knigi, apteki, odezhda, temu, vrachi, protein, drugoe
- ucheba: kursy, uchebniki, ekskursii
- dohod: zarplata, podarki, dohod_biznes, dividendy, protsenty, cashback, treyding, drugoe
Команды
- /start, /help — приветствие
- /status — количество записей за сегодня
- /inbox — сегодняшний inbox (до 4000 символов)
- /cal <текст> — создать событие в календаре
- /expenses — последние 10 расходов с итогами EUR/KZT + курс
- /vakhta — UTC+5 Казахстан
- /riga — UTC+3 Латвия
Вечернее напоминание
21:00 по текущей таймзоне → "Не забудь разобрать в Cowork!"
ChromaDB
После каждой записи → background thread обновляет embeddings. Модель: paraphrase-multilingual-MiniLM-L12-v2, коллекция: wiki.
Отображение ответов
- Текст ≤300 символов → целиком, >300 → обрезка до 120 + "..."
- Фото описание ≤500 символов → целиком, >500 → 200 + "..."
- Расход — тихо в конце ответа, если есть
Устойчивость
- Photo graceful error — если Opus упал, фото всё равно сохраняется в inbox с пометкой ошибки
- OpenRouter lock — пачка фото не забивает API
- Unique filenames —
file_unique_idв имени, нет коллизий при одновременных фото
Кодовая база
~1060 строк, один файл bot.py на сервере. Локальные файлы в iCloud ОТСТАЮТ от серверной версии. Патчи (patch_wiki.py, patch_multi_expense.py) — возможно ещё не применены к текущей версии на сервере.
Деплой
Сервер: Hetzner CPX52 (46.62.238.135) Путь: /opt/tekuchka-bot/ Сервис: systemd tekuchka-bot Процесс: правка → scp на сервер → systemctl restart tekuchka-bot
Связанные
- [[system/tekuchka_bot]] — workflow
- [[finansy/budget_structure_2026]] — бюджет
- [[finansy/expense_dashboard_plan]] — план дашборда