Зачем платить больше? Проблема токенов в интерактивных историях
Представьте: вы делаете крутую текстовую игру, где каждый ответ игрока генерирует новую ветку сюжета. Пользователь в восторге, а вы с ужасом смотрите на счёт от 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.Сколько это будет стоить? Реальный расчёт токенов
Теория закончилась. Берём калькулятор. Предположим, ваша история:
- Средняя реплика ИИ: 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 бэкенду. Не нужно писать роутинг, настраивать сборку. Зарегистрируйтесь (по партнёрской ссылке есть бонусы) и создайте проект.
Что делаем:
- Тянем компонент Text Area для вывода истории.
- Ниже — несколько кнопок для вариантов ответа (генерируем их динамически).
- Добавляем поле ввода, если хотим дать свободу текста.
- В логике компонента прописываем вызов нашей 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 токенов) даст предсказуемый, контролируемый диалог. ИИ не уйдёт в дебри.
Ошибка №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 и считаете новый бюджет.