Заметки

Batch API: как платить за нейросеть вдвое меньше

M
Markabus
·
Фотореалистичный кадр светлой прачечной самообслуживания: на переднем плане аналоговые часы, в центре — фронтальная стиральная машина с приоткрытой дверцей и партией цветного белья внутри, рядом корзина с ожидающей загрузкой; тёплый дневной свет — иллюстрация к статье про Batch API: загружаешь пакет задач и ждёшь результат в течение суток, платя вдвое меньше.

Если ответ нейросети нужен не «прямо сейчас», а «сегодня-завтра», у крупных провайдеров есть для этого отдельный режим: Batch API. Сделка выглядит так: вы соглашаетесь на асинхронность — задачи уходят пакетом и возвращаются в срок до суток, — а взамен получаете скидку 50% на входные и выходные токены для поддерживаемых моделей и операций. Для конвейерных задач это самый прямой способ уменьшить счёт. Разбираем, как это устроено у OpenAI, Anthropic и Google, чем придётся пожертвовать кроме скорости и когда батч действительно оправдан.

Как работает Batch API

Вместо того чтобы слать запросы по одному и ждать ответ, вы готовите файл со списком задач — обычный JSONL, где каждая строка отдельный запрос с уникальным идентификатором custom_id. Файл загружается, создаётся задание (job), провайдер обрабатывает его в фоне, когда есть свободные мощности, а по готовности вы скачиваете файлы с результатами.

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

Скидка действует и на вход, и на выход. Лимиты щедрее синхронных, но устроены в два этажа: ограничен и размер одного задания, и общая очередь. У OpenAI, например, в одно задание входит до 50 000 запросов и 200 МБ входного файла, а глубина очереди зависит от модели и уровня доступа. Синхронный API таких послаблений не даёт — про его жёсткие лимиты у нас есть отдельная статья про ошибку 429.

Три провайдера, одна сделка

  • OpenAI — Batch API. JSONL-файл через Files API, управление заданиями отдельными эндпоинтами. До 50 000 запросов и 200 МБ на задание; глубина очереди зависит от модели и тарифного уровня. Скидка 50%.
  • Anthropic — Message Batches. До 100 000 запросов или 256 МБ на задание. Скидка 50% может сочетаться с экономией кэширования промптов — но попадание в кэш не гарантировано и проверяется по метрикам использования.
  • Google — Gemini Batch API. Тот же принцип для поддерживаемых моделей Gemini, включая пакетную генерацию изображений соответствующими моделями.

Ставки у провайдеров различаются — актуальные цены удобно сверять в нашем сравнении API: Gemini, Claude и OpenAI.

Пример: от задач до файла с ответами

Минимальный JSONL для OpenAI — две разные задачи, пересказ и классификация:

{"custom_id": "summary-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-5.4-mini-2026-03-17", "messages": [{"role": "user", "content": "Сделай краткий пересказ статьи: …"}]}}
{"custom_id": "category-002", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-5.4-mini-2026-03-17", "messages": [{"role": "user", "content": "Отнеси обращение к одной из категорий: …"}]}}

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

Дальше четыре шага: загрузить JSONL через Files API с назначением batch; создать задание (POST /v1/batches), указав файл; периодически проверять статус задания (validating → in_progress → completed/failed/expired); забрать два файла — output с успешными ответами и error с ошибками отдельных запросов. Если входной файл не пройдёт валидацию, задание не запустится целиком.

Порядок строк в результатах не обязан совпадать с входным — соответствие восстанавливается по custom_id. Он же — основа для повторов, но идемпотентность он сам не обеспечивает: приложение должно учитывать уже полученные ответы, чтобы не платить за дубли. Механика не сложнее первого запроса к API; у Anthropic и Google — та же логика с другой упаковкой (массив requests / файл или встроенный список) и своей структурой результатов.

Где батч окупается лучше всего

Классика — всё, что считается «фоном»: массовая классификация и разметка, краткие пересказы архивов документов, генерация описаний для каталога, переводы, ночные прогоны тестов. Общий признак один: результата никто не ждёт на экране, а объём измеряется сотнями и тысячами запросов.

Прикинуть выгоду помогает простая формула: (входные + выходные токены) × ставка × 0,5 = цена батча. Условный пример на 10 000 пересказов по 3 000 входных и 500 выходных токенов при ставках $0,75 и $6 за миллион токенов (условно, на октябрь 2026): синхронно — около $52, в батче — около $26. Цены меняются — перед собственным расчётом сверьте актуальный прайс.

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

Когда батч не подходит

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

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

Практические мелочи

  • одна логическая задача — один батч: так проще разбирать результаты и считать стоимость;
  • проверяйте оба уровня: статус задания и построчные результаты — успешные ответы в output-файле, ошибки отдельных запросов в error-файле; упавшие строки перезапускаются отдельно, после разбора причины;
  • не рассчитывайте на порядок строк: сопоставляйте по custom_id и перед повтором учитывайте уже полученные ответы;
  • опрашивайте статус задания по расписанию — это дешевле ручной проверки и вписывается в тот же фоновый конвейер;
  • держите префикс промпта стабильным в пределах батча: это повышает шансы кэш-попаданий там, где кэширование доступно.

Вывод

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

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

Q.Насколько долго ждать ответа в батч-режиме?

Задания рассчитаны на завершение в течение суток, многие возвращаются быстрее — но скорость зависит от объёма и нагрузки. Часть запросов может не успеть: у OpenAI при истечении окна готовые ответы сохраняются, невыполненные отменяются. Поэтому проверяйте и статус задания, и каждый результат.

Q.Складывается ли скидка батча с кэшированием промптов?

Могут сочетаться, но это не гарантия. Попадание в кэш зависит от одинаковых префиксов, настроек и параллельности обработки; у Google кэш в пакетных запросах тарифицируется по стандартным ставкам кэширования. Реальную экономию смотрите по метрикам использования.

Q.Что будет, если часть запросов в батче упадёт?

Возможны два уровня сбоя. Если входной файл не прошёл проверку — не запустится всё задание. Если сбой в отдельных запросах — успешные ответы соберутся в output-файле, ошибки — в error-файле, и задание завершится с частичным результатом; упавшие строки после разбора причины перезапускаются отдельным маленьким батчом.

Источники

←
Предыдущая
Скиллы для coding-агентов: оцениваем 10 популярных наборов в реальной работе

Читайте также