Пакетная обработка (Batch API)
Пакет — это много запросов к модели, отправленных разом, когда ответ не нужен сию минуту: разметить отзывы, извлечь поля из тысячи писем, перевести карточки каталога. kosareva.cloud обрабатывает их в фоне и берёт половину обычной цены модели. Обычно пакет готов за минуты, но может идти сутки, а изредка и дольше.
Адрес и ключ те же, что у обычных запросов. Форматов два, как у вендоров: Message Batches от Anthropic для моделей Claude и Batch API от OpenAI для /v1/chat/completions, поэтому подходят официальные SDK.
- Адрес
https://api.kosareva.cloudдля Anthropic SDK,https://api.kosareva.cloud/v1для OpenAI SDK- Ключ
- тот же
sk-..., что для обычных запросов - Цена
- половина обычной цены модели на вход и выход, только за успешные запросы
- Срок
- обычно минуты, как правило до суток
- Объём
- до 100 000 запросов и до 100 МБ на пакет
- Хранение
- результаты и файлы 29 дней
Как устроен пакет
Ответы забираются не по одному, а когда обработан весь пакет. Четыре шага одинаковы для обоих форматов.
/1Соберите запросы
Каждый запрос в пакете устроен как обычный запрос к /v1/messages или /v1/chat/completions и несёт свой custom_id: по нему вы потом найдёте ответ. В одном пакете custom_id не повторяется. В формате Anthropic запросы идут списком в теле, в формате OpenAI файлом JSONL, по запросу на строку.
/2Отправьте пакет
С баланса удерживается сумма по оценке сверху. Если её не хватает, пакет не создаётся, а в ответе 402 будет ссылка на пополнение.
/3Дождитесь окончания
Пакет обрабатывается в фоне: обычно за минуты, как правило в течение суток, изредка дольше. Статус спрашивайте раз в минуту.
/4Заберите результаты
Ответы сопоставляйте с запросами по custom_id. Удержание снимается, а с баланса списывается фактический расход по цене пакета. Результаты хранятся 29 дней.
Формат Anthropic: Message Batches
Для моделей Claude. Официальный Anthropic SDK работает с адресом https://api.kosareva.cloud без /v1: путь SDK допишет сам. У каждого запроса обязательны custom_id (от 1 до 64 символов: латиница, цифры, _ и -) и max_tokens.
import time
from anthropic import Anthropic
client = Anthropic(
api_key="ВАШ_API_КЛЮЧ",
base_url="https://api.kosareva.cloud", # без /v1: путь SDK допишет сам
)
reviews = [
"Доставили на день раньше, всё целое",
"Коробка мятая, внутри не тот цвет",
]
# 1. Создать пакет: у каждого запроса свой custom_id и max_tokens
batch = client.messages.batches.create(
requests=[
{
"custom_id": f"review-{i}",
"params": {
"model": "claude-haiku-5-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": f"Тональность отзыва одним словом: {text}"}],
},
}
for i, text in enumerate(reviews)
],
)
# 2. Ждать, пока processing_status не станет ended
while batch.processing_status != "ended":
time.sleep(60)
batch = client.messages.batches.retrieve(batch.id)
# 3. Забрать результаты и сопоставить по custom_id
for item in client.messages.batches.results(batch.id):
if item.result.type == "succeeded":
answer = next(b.text for b in item.result.message.content if b.type == "text")
print(item.custom_id, answer)
else:
print(item.custom_id, item.result.type) # errored, canceled или expired: денег не списано
У каждого результата есть custom_id и result.type. При succeeded ответ лежит в result.message, в том же виде, что у обычного /v1/messages. При errored, canceled и expired ответа нет, и за такой запрос ничего не списано.
# 1. Создать пакет, в ответе id и processing_status
curl https://api.kosareva.cloud/v1/messages/batches \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"requests":[{"custom_id":"review-1","params":{"model":"claude-haiku-5-5","max_tokens":1024,"messages":[{"role":"user","content":"Тональность отзыва одним словом: доставили на день раньше"}]}}]}'
# 2. Спрашивать раз в минуту, пока processing_status не станет ended
curl https://api.kosareva.cloud/v1/messages/batches/ID_ПАКЕТА \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ"
# 3. Скачать результаты: по строке JSON на запрос
curl https://api.kosareva.cloud/v1/messages/batches/ID_ПАКЕТА/results \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" -o results.jsonl
# → {"custom_id":"review-1","result":{"type":"succeeded","message":{…}}}
| Метод и путь | Что делает |
|---|---|
POST /v1/messages/batches | создать пакет, запросы в поле requests |
GET /v1/messages/batches/{id} | статус processing_status и счётчики запросов |
GET /v1/messages/batches/{id}/results | результаты в JSONL, по строке на запрос; отдаются, когда статус ended |
POST /v1/messages/batches/{id}/cancel | отменить: необработанные запросы получат canceled и не оплачиваются |
DELETE /v1/messages/batches/{id} | удалить завершённый пакет вместе с результатами; идущий пакет сначала отмените |
GET /v1/messages/batches | список ваших пакетов |
Формат OpenAI: Batch API
Для моделей из списка ниже, в том числе части Claude. Пакетом идёт только /v1/chat/completions. Официальный OpenAI SDK работает с адресом https://api.kosareva.cloud/v1. Порядок как у OpenAI: файл с запросами, пакет из этого файла, статус, файл с ответами.
{"custom_id": "card-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gemini-3-8-flash", "max_tokens": 1024, "messages": [{"role": "user", "content": "Переведи на английский: Кружка керамическая, 350 мл"}]}}
{"custom_id": "card-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gemini-3-8-flash", "max_tokens": 1024, "messages": [{"role": "user", "content": "Переведи на английский: Чайник стеклянный, 1 л"}]}}
В каждой строке custom_id, method, url и body, а в body обычный запрос к chat/completions. Модель во всех строках одна: для другой модели соберите отдельный пакет.
import json
import time
from openai import OpenAI
client = OpenAI(api_key="ВАШ_API_КЛЮЧ", base_url="https://api.kosareva.cloud/v1")
# 1. Загрузить файл с запросами
with open("requests.jsonl", "rb") as source:
input_file = client.files.create(file=source, purpose="batch")
# 2. Создать пакет
batch = client.batches.create(
input_file_id=input_file.id,
endpoint="/v1/chat/completions",
completion_window="24h",
)
# 3. Ждать, пока пакет не закончится
while batch.status not in ("completed", "failed", "expired"):
time.sleep(60)
batch = client.batches.retrieve(batch.id)
# 4. Забрать ответы: по строке JSON на запрос
if batch.output_file_id:
for line in client.files.content(batch.output_file_id).text.splitlines():
item = json.loads(line)
print(item["custom_id"], item["response"]["body"]["choices"][0]["message"]["content"])
# Запросы с ошибкой и просроченные: за них денег не списано
if batch.error_file_id:
print(client.files.content(batch.error_file_id).text)
# 1. Загрузить файл, в ответе id файла
curl https://api.kosareva.cloud/v1/files \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-F purpose="batch" \
-F file="@requests.jsonl"
# 2. Создать пакет из файла
curl https://api.kosareva.cloud/v1/batches \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"input_file_id":"ID_ФАЙЛА","endpoint":"/v1/chat/completions","completion_window":"24h"}'
# 3. Спрашивать раз в минуту, пока status не станет completed
curl https://api.kosareva.cloud/v1/batches/ID_ПАКЕТА \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ"
# 4. Скачать ответы: output_file_id из статуса
curl https://api.kosareva.cloud/v1/files/ID_ФАЙЛА_ОТВЕТОВ/content \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" -o output.jsonl
| Метод и путь | Что делает |
|---|---|
POST /v1/files | загрузить JSONL с запросами: multipart/form-data, purpose=batch |
POST /v1/batches | создать пакет: input_file_id, endpoint, completion_window: "24h" |
GET /v1/batches/{id} | статус, output_file_id и error_file_id |
GET /v1/files/{id}/content | скачать файл ответов или ошибок |
GET /v1/batches | список ваших пакетов |
Отменить пакет в этом формате нельзя: он доработает сам, а оплатить придётся только обработанные запросы. Ответы приходят в output_file_id. Запросы с ошибкой и просроченные попадают в error_file_id, за них денег не списано.
Сколько стоит
Пакетом модель стоит ровно половину своей обычной цены на вход и на выход. Деньги списываются только за успешно обработанные запросы. Если запрос упал, отменён или не успел в срок, он бесплатный.
| Модель | Обычно, вход / выход | Пакетом, вход / выход |
|---|---|---|
| Claude Haiku 5.5 | 10,8 / 54 ₽ | 5,4 / 27 ₽ |
| Claude Sonnet 5.5 | 216 / 1 080 ₽ | 108 / 540 ₽ |
| Claude Opus 5.5 | 432 / 2 160 ₽ | 216 / 1 080 ₽ |
| Gemini 3.8 Flash | 81 / 405 ₽ | 40,5 / 202,5 ₽ |
| GPT-6 Luna | 10,8 / 54 ₽ | 5,4 / 27 ₽ |
| DeepSeek V4.1 Flash | 32,4 / 129,6 ₽ | 16,2 / 64,8 ₽ |
Цены за 1M токенов. Например, 1 000 запросов к Claude Sonnet 5.5, в каждом 2 000 токенов на входе и 500 на выходе вместе с рассуждениями. Обычными запросами это 972 ₽, пакетом 486 ₽.
Цены других моделей на их страницах в каталоге, пакетом делите вход и выход пополам. Расход по пакету появляется в «Статистике» кабинета, когда пакет закончится.
Удержание и списание
- При создании пакета с баланса удерживается сумма по оценке сверху: вход считается по объёму запросов, выход по
max_tokensкаждого запроса и цене выхода. - Когда пакет закончится, удержание снимается и списывается фактический расход по цене пакета.
- Если на балансе или в лимите ключа меньше оценки, пакет не создаётся и ничего не удерживается. Придёт ответ 402 с нужной суммой и ссылкой на пополнение.
- Ставьте
max_tokensпо реальной длине ответа с запасом на рассуждения: чем он выше, тем больше удержим на время работы пакета. В формате OpenAI поле можно не передавать, но тогда оценка возьмёт на ответ большой запас.
Сроки и лимиты
| Что | Сколько |
|---|---|
| Срок обработки | обычно минуты, как правило в течение суток, изредка дольше; запросы, которые не успели, получают expired и не оплачиваются |
| Запросов в пакете | до 100 000 |
| Размер | до 100 МБ на пакет, в формате OpenAI до 100 МБ на файл |
| Хранение | результаты и загруженные файлы 29 дней, потом они удаляются |
Что в пакетах не работает
Коротко: текст и код через /v1/messages и /v1/chat/completions работают, потоковая выдача, серверные инструменты и маскирование данных нет.
Официальные SDK работает
Anthropic SDK (client.messages.batches) и OpenAI SDK (client.files, client.batches) работают без правок кода: меняются ключ, адрес и имена моделей.
Потоковая выдача нет
Поле stream в запросе пакета снимается: ответ целиком лежит в результатах.
Серверные инструменты нет
Веб-поиск, загрузка страниц, выполнение кода и MCP в пакетах не работают. Пакет с таким запросом не создаётся, ответ 400.
Эмбеддинги и Responses API нет
Пакетом идут только /v1/messages и /v1/chat/completions. /v1/embeddings и /v1/responses отправляйте обычными запросами.
API Guard нет
Адрес /guard/v1/ пакеты не принимает, отправляйте их на /v1/. Персональные данные в пакете не маскируются.
Отмена в формате OpenAI нет
Пакет доработает сам. Отменить можно только пакет в формате Anthropic.
Ошибки
Ошибки приходят с объяснением по-русски в error.message. Пакет, который не создан, ничего не стоит.
400 при создании пакета
Деньги не удержаны. Причина в тексте ошибки: нет max_tokens в формате Anthropic, неверный или повторяющийся custom_id, модель недоступна пакетом или этому ключу, разные модели в файле формата OpenAI, серверный инструмент в запросе или адрес /guard/v1/.
400 на запросе результатов
Пакет ещё идёт. Результаты в формате Anthropic отдаются, когда processing_status стал ended.
402: не хватает денег на удержание
Оценки сверху не хватило денег на балансе или в лимите ключа, в ответе нужная сумма и ссылка на пополнение. Пополните баланс, уменьшите max_tokens или разделите пакет.
413: пакет больше 100 МБ
Разделите запросы на несколько пакетов.
Модели
Пакеты принимают 42 модели: 15 моделей Claude в формате Anthropic и 33 модели в формате OpenAI. Имя в запросе как в каталоге.
| Модель | Имя в запросе | Anthropic | OpenAI |
|---|---|---|---|
| Claude Opus 5.5 | claude-opus-5-5 | да | да |
| Claude Opus 5 | claude-opus-5 | да | да |
| Claude Opus 4.8 | claude-opus-4-8 | да | — |
| Claude Opus 4.7 | claude-opus-4-7 | да | — |
| Claude Opus 4.6 | claude-opus-4-6 | да | — |
| Claude Opus 4.5 | claude-opus-4-5 | да | — |
| Claude Sonnet 5.5 | claude-sonnet-5-5 | да | да |
| Claude Sonnet 5 | claude-sonnet-5 | да | — |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | да | — |
| Claude Sonnet 4.5 | claude-sonnet-4-5 | да | — |
| Claude Haiku 5.5 | claude-haiku-5-5 | да | да |
| Claude Haiku 4.5 | claude-haiku-4-5 | да | — |
| Claude Fable 5 | claude-fable-5 | да | — |
| Claude Fable 5.1 | claude-fable-5-1 | да | да |
| Claude Fable 5.2 | claude-fable-5-2 | да | да |
| Gemini 3 Flash | gemini-3-flash | — | да |
| Gemini 3.1 Flash-Lite | gemini-3-1-flash-lite | — | да |
| Gemini 3.1 Pro | gemini-3-1-pro | — | да |
| Gemini 3.5 Flash | gemini-3-5-flash | — | да |
| Gemini 3.5 Flash-Lite | gemini-3-5-flash-lite | — | да |
| Gemini 3.6 Flash | gemini-3-6-flash | — | да |
| Gemini 3.7 Flash | gemini-3-7-flash | — | да |
| Gemini 3.8 Flash | gemini-3-8-flash | — | да |
| Gemini 4 Argon | gemini-4-argon | — | да |
| GPT-5 nano | gpt-5-nano | — | да |
| GPT-5.6 Luna | gpt-5-6-luna | — | да |
| GPT-5.6 Sol | gpt-5-6-sol | — | да |
| GPT-5.6 Terra | gpt-5-6-terra | — | да |
| GPT-6 Luna | gpt-6-luna | — | да |
| GPT-6 Luna Pro | gpt-6-luna-pro | — | да |
| GPT-6 Sol | gpt-6-sol | — | да |
| GPT-6 Sol Pro | gpt-6-sol-pro | — | да |
| GPT-6 Astra | gpt-6-astra | — | да |
| GPT-6 Astra Pro | gpt-6-astra-pro | — | да |
| GPT-6.1 Sol | gpt-6-1-sol | — | да |
| GPT-6.1 Sol Pro | gpt-6-1-sol-pro | — | да |
| GPT-6.1 Terra | gpt-6-1-terra | — | да |
| GPT-6.1 Terra Pro | gpt-6-1-terra-pro | — | да |
| DeepSeek V4 Flash | deepseek-v4-flash | — | да |
| DeepSeek V4.1 Flash | deepseek-v4-1-flash | — | да |
| GLM-5.2 | glm-5-2 | — | да |
| GLM-5.3 | glm-5-3 | — | да |
Прочерк значит, что в этом формате модель пакетом не принимается.
Частые вопросы
Когда пакет выгоднее обычных запросов?
Когда ответ не нужен сразу. Пакет стоит половину обычной цены, но результаты забираются, когда он закончится: обычно через минуты, как правило в течение суток, изредка позже. Для чата и всего, где человек ждёт ответа, нужны обычные запросы.
Подойдёт ли код, написанный под Batch API Anthropic или OpenAI?
Да. Меняются ключ, адрес и имена моделей: у Anthropic SDK https://api.kosareva.cloud без /v1, у OpenAI SDK https://api.kosareva.cloud/v1, имена как в каталоге, например claude-sonnet-5-5.
Что будет с деньгами, если часть запросов не прошла?
За них ничего не спишется: платные только успешно обработанные запросы. Удержанная при создании сумма после завершения снимается целиком, а списывается фактический расход.
Можно ли отменить пакет?
В формате Anthropic да: POST /v1/messages/batches/{id}/cancel, необработанные запросы не оплачиваются. В формате OpenAI нет, пакет доработает сам.
Где посмотреть, сколько стоил пакет?
В «Статистике» кабинета: пакет появляется там, когда закончится.