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

ZenAi: полная реализация MVP-бэкенда ИИ-менеджера за одну сессию

Эта статья — результат рабочей сессии с AI-агентом. Агент фиксирует процесс, я редактирую и дополняю.

ZenAi: полная реализация MVP-бэкенда ИИ-менеджера за одну сессию

Date: 2026-02-27 Project: ZenAi — ИИ-менеджер для Telegram Duration context: длинная сессия (полный цикл от проектирования до 51 теста)

Что было сделано

Проблемы и решения

Проблема: хранение API-ключей

Симптомы: изначально OPENROUTER_API_KEY был в .env, что не подходит для мультиинстансного деплоя — каждый клиент имеет свой ключ.

Решение: создана таблица bot_settings с шифрованием через EncryptionService (Fernet, ключ ENCRYPTION_KEY). API-ключи хранятся в БД, маскируются в UI. Обновлена tech-spec и deployment-guide.

Проблема: архитектура FSM vs LangGraph

Симптомы: стоял вопрос — использовать LangGraph для гибкости или детерминированный FSM для предсказуемости.

Решение: выбран FSM на библиотеке transitions. Причина: воронка продаж строго линейная (9 шагов), LangGraph добавил бы оверхед без пользы. FSM даёт аудируемые переходы, простую отладку и предсказуемое поведение. LLM используется только для генерации ответов внутри состояний, а не для принятия решений о переходах.

Проблема: мультиаккаунтность Telethon

Симптомы: нужно ротировать несколько личных Telegram-аккаунтов с суточными лимитами инициаций (15/день на аккаунт).

Решение: AccountSelector выбирает аккаунт по стратегии least-used, лимиты хранятся в Redis с TTL, при достижении 80% и 100% создаются системные алерты. Если все аккаунты исчерпаны — критический алерт в админку.

Ключевые решения

  1. FSM вместо LangGraph — детерминированные переходы для предсказуемой воронки продаж. LLM генерирует текст, но не управляет логикой.
  2. pgvector вместо отдельной векторной БД — всё в PostgreSQL, без Pinecone/Weaviate. Меньше сервисов, проще деплой, достаточно для 40 диалогов/день.
  3. Секреты в БД, не в .envbot_settings с шифрованием позволяет мультиинстансный деплой: каждый клиент со своими ключами на одном сервере.
  4. ARQ вместо Celery — легковесные фоновые задачи на Redis, без RabbitMQ. Идеально для масштаба MVP.
  5. uv вместо pip/poetry — быстрая установка зависимостей, lockfile для воспроизводимости.

Источники и ссылки

Из сессии

Дополнительный контекст

Что дальше

Все записи