Интерактивная история с ИИ на Gemini 2.5 Flash Light: гайд по сборке | AiManual
AiManual Logo Ai / Manual.
15 Фев 2026 Гайд

Как создать интерактивную историю с ИИ: расчёт токенов, выбор Gemini 2.5 Flash Light и сборка на Lovable/Supabase

Пошаговый гайд по созданию нелинейной интерактивной истории с ИИ. Расчёт стоимости токенов для Gemini 2.5 Flash Light, настройка бэкенда на Supabase и сборка фр

Зачем платить больше? Проблема токенов в интерактивных историях

Представьте: вы делаете крутую текстовую игру, где каждый ответ игрока генерирует новую ветку сюжета. Пользователь в восторге, а вы с ужасом смотрите на счёт от Google. Потому что каждая генерация — это токены. Много токенов. Если вы не посчитали бюджет заранее, проект умрёт, не успев родиться.

Вот главная боль: модели вроде Gemini 3 Pro генерируют шикарные тексты, но их цена за 1 млн токенов выхода (output) в начале 2026 года кусается. Для постоянно генерирующего диалога это неприемлемо. Нужна модель, которая понимает контекст, неплохо пишет по-русски и стоит копейки. И она есть.

Самая частая ошибка — начинать с самой мощной модели. Вы платите за возможности, которые вам не нужны. Для динамического повествования важна не максимальная креативность, а стабильность, скорость и цена.

Почему в 2026 году ваш выбор — Gemini 2.5 Flash Light

Все гонятся за Gemini 3 Flash или Pro. Но для интерактивной истории это как забивать гвозди микроскопом. Откройте прайс-лист Google AI Studio на 15 февраля 2026. Сравните.

Модель (на 15.02.2026) Цена за 1 млн входных токенов Цена за 1 млн выходных токенов Контекст
Gemini 3 Pro ~$7.50 ~$30.00 2M
Gemini 3 Flash ~$0.15 ~$0.60 1M
Gemini 2.5 Flash Light ~$0.05 ~$0.20 128K

Видите разницу? Flash Light дешевле Flash в 3-4 раза. Да, у неё меньше контекстное окно (128 тысяч токенов против миллиона), но для истории, где вы передаёте только последние 10-20 реплик и промпт, этого более чем достаточно.

А главное — качество русского языка у Gemini 2.5 Flash Light после всех обновлений 2025 года стало отличным. Она не будет сочинять стихи уровня Толстого, но для поддержания последовательного, engaging-диалога — идеально. Если сомневаетесь, почитайте наш разбор битвы поколений моделей.

💡
Не путайте Gemini 2.5 Flash Light с обычной Flash. Light — это специальная облегчённая версия, оптимизированная для диалоговых сценариев с минимальной задержкой. Её API-эндпоинт другой: gemini-2.5-flash-light.

Сколько это будет стоить? Реальный расчёт токенов

Теория закончилась. Берём калькулятор. Предположим, ваша история:

  • Средняя реплика ИИ: 150 слов (≈200 токенов).
  • Средний ответ игрока: 10 слов (≈15 токенов).
  • Системный промпт (характер персонажа, правила игры): 500 токенов.
  • В историю передаётся последние 5 шагов диалога (5*(200+15) = 1075 токенов).

Один запрос к ИИ = Промпт (500) + История (1075) + Новый ответ игрока (15) = 1590 входных токенов. Плюс мы получаем ответ ИИ на 200 токенов.

Считаем для 1000 пользовательских действий (ответов):

# Расчёт стоимости 1000 шагов истории на Gemini 2.5 Flash Light (цены на 15.02.2026)
input_tokens = 1590 * 1000  # 1,590,000
output_tokens = 200 * 1000   # 200,000

input_cost = (1_590_000 / 1_000_000) * 0.05  # $0.0795
output_cost = (200_000 / 1_000_000) * 0.20   # $0.04

total_cost = input_cost + output_cost  # $0.1195

Да, вы не ослышались. Около 12 центов за тысячу шагов истории. За те же деньги на Gemini 3 Pro вы получите меньше 50 шагов. Разница в 20 раз. Вопросов по выбору модели больше нет?

1 Готовим бэкенд: Supabase и Edge Functions

Нам нужно хранить состояние диалога для каждого пользователя и иметь защищённый прокси к Gemini API. Прямые вызовы с фронтенда — плохая идея (ваш API-ключ утечёт за час).

Создаём проект в Supabase. Включаем Edge Functions. В базе данных делаем простую таблицу:

CREATE TABLE user_stories (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  user_id TEXT NOT NULL, -- Можно анонимный ID сессии
  story_context JSONB NOT NULL DEFAULT '[]', -- Массив сообщений {role, content}
  created_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc' NOW()),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc' NOW())
);

Теперь пишем Edge Function на Deno (TypeScript), которая будет общаться с Gemini. Ключ API храним в секретах Supabase.

// supabase/functions/generate-story/index.ts
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";

const GEMINI_API_KEY = Deno.env.get("GEMINI_API_KEY");
const MODEL = "gemini-2.5-flash-light";

const SYSTEM_PROMPT = `Ты — мастер интерактивных историй в жанре фэнтези. Говори кратко, от лица рассказчика. После каждого фрагмента предлагай 2-3 варианта действий для героя. Не пиши от имени игрока.`;

