← Все материалы

Гайд

Дешёвые токены, дорогое приложение: где прячется стоимость ИИ?

Почему цена токенов не равна стоимости готового результата: повторные запросы, проверка человеком и учёт расходов через onCompletionBilled.

Обновлено

Таблица данных, диаграмма и лупа над отличающейся ячейкой

В каталоге модель выглядит почти бесплатной, а рабочий процесс всё равно обходится дорого. Причина может быть не в тарифе: длинные исходники отправляются заново, неудачные ответы повторяются, а редактор тратит больше времени на исправления, чем раньше на написание.

В Чатиуме полезно сразу сделать журнал запусков и считать расходы рядом с результатом. Тогда видно, сколько стоила не отдельная попытка, а карточка, которую действительно приняли в работу.

Промпт

Создай журнал работы нейросетей: задание, модель, попытки, время ожидания, расходы и итоговая оценка. Показывай отдельно принятые и отклонённые ответы. Добавь лимит расходов и отчёт о стоимости одного принятого результата.

Три разных счётчика

Первый счётчик — объём обработки у провайдера: вход, выход и другие тарифицируемые компоненты конкретного маршрута. Второй — списания платформы, через которую работает приложение. Третий — стоимость процесса для команды: проверки, повторения и исправления.

Эти величины нельзя подменять друг другом. Число токенов текста не является суммой в рублях или долларах. Цена из OpenRouter также не обязана совпадать с итоговым списанием в Чатиуме. Для расчёта используйте фактические единицы и условия своего способа доступа.

Как получить событие о расходах

У startCompletion есть onCompletionBilled. Обработчик получает completionId, costTokens, а также предусмотренные контрактом дополнительные поля. costTokens — расчётная величина платформы; не подписывайте её знаком доллара и не выдавайте за количество входных токенов.

ctx передаёт Чатиум, sourceText содержит проверенный текст задания. done, failed и billed — заранее зарегистрированные маршруты app.function. В каждом проверяется источник события: caller.type === 'plugin' && caller.appSlug === 'start'.

TypeScript
import { startCompletion } from '@start/sdk'

const { completionId } = await startCompletion(ctx, {
  model: 'openai/gpt-6-luna',
  messages: [{ role: 'user', content: [{ type: 'text', text: sourceText }] }],
  onCompletionCompleted: done,
  onCompletionFailed: failed,
  onCompletionBilled: billed,
})

Это только запуск. Ответ и сведения о расходах приходят отдельными событиями позже. Приложение связывает их с одной попыткой по completionId; отсутствие события о расходах пока не означает нулевую стоимость. До получения данных показывайте «ожидается расчёт».

Почему дешёвая попытка бывает дорогим результатом

Возьмём условный пример, не тариф сервиса. Модель А потратила 100 расчётных единиц на десять попыток, из которых приняли две. Модель Б — 150 единиц на десять попыток, приняли восемь. По этим данным стоимость принятого результата составляет 50 и 18,75 единицы соответственно.

Такой расчёт ещё не включает работу редактора и не доказывает превосходство Б на других задачах. Он показывает, почему сравнение одной строки прайса недостаточно. Всегда сохраняйте число попыток, число принятых результатов и правило, по которому результат считался принятым.

Где возникают незаметные расходы

Повторная отправка большой истории, одинаковые задания из двойного клика, автоматические повторы без ограничения и генерация лишних вариантов увеличивают работу. Иногда расход связан с изображениями, поиском или другими возможностями маршрута — проверяйте их условия отдельно.

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

Лимит должен работать на сервере

Надпись «лимит исчерпан» в браузере не останавливает новые серверные запросы. Проверяйте разрешённый бюджет при запуске и учитывайте задачи, которые ещё выполняются. Несколько одновременных запросов могут пройти проверку одного и того же остатка, если логика не учитывает конкуренцию.

Не обещайте абсолютно точную верхнюю сумму, если окончательное списание приходит позже и механизм резервирования её не гарантирует. Можно ограничить число параллельных попыток, размер исходника и разрешённые модели, а также показывать отдельно известный расход и незавершённые задачи.

Частые вопросы

Бесплатная модель означает бесплатное приложение?

Нет. У бесплатного маршрута могут быть квоты, а у приложения остаются хранение, обслуживание и другие операции. Условия нужно проверять для всей цепочки.

Как сравнить расходы двух моделей честно?

Дайте одинаковые задания, заранее определите критерий принятия и учитывайте все попытки. Методика есть в оценке нейросетей.

Стоит ли автоматически повторять любую ошибку?

Нет. Повтор не исправляет неверные данные или постоянное ограничение. Разбор случаев — в повторных запросах и смене модели.