Telegram AI-бот «ИИ-Генерашка»
Telegram-сервис, где пользователь описывает идею текстом — и получает картинку или видео уровня студийной генерации. Собирает под одним капотом Flux, Kling, LivePortrait и Real-ESRGAN, считает кредиты, принимает карты, USDT и Telegram Stars, и всё это — с внутренней админкой и реферальной программой. Продукт на Python + aiogram + Postgres, написанный в связке с Claude Code.
- 6 режимов генерации — видео, картинка, оживление, реставрация, апскейл, колоризация
- 3 способа оплаты в одном окне — карта, криптовалюта, Telegram Stars
- ~60с среднее время генерации видео 5 сек через Kling
- 24/7 режим работы · webhook + очередь задач, без простоя
Задача
Построить массовый AI-сервис в Telegram, где любой пользователь без аккаунтов на OpenAI, fal.ai и Replicate, без иностранной карты и сложных настроек может одним нажатием сгенерировать изображение или видео — и заплатить за это привычным способом. Ключевое ограничение: российский рынок — карты Mastercard и Visa в большинстве зарубежных провайдеров не работают.
- Доступность. Отсутствие порога входа: никаких отдельных регистраций на зарубежных сервисах и иностранных карт.
- Много моделей в одном интерфейсе. Flux для картинок, Kling для видео, LivePortrait для анимации лиц, Real-ESRGAN для апскейла — каждая со своими API, лимитами и форматами.
- Деньги. Платежи ЮKassa (рубли), CryptoBot (USDT) и Telegram Stars под одним окном — с одной и той же корзиной.
- Масштаб. Десятки одновременных задач на внешних API, без блокировки бота и без потери запросов.
Архитектура — единый backend
Бот — тонкий Telegram-клиент поверх слоёв оплат, AI-провайдеров и кредитной системы. Вся логика централизована: aiogram принимает апдейт, FSM ведёт пользователя по сценарию, credits-сервис резервирует баланс, AI-клиент запускает задачу у нужного провайдера, на результат подвязан коллбэк — и только после успешного ответа списывается баланс.
- aiogram 3 + aiohttp webhook — production-ready приём апдейтов без long-polling.
- FSM на Redis — состояния пользователей (выбор типа генерации → длительность → промпт → подтверждение).
- Postgres — пользователи, балансы, транзакции, генерации, рефералы, аудит.
- Thin clients для AI — отдельные модули под fal.ai, Replicate, OpenAI, OpenRouter. Общая база, единый retry-механизм.
- Payments-уровень — ЮKassa, CryptoBot, Telegram Stars через один контракт «купить N кредитов».
- Docker Compose — бот, Postgres, Redis в одном стеке; перенос окружения — одна команда.
┌─────────────────────────────────────┐ │ Telegram Bot API │ └────────────────┬────────────────────┘ │ webhook ▼ ┌──────────────────────────────────────────────────────────────────┐ │ aiogram 3 · aiohttp server · Dispatcher + Routers │ │ │ │ ┌────────────────┐ ┌───────────────┐ ┌──────────────────┐ │ │ │ FSM · Redis │ │ Credits svc │ │ Moderation │ │ │ └────────────────┘ └──────┬────────┘ └──────────────────┘ │ │ │ reserve/commit │ │ ▼ │ │ ┌───────────────┐ │ │ │ Postgres │◄──── audit log │ │ └───────────────┘ │ └────────────────┬─────────────────────────────────┬───────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────────┐ │ AI providers │ │ Payments │ ├──────────────────┤ ├──────────────────────┤ │ fal.ai · Flux │ │ ЮKassa · cards │ │ fal.ai · Kling │ │ CryptoBot · USDT │ │ Replicate · LP │ │ Telegram Stars │ │ Replicate · ESR │ └──────────────────────┘ │ OpenAI · prompt │ └──────────────────┘
архитектура бота — тонкий telegram-слой, единое ядро кредитов, внешние провайдеры через изолированные клиенты
Сценарий пользователя
Пользователь проходит от «Меню» до готового файла за 4 тапа. FSM ведёт по воронке, на каждом шаге показывая только релевантные кнопки и стоимость в кредитах. Никаких «введите команду» — только inline-клавиатура.
Генерация видео — fal.ai / Kling
Пользователь вводит текстовое описание сцены, бот показывает превью запроса со стоимостью в кредитах и запускает задачу на Kling через fal.ai. Длинные промпты на русском перед отправкой прогоняются через prompt-translator — модели лучше понимают английский.
- Text-to-Video → Kling · 5 или 10 сек
- Image-to-Video → оживление статичного кадра
- Prompt translator → RU → EN до отправки
- Reserve → generate → commit — кредиты списываются только после успеха
- Retry + timeout — при падении провайдера задача возвращается в очередь, кредиты остаются у пользователя
На выходе бот присылает mp4 в чат, сохраняет промпт и результат в истории (чтобы пользователь мог потом пересмотреть) и предлагает «главное меню» одной кнопкой.
Генерация изображений — fal.ai / Flux
Flux работает как «premium-уровень» — тот же промпт, но на выходе фотореалистичное изображение за 8 кредитов. Пользователь может исправить промпт до отправки, отменить задачу или сгенерировать ещё раз с той же подводкой.
- Модель — Flux (fal.ai), режим Premium
- Стоимость — 8 кредитов за кадр
- Редактор промпта — можно переписать перед генерацией
- Результат — изображение сохраняется в историю пользователя
AI-стек под капотом
Каждый провайдер изолирован в отдельном клиенте с общим базовым контрактом. Это позволяет переключать провайдера без правок в хендлерах — и тестировать новые модели параллельно с продом.
- Flux — text-to-image, фотореализм
- Kling — text-to-video и image-to-video, 5/10 сек
- LivePortrait — оживление фото (закрывает глаза, улыбается, говорит)
- Expression Editor — точечная правка выражения лица
- CodeFormer — реставрация лиц на старых фото
- Real-ESRGAN — апскейл разрешения × 2 / × 4
- DDColor — колоризация чёрно-белых фото
- OpenAI — модерация ввода и prompt-translator RU→EN
- OpenRouter — резервный роутер к другим моделям
- Postgres — транзакционное ядро
- Redis — FSM-хранилище, кэш лимитов
- Docker Compose — воспроизводимое окружение
- aiohttp — webhook-сервер для Telegram API
Платёжный слой — три рельса
Внутренняя валюта бота — кредиты, пакеты от 50 до 3000. Чем больше пакет — тем выше скидка, до 10%. На этапе подтверждения заказа пользователь выбирает один из трёх рельсов: банковская карта через ЮKassa (вместе с SberPay, ЮMoney и СБП), криптовалюта через CryptoBot или Telegram Stars. Каждый поток обрабатывает отдельный клиент, но баланс пополняется атомарно — одной транзакцией в Postgres.
- ЮKassa — банковская карта, SberPay, ЮMoney, СБП через приложение банка. Чеки и возвраты. Основной канал для РФ.
- CryptoBot — USDT, TON, BTC, ETH, USDC, SOL, TRX, DOGE, LTC, BNB и другие монеты. Для аудитории без карты или вне РФ.
- Telegram Stars — нативная валюта Telegram, минимальное трение в мобильном приложении на iOS / Android.
user taps «Купить 500 кр» │ ▼ ┌─────────────────┐ │ FSM → payment │ ← сохраняем pkg_id, способ оплаты └────────┬────────┘ │ ▼ ┌──────────────────────────┐ ┌────────────────────┐ │ payment provider client │ ───► │ ЮKassa / Crypto / │ │ (one of 3 adapters) │ │ Stars API │ └────────┬─────────────────┘ └──────────┬─────────┘ │ │ webhook · status ▼ ▼ ┌──────────────────────────────────────────────────────┐ │ credits_service.apply(pkg_id, user_id, provider_tx) │ │ ── atomic UPDATE users SET balance = balance + N │ │ ── INSERT transactions (audit) │ │ ── ON CONFLICT(provider_tx) DO NOTHING (idempotent)│ └──────────────────────────────────────────────────────┘ │ ▼ Telegram notification → «баланс пополнен»
единый контракт: 3 разных провайдера — одна функция применения баланса · идемпотентность по provider_tx
Реферальная программа
Рост органический — каждый пользователь получает персональную ссылку t.me/…?start=ref_<id>. Бонус в 10 кредитов зачисляется не за простую регистрацию, а только когда приглашённый друг делает покупку от 100 кредитов в течение 8 часов — это защищает систему от фермы-ботов и поощряет «качественный» трафик.
- Бонус — 10 кредитов за покупающего друга
- Условие — покупка от 100 кр в течение 8 часов после регистрации
- Защита — строгая идемпотентность, нельзя пригласить самого себя
- Напоминания — отдельная задача из админки: письмо рефералам, так и не совершившим покупку
Админ-панель
Внутренняя консоль владельца бота вызывается командой /admin. Вся аналитика и управление — в одном меню, без отдельной веб-админки. Это держит стек узким и позволяет администрировать бота прямо из Telegram с телефона.
- Общая / детальная статистика — MAU, генерации, конверсия
- Касса — сводка по оплатам и способам
- Баланс сервисов — остатки на fal.ai / Replicate / OpenAI
- Список пользователей + поиск
- Рассылка — массовое уведомление
- Напоминания рефералам — отдельный таск
- Аудит действий — каждое списание баланса логируется
Deep dive — кредиты, транзакции, целостность
Риск в таком боте — не «неправильный промпт», а поломанный баланс. Два сценария, которые я заранее закрыл архитектурно: провайдер упал посреди генерации, и webhook оплаты прилетел дважды. Ниже — как это решено.
Двухфазное списание баланса
Перед запуском задачи кредиты резервируются — вычитаются из доступного баланса, но остаются в отдельной «холдовой» колонке. Если провайдер вернул успех — commit, если упал или превысил timeout — release, кредиты возвращаются. Пользователь никогда не теряет деньги из-за падения внешнего API.
Идемпотентность платежей
Каждый provider_tx (id транзакции у ЮKassa/CryptoBot/Stars) записывается в таблицу с UNIQUE-констрейнтом. Двойной webhook — ON CONFLICT DO NOTHING, баланс пополняется один раз. То же правило — для рефералов: связка (referrer_id, referee_id) уникальна.
Полный аудит
Каждое изменение баланса пишется отдельной строкой в ledger: user_id, delta, reason, provider_tx, created_at. Сумма всех delta всегда равна текущему балансу — инвариант проверяется фоновой задачей. Любой спор с пользователем разбирается за секунды.
Входной фильтр
Перед запуском задачи промпт проходит модерацию OpenAI. Параллельно — per-user rate-limit на Redis: не больше N генераций в минуту. Это защищает бюджет на внешние API от случайного и намеренного слива.
-- credits core CREATE TABLE users ( user_id BIGINT PRIMARY KEY, balance NUMERIC(12, 2) NOT NULL DEFAULT 0, balance_held NUMERIC(12, 2) NOT NULL DEFAULT 0, created_at TIMESTAMPTZ DEFAULT now() ); CREATE TABLE ledger ( id BIGSERIAL PRIMARY KEY, user_id BIGINT REFERENCES users, delta NUMERIC(12, 2) NOT NULL, reason TEXT NOT NULL, -- reserve | commit | release | topup | refund provider_tx TEXT UNIQUE, -- идемпотентность платежей created_at TIMESTAMPTZ DEFAULT now() ); -- реферальные связи, один referee — один referrer CREATE TABLE referrals ( referrer_id BIGINT REFERENCES users, referee_id BIGINT REFERENCES users UNIQUE, bonus_paid BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ DEFAULT now() );
ядро данных · идемпотентность и holds встроены на уровне схемы
Результат
- AI-сервис доступен любому в Telegram. Без регистраций на зарубежных сервисах, без иностранной карты — только Telegram и привычный способ оплаты.
- 6 режимов генерации под одним меню. Flux, Kling, LivePortrait, Real-ESRGAN, CodeFormer, DDColor — пользователь не видит сложности, видит кнопки.
- 3 платёжных рельса. Карты, крипта, Stars — разные аудитории, одна корзина, один баланс.
- Архитектура, выдерживающая падения. Двухфазные списания, идемпотентные вебхуки, полный аудит — ни одной потерянной копейки даже при сбоях провайдеров.
- Админ-панель в самом Telegram. Статистика, касса, рассылки и аудит — без отдельного веб-интерфейса.
Нужен похожий AI-продукт?
Если у вас есть идея AI-сервиса для Telegram или веба — от MVP до продакшна с биллингом, платежами и админкой — напишите.
← все работы