async function callGemini(messages: Array<{role: string, content: string}>) {
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${GEMINI_API_KEY}`;
  
  // Форматируем историю в контент для Gemini
  const contents = [
    { role: "user", parts: [{ text: SYSTEM_PROMPT }] },
    ...messages.map(msg => ({
      role: msg.role === "user" ? "user" : "model",
      parts: [{ text: msg.content }]
    }))
  ];

  const resp = await fetch(url, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ contents })
  });

  const data = await resp.json();
  return data.candidates[0].content.parts[0].text;
}

serve(async (req) => {
  const { userId, userMessage } = await req.json();
  // 1. Достаём историю из БД
  // 2. Добавляем новый ответ пользователя
  // 3. Вызываем callGemini()
  // 4. Сохраняем обновлённый контекст (userMessage + ответ ИИ)
  // 5. Возвращаем ответ ИИ клиенту
});

Используйте именно gemini-2.5-flash-light в качестве имени модели. Для других моделей, вроде Gemini 3 Flash, эндпоинт будет gemini-3-flash. Актуальный список всегда в гиде по AI-инструментам Google.

2 Собираем интерфейс за вечер на Lovable

Lovable — это low-code платформа, где вы ткёте интерфейс из компонентов и привязываете их к вашему Supabase бэкенду. Не нужно писать роутинг, настраивать сборку. Зарегистрируйтесь (по партнёрской ссылке есть бонусы) и создайте проект.

Что делаем:

  1. Тянем компонент Text Area для вывода истории.
  2. Ниже — несколько кнопок для вариантов ответа (генерируем их динамически).
  3. Добавляем поле ввода, если хотим дать свободу текста.
  4. В логике компонента прописываем вызов нашей Supabase Edge Function при загрузке и после каждого ответа.

Вот кусок кода для вызова функции из Lovable (это будет в разделе Events компонента):

// Lovable Component Event Code
async function generateNextStoryStep(userChoice) {
  // Получаем или создаём ID сессии
  let sessionId = localStorage.getItem('storySessionId');
  if (!sessionId) {
    sessionId = crypto.randomUUID();
    localStorage.setItem('storySessionId', sessionId);
  }

  const response = await fetch('https://your-project.supabase.co/functions/v1/generate-story', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      userId: sessionId,
      userMessage: userChoice
    })
  });

  const data = await response.json();
  // Обновляем состояние текста и кнопок в интерфейсе
  updateUI(data.storyText, data.options);
}

Всё. Бэкенд защищён, фронтенд работает, история генерируется. Осталась самая важная часть — промпт-инжиниринг, чтобы ИИ не сошёл с ума.

Нюансы, от которых зависит успех (и ваш бюджет)

Промпт — это всё. Сэкономите на нём — получите бред и пустые токены. Вот как надо и как НЕ надо.

Как НЕ надо: «Придумай историю про дракона». Слишком абстрактно. ИИ начнёт генерировать целую книгу, съедая токены, и потеряет нить после вашего ответа.

Как надо: Чётко задайте рамки.

Ты — рассказчик. Правила:
1. Каждый твой ответ — 2-3 предложения, описывающие результат действия героя.
2. После описания всегда задавай вопрос: "Что делаешь дальше?" и предлагай 3 варианта (коротко, 2-4 слова каждый).
3. Не развивай сюжет без выбора игрока.
4. Жанр: тёмное фэнтези. Персонаж: наёмник с тёмным прошлым.
5. Начинай историю прямо с действия: "Ты стоишь на краю проклятого леса. Ветер шепчет твоё имя. Что делаешь?"

Этот промпт (~150 токенов) даст предсказуемый, контролируемый диалог. ИИ не уйдёт в дебри.

💡
Используйте технику «системного сообщения» как в коде выше: первый user-промпт с правилами. Gemini 2.5 Flash Light отлично следует инструкциям в таком формате. Это надёжнее, чем пытаться впихнуть правила в каждое сообщение.

Ошибка №2: Хранить всю историю. Не нужно славить в контекст все 100 предыдущих реплик. Храните последние 5-7 обменов. Этого хватит для связности. Если нужно вспомнить ключевой факт из начала (например, «герой нашёл ключ»), внедрите это в промпт как факт: «Помни, что герой имеет в кармане железный ключ».

Ошибка №3: Игнорировать кэширование. Если у вас 1000 пользователей, и все начинают историю с одного промпта, вы 1000 раз заплатите за одинаковую первую реплику ИИ. Решение: кэшируйте ответы Gemini на уровне Supabase. Для стандартных начал сценария генерируйте ответ один раз и сохраняйте в таблице cached_scenes. Проверяйте хэш промпта перед вызовом API.

Что дальше? Когда стоит переходить на более мощные модели

Gemini 2.5 Flash Light — это рабочий скакун для MVP. Но если ваша история требует глубокого эмоционального анализа ответов игрока или генерации сложных поворотов сюжета на лету — присмотритесь к Gemini 3 Flash. Её агентные возможности позволяют создавать многоэтапные reasoning-цепочки прямо в запросе.

Представьте: игрок пишет «осмотреть комнату». Обычная модель даст общее описание. Gemini 3 Flash с включённым планированием может сначала решить, что в комнате есть три ключевых объекта, затем сгенерировать описание каждого, а потом связать их в единый нарратив. Дороже? Да. Но для premium-продукта это того стоит.

А пока — берите Flash Light, считайте токены и запускайте. Первую интерактивную историю можно собрать и протестировать за один уик-энд. Общая стоимость инфраструктуры (Supabase бесплатный тариф, Lovable бесплатный тариф, API-ключ Gemini с $300 начальным кредитом) — ноль рублей.

И да, если вдруг Google в марте 2026 выпустит Gemini 2.6 Flash Light ещё дешевле — вы уже знаете, что делать. Меняете одну строку в коде Edge Function и считаете новый бюджет.