На встрече мы собрали два примера: квиз с общей статистикой ответов и задание с обратной связью от ИИ. Здесь я разложила работу по шагам, чтобы повторить её для своего проекта.
На эфире я показываю результат на Тильде. Вставка своего кода в блок T123 доступна на платных тарифах. Если у тебя бесплатный тариф, для повторения этих кейсов покупать подписку не обязательно.
Есть платная ТильдаВставляй код в T123, сохраняй и публикуй страницу. Проверяй результат по опубликованной ссылке.
Нет платной ТильдыПопроси ИИ собрать один готовый HTML-файл. Сохрани его на компьютере и открой двойным кликом в браузере.
Файл на компьютере тоже может отправлять запросы в Supabase и получать ответ от ИИ. На компьютере открывается интерфейс, а база данных и обработка ответа остаются в интернете. Поэтому интернет нужен даже для локального файла.
Для наших простых примеров такой запуск подходит при корректных настройках подключения и CORS. Если браузер блокирует запрос, сообщи ИИ, что открываешь файл локально, через file://. Отключать защиту браузера не нужно.
GitHub Pages и другие способы публикации разберём на шестой неделе. Сейчас достаточно открыть файл в браузере и проверить механику.
КЕЙС 01
Квиз с общей статистикой
Что такое Supabase
Это сервис для серверной части проекта: в нём можно хранить данные и запускать код. В первом кейсе мы используем его как общую базу ответов. Страница записывает туда выбор участника и получает данные для статистики.
Участник выбирает ответ и видит, сколько людей выбрали тот же вариант. Данные общие: новый ответ попадает в базу и участвует в следующем расчёте. Так можно собрать голосование, опрос или общую доску отзывов.
Ответ участника→Таблица Supabase→Расчёт статистики→Результат на странице
1
Опиши задачу ИИ
DeepSeek или другой чат с ИИ
Стартовый промпт
Хочу собрать квиз про капибар на Тильде с общей статистикой ответов в Supabase. После выбора покажи, верен ли ответ, и какой процент ответов приходится на этот вариант. Укажи, что именно считаем: ответы, а не уникальных людей, если учёта пользователей нет.
Подготовь таблицу и нужные разрешения в Supabase, объясняя каждый шаг. Если у меня платная Тильда — дай код для T123, если нет — один готовый HTML-файл для открытия на компьютере. Сначала уточни мой вариант запуска. Не давай посетителям изменять или удалять чужие записи. Продумай повторные нажатия и случай, когда ещё никто не ответил. Демонстрационные данные явно пометь и не смешивай с реальными.
Я не программист. Веди по одному шагу: где открыть, что скопировать, куда вставить и как проверить. Жди моего «готово». Сначала покажи план.
Результат: есть план сборки и понятная логика подсчёта.
2
Создай таблицу
Supabase → проект → SQL Editor
Получи SQL от ИИ, вставь его в SQL Editor и выполни через Run. Открой Table Editor и проверь, что появилась нужная таблица. Вместе с таблицей должны быть настроены разрешения доступа.
Результат: таблица создана; понятно, где хранится выбранный ответ.
3
Подключи свой проект
Supabase → настройки проекта
Скопируй Project URL и публичный anon key из одного проекта. Вставь их в обозначенные строки кода. Адрес копируй целиком.
Публичный ключ можно использовать в браузере: доступ к данным ограничивают правила базы. service_role и secret key в код страницы не вставляем.
Результат: код подключается к твоей базе.
4
Открой квиз
Тильда или HTML-файл на компьютере
На платном тарифе Тильды вставь фрагмент в T123 и опубликуй страницу. Без Тильды попроси полный HTML-файл, сохрани его как quiz.html (не .txt) и открой двойным кликом в браузере. Интернет должен быть включён.
Результат: на странице есть вопрос и варианты ответа.
5
Проверь сохранение и расчёт
Страница или локальный файл + Table Editor
Выбери ответ и проверь новую запись в таблице. Повтори тест в другом браузере. Сопоставь проценты с записями; проверь повторное нажатие и обновление страницы.
Результат: ответ сохраняется, а статистика соответствует данным.
Если ещё никто не ответил
В эфире мы использовали стартовые тестовые записи. Для учебного примера подпиши их как демонстрационные. При настоящем запуске можно начать с пустой базы и сообщения «Пока нет ответов. Твой будет первым».
А когда нужен ИИ?
Заранее написанный текстКод выбирает подходящую подсказку по ответу. Обращение по имени тоже можно добавить без ИИ.
Разбор свободного ответаМодель читает текст участника и даёт обратную связь по заданным критериям. Это наш второй кейс.
КЕЙС 02
Участник отвечает. ИИ подсказывает.
Что такое OpenRouter
Это сервис, через который приложение может обращаться к разным ИИ-моделям. В нашем кейсе функция Supabase отправляет через него ответ участника выбранной модели и получает разбор. OpenRouter связывает наш проект с ИИ, а секретный ключ хранится в Supabase.
Участник тренируется отвечать покупателям от лица магазина. Покупательница заказала чашку в подарок, но она приехала разбитой. Участник пишет, как поможет ей решить проблему.
В результате участник получает от ИИ оценку, разбор и пример ответа. Можно отредактировать свой текст и попробовать снова.
Тильда→Функция Supabase→ИИ через OpenRouter→Разбор на Тильде
Две разные роли ИИ
В DeepSeek мы пишем код и проходим настройку. Модель через OpenRouter работает внутри готового задания и разбирает ответы участников.
В конце видео появляется ошибка
В записи мы доходим до проверки на Тильде: после выполнения шагов вместо разбора появляется Failed to fetch. На этом видео заканчивается. После эфира я нашла и исправила опечатку в адресе функции — кейс заработал.
Ниже — последовательность действий. Выполняй шаги вместе с ИИ и проверяй результат после каждого. Задание про покупателя можно заменить своей учебной ситуацией и критериями.
1
Отправь первый промпт
В чат с ИИ
Запрос для пошаговой сборки
Хочу сделать учебное задание: участник пишет ответ покупателю, нажимает кнопку и получает от ИИ разбор — что получилось и что улучшить. Потом может исправить ответ и попробовать ещё раз.
Кейс: покупатель получил разбитую чашку и пишет: «Заказала чашку в подарок. Она приехала разбитой! Завтра день рождения. Что мне делать?» Участник отвечает от лица сотрудника магазина.
Правила учебного магазина: можно предложить замену или возврат денег; нужно попросить номер заказа и фото повреждения; нельзя обещать доставку завтра без проверки. В ответе нужны сочувствие, решение и понятный следующий шаг. Если ответ хороший, так и скажи.
Используем Supabase и OpenRouter. Объясни простыми словами, для чего нужен каждый сервис. Помоги выбрать доступную бесплатную модель и проверить, что она отвечает.
Я не программист и делаю это впервые. Напиши весь код. Веди по одному шагу: какой сайт открыть, куда нажать, что скопировать и куда вставить. Каждый новый термин сначала объясняй. После каждого шага говори, как проверить результат, и жди моего «готово». Если появилась ошибка, сначала разбираем её.
В начале спроси, какие аккаунты у меня есть и где я буду открывать результат. Если есть платная Тильда — подготовь код для блока T123. Если нет — один готовый HTML-файл, который можно сохранить на компьютере и открыть в браузере. Настрой подключение с учётом выбранного способа запуска. GitHub Pages и публикацию на хостинге пока не рассматриваем.
Секретные ключи я не отправляю в чат и не размещаю в коде страницы. Покажи, где сохранить их в Supabase. Если сервис временно не отвечает, покажи понятную техническую ошибку без оценки участника.
Сначала покажи короткий план. Затем начнём.
Результат: ИИ предлагает план и ведёт по одному действию.
2
Создай ключ OpenRouter
OpenRouter → Keys → Create Key
Создай ключ для учебного проекта и скопируй его. Он нужен серверной функции для запроса к модели. Не отправляй его в чат и не вставляй в T123.
Результат: ключ подготовлен для сохранения на сервере.
3
Сохрани ключ
Supabase → Edge Functions → Secrets
Добавь секрет: Name — OPENROUTER_API_KEY, Value — ключ OpenRouter. Нажми Save.
Результат: в списке есть секрет OPENROUTER_API_KEY.
4
Размести функцию проверки
Supabase → Edge Functions → Deploy a new function → Via Editor
Функция — это небольшой код на сервере. Она принимает ответ участника и обращается к ИИ, не раскрывая секретный ключ в браузере. В нашей сборке она называется quiz-check. Если ИИ предложил другое имя, используй его последовательно и копируй адрес именно своей функции.
Создай функцию с выбранным именем. Вставь полный код от ИИ и нажми Deploy. Код читает секрет, отправляет текст в OpenRouter и возвращает разбор.
В нашем рабочем учебном примере Verify JWT выключен, а функция обрабатывает OPTIONS и добавляет CORS-заголовки к ответам. Это публичный вызов без проверки пользователя. Для постоянного использования нужно отдельно ограничить доступ и число запросов.
Сообщение ИИ
Ключ сохранён. Что делаем дальше, чтобы мой ответ отправлялся ИИ и возвращался разбор? Объясни простыми словами, дай полный код и покажи, куда его вставить. Учти мой способ запуска: Тильда или HTML-файл на компьютере.
Результат: функция опубликована.
5
Проверь функцию отдельно
quiz-check → Test
Отправь POST с JSON:
{"answer":"Очень жаль! Пришлите номер заказа и фото чашки."}
Нужен содержательный разбор ответа. Если пришла ошибка модели, сначала исправь её на этом шаге. Успешный Deploy ещё не означает, что ИИ отвечает.
Скопируй Function URL именно функции quiz-check целиком. Это адрес с окончанием /functions/v1/quiz-check, а не просто Project URL. Публичный anon-ключ возьми из того же проекта.
Попроси ИИ подготовить интерфейс под результат функции: good, score, praise, improve, example. На платной Тильде вставь фрагмент в T123 и опубликуй. Либо попроси ИИ выдать полный HTML-файл с этим подключением и открой его в браузере на компьютере.
Результат: страница отправляет ответ в нужную функцию.
7
Проверь три разных ответа
На странице Тильды или в локальном HTML-файле
Проверь грубый ответ без решения, вежливый неполный ответ и ответ со всеми условиями. Разбор должен различаться по содержанию, а кнопка — снова становиться доступной.
Без решения
Мы отправляли целую чашку. Разбирайтесь с доставкой.
Не хватает решения
Очень жаль, что чашка приехала разбитой. Пришлите, пожалуйста, номер заказа и фото повреждения.
Все основные условия
Простите, что чашка пришла разбитой. Можем предложить замену или возврат денег. Пришлите, пожалуйста, номер заказа и фото повреждения. Напишите, какой вариант вам удобнее. Если выберете замену, уточним дату доставки.
Результат: рекомендации приходят на страницу; можно исправить ответ и отправить снова.
РАБОЧЕЕ ЗАВЕРШЕНИЕ КЕЙСА
Что я исправила после эфира
Внутри Supabase проверка работала, а со страницы Тильды ответ не приходил. После эфира я вернулась к проблеме вместе с ИИ. Вот как мы нашли причину.
1. Описала проблему и прислала код
Я повторно описала, что происходит: тест в Supabase проходит, а на странице появляется ошибка Failed to fetch. Прислала полный код из блока T123, затем код функции quiz-check и уточнила, что Verify JWT выключен. Секретный ключ OpenRouter не отправляла.
Так ИИ получил обе части связки: код страницы, который отправляет запрос, и код функции, которая должна его принять.
2. ИИ сравнил адрес и данные в публичном ключе
В коде Тильды были адрес функции и публичный anon-ключ. Внутри такого ключа есть идентификатор проекта. ИИ прочитал его и сравнил с частью адреса перед .supabase.co: они не совпали. В адресе не хватало буквы o.
В коде страницы было afotpqtuzjcsyihqayo.supabase.co
Идентификатор в ключе указывал на afotpqotuzjcsyihqayo.supabase.co
Само чтение данных ключа ещё не доказывает, что адрес правильный. Поэтому следующим шагом мы сверились с Supabase.
3. Заново скопировала Function URL из Supabase
Я открыла функцию quiz-check, скопировала её адрес целиком и отправила ИИ. Этот адрес совпал с проектом в публичном ключе. После этого заменили значение SUPABASE_URL в коде Тильды.
Я могла скопировать адрес не полностью или случайно удалить букву при вставке. Точно сказать, на каком этапе она потерялась, мы не можем. Поэтому адрес взяли заново из Supabase, а не восстанавливали вручную.
4. Проверила результат на странице
После замены адреса запрос заработал: страница получила разбор от ИИ. В присланной версии функции CORS и обработка OPTIONS уже были настроены, а Verify JWT был выключен. Для этого исправления менять их не понадобилось.
Проверь на своём ответе
Открой задание, напиши ответ покупателю и посмотри разбор.
Не перепечатывай адреса вручную. Проверяй один и тот же проект и точное имя функции. Проверка в Supabase и проверка с опубликованной страницы — два отдельных шага.
Что может пойти не так
Сообщение об ошибке — подсказка, а не готовый диагноз. Ниже — несколько ситуаций, которые могут встретиться. Тебе не нужно заранее угадывать причину: покажи ИИ, что произошло, и вместе соберите нужные данные.
Failed to fetch — ответ от сервиса не получен
Что видишь. После отправки ответа появляется Failed to fetch.
Что это может означать. Браузер не смог получить ответ. Причина может быть в адресе, соединении или настройках доступа. По одной этой фразе нельзя определить, что именно сломалось.
CORS — браузер заблокировал обращение
Что видишь. В сообщении об ошибке есть слово CORS.
Что это может означать. Браузер не получил нужного разрешения на обращение к другому сервису. Это может быть связано с настройками или с другой ошибкой, возникшей раньше. Отключать защиту браузера не нужно.
401 — запрос не прошёл проверку доступа
Что видишь. В сообщении об ошибке есть число 401.
Что это может означать. Один из сервисов отклонил запрос при проверке доступа. Нужно выяснить, какой именно сервис и почему: например, нужные данные могли не передаться или не совпасть с настройками.
Ошибка OpenRouter, модели или лимита
Что видишь. Вместо разбора появляется сообщение от OpenRouter, упоминание модели или ограничения запросов.
Что это может означать. Выбранная модель может быть недоступна, лимит — исчерпан, а ключ — не настроен. Возможен и временный сбой. Полный текст ошибки поможет различить эти ситуации.
Пустой или нестандартный разбор
Что видишь. Результат пустой, отображается странно или появляется сообщение «нестандартный ответ».
Что это может означать. ИИ мог вернуть данные в виде, который страница не умеет показывать. Технический сбой не должен превращаться в оценку 0. При этом сама по себе низкая оценка ещё не означает ошибку.
Как разбираться вместе с ИИ
Покажи, что произошло. Опиши своё действие, ожидаемый результат и то, что появилось вместо него.
Отправь то, что есть. Скриншот ошибки, её текст, если получилось скопировать, и код, с которым работаешь. Если чего-то нет или непонятно, где это найти, так и напиши.
Собери дополнительные данные по запросу ИИ. Для одной ситуации понадобится код функции, для другой — настройки сервиса или результат отдельной проверки. Попроси объяснять, где это найти, и двигаться по одному шагу.
Проверь исправление. Повтори то же действие и посмотри, появился ли ожидаемый результат. Если нет — отправь ИИ то, что видишь теперь.
Как было в нашем кейсе
Сначала я отправила код страницы, затем — код функции и состояние Verify JWT. После этого мы сверили настоящий адрес из Supabase. Эти данные понадобились в ходе проверки, а не были известны заранее как обязательный список.
Перед отправкой кода и скриншотов убери пароли и секретные ключи. Если не понимаешь, какие данные секретные, сначала попроси ИИ объяснить, что скрыть.
Скопируй запрос и добавь свои данные
Не получается выполнить [что именно].
Ожидалось: [какой результат].
Вместо этого: [что произошло].
Вот скриншот ошибки и её текст, если получилось скопировать. Вот код страницы или другой код, с которым я работаю: [приложи то, что есть].
Помоги разобраться. Сначала посмотри на эти материалы и скажи, каких данных не хватает для проверки. Если нужен код из другого места, настройки или ещё один скриншот — объясни, где их найти и какие секретные данные скрыть перед отправкой.
Не угадывай причину заранее. Давай по одному действию и жди моего ответа. После исправления объясни, как проверить результат.