Тот самый 19-летний «визионер»: показываю архитектуру своего AI-бота для микро-обучения (n8n + Supabase + OpenAI)
Всем привет, это снова Никита. 1-2 месяца назад я опубликовал свой первый пост-знакомство, где рассказал, что в 19 лет решил не идти в найм, взял академ и строю свои продукты с помощью ИИ. Реакция была... бурной. Мне предрекли судьбу «старухи у разбитого корыта» и справедливо заметили, что «визионер» без хард-скиллов - это просто мечтатель.
Я прочитал каждый комментарий. Спасибо вам за критику, она была нужна. Но, как я и обещал в комментариях, лучшим ответом на скепсис будет не спор, а готовый продукт. Я не слился. Я продолжаю работать.
Сегодня я хочу убрать лирику и показать «мясо». Я расскажу, как именно устроен мой бот SkillDay, который я собрал на no-code платформе n8n, используя Supabase в качестве бэкенда и OpenAI как генератор контента.
Архитектура: Как это работает под капотом.
Мой стек выглядит так:
Логика и оркестрация: n8n (railway hosted).
База данных: Supabase (PostgreSQL).
AI-мозги: OpenAI (GPT-4o-mini для скорости и цены).
Платежи: ЮKassa (API).
Генерация документов: Gotenberg (для дипломов).
Почему n8n? Потому что я не знаю jаvascript на уровне сеньора, но понимаю алгоритмы и логику построения систем. N8n позволяет мне визуализировать потоки данных, а код для кастомных JS-нод мне помогает писать и оптимизировать тот самый ChatGPT, за который меня ругали.
Что умеет бот и как это реализовано
-
Динамическая генерация курсов
Пользователь пишет любую тему (например, «Python для анализа данных» или «Психология переговоров»). Бот не берет готовый курс, он создает его на лету.
Как это работает в n8n:
- Сначала ИИ-агент (ai_generate_outline) создает структуру курса (модули и уроки), адаптируясь под выбранный пользователем режим (Фундамент, Практика или Хардкор).
- Полученный JSON валидируется и пишется в таблицы topic_modules и module_lessons в Supabase.
- Когда пользователь запрашивает урок, срабатывает цепочка генерации карточки (ai_generate_card), которая выдает теорию и практическое задание без «воды». -
Система проверки знаний и открытые вопросы
Я не хотел делать банальные тесты «выбери вариант А». Я внедрил проверку открытых ответов.
Реализация:
- Пользователь получает вопрос от AI.
- Пишет развернутый ответ текстом.
- Специальный агент ai_evaluate_answer сравнивает ответ студента с контекстом урока.
- Если ответ верный - зачет. Если нет - AI дает наводящую подсказку (не прямой ответ!) и просит попробовать снова.
- Вся история попыток и оценок летит в таблицу user_state, чтобы сохранять контекст диалога. -
SRS (Spaced Repetition System) - Интервальные повторения
Чтобы знания не вылетали из головы, я реализовал механику, похожую на Anki.
Логика:
- Если пользователь проваливает тест по старой карточке, система понижает его «уровень памяти» и уменьшает интервал до следующего повторения.
- Если сдает успешно - интервал растет (1, 3, 7, 14, 30 дней).
- Каждое утро cron-триггер в n8n дергает RPC-функцию в Supabase, находит пользователей, у которых подошел срок повторения, и шлет им уведомление. -
Биллинг и подписки
Это была самая сложная часть. Я не просто прикрутил «донаты», а сделал полноценный SaaS-биллинг.
Реализация через ЮKassa:
- Есть тарифы: Trial, Basic, Extended, Mega и Lifetime.
- При оплате создается запись в таблице payments и обновляется subscriptions.
- Реализованы рекуррентные платежи (автосписание). Каждый день cron проверяет истекающие подписки. Если автопродление включено - n8n инициирует платеж через сохраненный токен карты. Если денег нет - шлет уведомление и отключает продление.
- Вся логика скидок (например, скидка за прохождение курсов) считается динамически в JS-нодах перед формированием ссылки на оплату. -
Геймификация и PDF-дипломы
Когда пользователь завершает тему, бот генерирует красивый PDF-сертификат.
Как это сделано:
Node prep_user_diploma_html собирает HTML-шаблон, подставляя имя, тему, уровень и дату.
Этот HTML отправляется в контейнер Gotenberg (через HTTP Request), который возвращает бинарный PDF-файл.
Файл переименовывается и отправляется пользователю в чат.
Админка внутри Telegram
Я не стал пилить отдельный веб-интерфейс для администрирования. У меня (как у админа) есть свое скрытое меню прямо в боте.
Через него я вижу:
- MRR и Churn rate (отток).
- Конверсию из триала в оплату.
- Количество активных пользователей.
- Могу управлять глобальными скидками и делать рассылки по сегментам.
- Все метрики считаются через тяжелые SQL-запросы, завернутые в RPC-функции Supabase (например, compute_admin_metrics), чтобы не нагружать n8n вычислениями.
Ответ на критику: «Код пишет AI, ты ничего не понимаешь»
Да, большую часть JS-кода внутри нод (парсинг JSON, работа с датами, форматирование строк) написал сначала GPT-5, потом в процессе Gemini 3 Pro. Но архитектуру, связи между таблицами, логику переходов (Switch-ноды), обработку ошибок и защиту от абуза (например, проверку на повторный триал) проектировал я.
AI - это мой экскаватор. Я могу копать лопатой (учить синтаксис годами), а могу научиться управлять экскаватором и вырыть котлован за неделю. Я понимаю, что происходит в каждой ноде. Если бот падает, я иду в логи n8n, вижу ошибку и правлю её - иногда сам, иногда с помощью того же AI.
Что дальше?
Сейчас бот работает, принимает оплату �� обучает. Есть, скорее всего баги, также есть места, которые можно оптимизировать (например, уменьшить количество запросов к БД, внедрив кэширование).
Если вам интересно поковырять такого бота или есть идеи, как улучшить архитектуру - буду рад пообщаться в комментариях.
И да, я все еще считаю, что лучший способ научиться плавать - это прыгнуть в воду, а не читать учебник по гидродинамике на суше.
P.S. Если интересно потыкать MVP и посмотреть, как работает логика, которую я описал выше — бот тут: @skilldaybot. Буду рад фидбеку по багам.