Перейти к содержанию

Архитектура (обзор для разработчиков и ИИ)

TL;DR

Geni AI — это связка Telegram → n8n → Supabase → WebApps (Cloudflare Pages) → обратно в Telegram.
Вход всех событий — Telegram-бот. Вся маршрутизация и бизнес-логика — в n8n. Данные пользователей, баланс/кошелёк и задачи — в Supabase. Веб-страницы на Cloudflare Pages служат мини-приложениями и передают параметры обратно в n8n. Вызовы моделей идут из n8n, результаты возвращаются в Telegram.


1) Слои (C4-контекст, укрупнённо)

  • Пользователь / Telegram — команды, сообщения, фото, запуск WebApp.
  • n8n (Hub + Tool workflows) — центральный маршрутизатор:
  • Hub (входной воркфлоу, имя начинается с Geni_AI…) принимает апдейты, проверяет баланс, выбирает Tool и запускает сценарий.
  • Tool workflows — сценарии под конкретные режимы/модели (например, seedream).
  • Supabase — таблицы users, wallet_tx, tasks и пр.; RPC-функции get_tool_price_credits, wallet_debit, ensure_user и др.
  • WebApps (Cloudflare Pages) — мини-страницы (например, tgmenu) для выбора настроек; возвращают параметры в n8n.

Полезные разделы: - Каталог воркфлоу n8n: /workflows/ - Обзор БД (таблицы/функции): /data/generated/overview/ - Каталог WebApps: /webapps/


2) Контракты данных (ключевые поля)

  • Из Telegram: chatId, message_id, file_id (photo/document), caption/text.
  • Внутри n8n (унифицированный объект):
    chatId, tool, prompt, files[] (из file_id или dataUrl), price, balance, reply_to_message_id, settings_seedream (quality, ratio, dims_t2i, long_edge_i2i).
  • RPC Supabase (смысл):
  • get_tool_price_credits(tool, feature) → цена в кредитах;
  • wallet_debit(user_id, amount) → списание средств;
  • ensure_user(tg_user_id, ...) → создание/поиск пользователя и базовых настроек.
  • WebApps → n8n: режим t2i/i2i, настройки качества/соотношения, привязка к chatId, иногда ссылки/данные изображения.

3) Типовые последовательности

  1. Text-to-Image (t2i):
  2. Telegram: пользователь отправляет текст;
  3. n8n Hub: определяет tool, спрашивает get_tool_price_credits, делает wallet_debit;
  4. Tool workflow: формирует запрос к провайдеру модели, получает URL изображения;
  5. Telegram: отсылает результат пользователю.

  6. Image-to-Image (i2i):

  7. Пользователь присылает фото (может накапливаться в «корзине»), затем текст;
  8. n8n: нормализует вход (массива images), выбирает целевую «длинную сторону» (long_edge_i2i);
  9. Вызов модели и возврат результата в Telegram.

  10. Недостаточно кредитов:

  11. После оценки цены Hub видит, что balance < price;
  12. Отправляет в Telegram подсказку пополнить счёт и не запускает генерацию.

4) Глоссарий (единые термины)

  • Hub (входной воркфлоу): главный роутер n8n, имя начинается с Geni_AI….
  • Tool workflow: воркфлоу под конкретный режим/модель (например, seedream).
  • Photo bucket (seedream): временное хранение фото в staticData (состояния STORED/GENERATE/CLEARED/REMIND).
  • Task: запись в БД о запуске операции; статусы created → running → success/failed.
  • Wallet: кредиты, которые списываются перед вызовом модели и возвращаются при ошибке.

5) Карта зависимостей (куда кто ходит)

  • n8n → Supabase: get_tool_price_credits, wallet_debit, ensure_user, обновление статусов задач.
  • n8n → Модели: HTTP-вызовы провайдера (пример: Comet API, модель seedream).
  • WebApps → n8n: формы/кнопки передают настройки генерации (режим, размеры, качество, и т.д.).

6) Расширение системы (правильный путь)

  1. Добавьте новый Tool workflow в n8n: объявите входные поля и ожидаемый формат ответа.
  2. Опишите цену через get_tool_price_credits и проводите списание через wallet_debit до вызова модели.
  3. Если нужен UI — добавьте страницу в WebApps, возвращающую параметры в том же контракте.
  4. Логируйте task и обновляйте статус; при ошибке обеспечьте refund и понятное сообщение в Telegram.
  5. Используйте существующие имена полей/таблиц; не вводите новые без необходимости.

7) Ограничения и безопасность

  • Токены внешних провайдеров хранятся в n8n Credentials (ограниченный доступ).
  • В БД сохраняется минимум персональных данных, фото/файлы не логируются в открытые журналы.
  • Ветка ошибок должна возвращать пользователю понятные причины и не раскрывать чувствительные детали.