kosareva.cloud
RU
РусскийEnglish

Пакетная обработка (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.510,8 / 54 ₽5,4 / 27 ₽
Claude Sonnet 5.5216 / 1 080 ₽108 / 540 ₽
Claude Opus 5.5432 / 2 160 ₽216 / 1 080 ₽
Gemini 3.8 Flash81 / 405 ₽40,5 / 202,5 ₽
GPT-6 Luna10,8 / 54 ₽5,4 / 27 ₽
DeepSeek V4.1 Flash32,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. Имя в запросе как в каталоге.

МодельИмя в запросеAnthropicOpenAI
Claude Opus 5.5claude-opus-5-5дада
Claude Opus 5claude-opus-5дада
Claude Opus 4.8claude-opus-4-8да—
Claude Opus 4.7claude-opus-4-7да—
Claude Opus 4.6claude-opus-4-6да—
Claude Opus 4.5claude-opus-4-5да—
Claude Sonnet 5.5claude-sonnet-5-5дада
Claude Sonnet 5claude-sonnet-5да—
Claude Sonnet 4.6claude-sonnet-4-6да—
Claude Sonnet 4.5claude-sonnet-4-5да—
Claude Haiku 5.5claude-haiku-5-5дада
Claude Haiku 4.5claude-haiku-4-5да—
Claude Fable 5claude-fable-5да—
Claude Fable 5.1claude-fable-5-1дада
Claude Fable 5.2claude-fable-5-2дада
Gemini 3 Flashgemini-3-flash—да
Gemini 3.1 Flash-Litegemini-3-1-flash-lite—да
Gemini 3.1 Progemini-3-1-pro—да
Gemini 3.5 Flashgemini-3-5-flash—да
Gemini 3.5 Flash-Litegemini-3-5-flash-lite—да
Gemini 3.6 Flashgemini-3-6-flash—да
Gemini 3.7 Flashgemini-3-7-flash—да
Gemini 3.8 Flashgemini-3-8-flash—да
Gemini 4 Argongemini-4-argon—да
GPT-5 nanogpt-5-nano—да
GPT-5.6 Lunagpt-5-6-luna—да
GPT-5.6 Solgpt-5-6-sol—да
GPT-5.6 Terragpt-5-6-terra—да
GPT-6 Lunagpt-6-luna—да
GPT-6 Luna Progpt-6-luna-pro—да
GPT-6 Solgpt-6-sol—да
GPT-6 Sol Progpt-6-sol-pro—да
GPT-6 Astragpt-6-astra—да
GPT-6 Astra Progpt-6-astra-pro—да
GPT-6.1 Solgpt-6-1-sol—да
GPT-6.1 Sol Progpt-6-1-sol-pro—да
GPT-6.1 Terragpt-6-1-terra—да
GPT-6.1 Terra Progpt-6-1-terra-pro—да
DeepSeek V4 Flashdeepseek-v4-flash—да
DeepSeek V4.1 Flashdeepseek-v4-1-flash—да
GLM-5.2glm-5-2—да
GLM-5.3glm-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 нет, пакет доработает сам.

Где посмотреть, сколько стоил пакет?

В «Статистике» кабинета: пакет появляется там, когда закончится.