Пакетная обработка — это мощный подход для эффективной обработки больших объемов запросов. Вместо обработки запросов по одному с немедленными ответами, пакетная обработка позволяет отправлять несколько запросов вместе для асинхронной обработки. Этот паттерн особенно полезен, когда:
API Message Batches — это наша первая реализация этого паттерна.
API Message Batches — это мощный, экономически эффективный способ асинхронной обработки больших объемов запросов Messages. Этот подход хорошо подходит для задач, которые не требуют немедленных ответов, при этом большинство пакетов завершается менее чем за 1 час, снижая затраты на 50% и увеличивая пропускную способность.
Вы можете изучить справочник API напрямую, в дополнение к этому руководству.
Когда вы отправляете запрос в API Message Batches:
Это особенно полезно для массовых операций, которые не требуют немедленных результатов, таких как:
Все активные модели поддерживают API Message Batches.
Любой запрос, который вы можете сделать к Messages API, может быть включен в пакет. Это включает:
Поскольку каждый запрос в пакете обрабатывается независимо, вы можете смешивать различные типы запросов в одном пакете.
Поскольку пакеты могут обрабатываться дольше 5 минут, рассмотрите использование 1-часовой продолжительности кэша с кэшированием промптов для лучших показателей попадания в кэш при обработке пакетов с общим контекстом.
Batches API предлагает значительную экономию затрат. Все использование тарифицируется по 50% от стандартных цен API.
| Model | Batch input | Batch output |
|---|---|---|
| Claude Opus 4.5 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.1 | $7.50 / MTok | $37.50 / MTok |
| Claude Opus 4 | $7.50 / MTok | $37.50 / MTok |
| Claude Sonnet 4.5 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 4 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 3.7 (deprecated) | $1.50 / MTok | $7.50 / MTok |
| Claude Haiku 4.5 | $0.50 / MTok | $2.50 / MTok |
| Claude Haiku 3.5 | $0.40 / MTok | $2 / MTok |
| Claude Opus 3 () |
Message Batch состоит из списка запросов для создания Message. Форма отдельного запроса включает:
custom_id для идентификации запроса Messagesparams со стандартными параметрами Messages APIВы можете создать пакет, передав этот список в параметр requests:
В этом примере два отдельных запроса объединены в пакет для асинхронной обработки. Каждый запрос имеет уникальный custom_id и содержит стандартные параметры, которые вы бы использовали для вызова Messages API.
Протестируйте ваши пакетные запросы с Messages API
Валидация объекта params для каждого запроса сообщения выполняется асинхронно, и ошибки валидации возвращаются, когда обработка всего пакета завершена. Вы можете убедиться, что правильно строите ваш ввод, проверив форму запроса с Messages API сначала.
Когда пакет впервые создается, ответ будет иметь статус обработки in_progress.
{
"id": "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
"type": "message_batch",
"processing_status": "in_progress",
"request_counts": {
"processing": 2,
"succeeded": 0,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": null,
"created_at": "2024-09-24T18:37:24.100435Z",
"expires_at": "2024-09-25T18:37:24.100435Z",
"cancel_initiated_at": null,
"results_url": null
}Поле processing_status Message Batch указывает на стадию обработки, на которой находится пакет. Оно начинается как in_progress, затем обновляется до ended, когда все запросы в пакете завершили обработку, и результаты готовы. Вы можете отслеживать состояние вашего пакета, посетив Консоль, или используя конечную точку получения:
Вы можете опрашивать эту конечную точку, чтобы знать, когда обработка завершена.
После завершения обработки пакета каждый запрос Messages в пакете будет иметь результат. Существует 4 типа результатов:
| Тип результата | Описание |
|---|---|
succeeded | Запрос был успешным. Включает результат сообщения. |
errored | Запрос столкнулся с ошибкой, и сообщение не было создано. Возможные ошибки включают недействительные запросы и внутренние ошибки сервера. Вы не будете оплачивать эти запросы. |
canceled | Пользователь отменил пакет до того, как этот запрос мог быть отправлен модели. Вы не будете оплачивать эти запросы. |
expired | Пакет достиг своего 24-часового истечения до того, как этот запрос мог быть отправлен модели. Вы не будете оплачивать эти запросы. |
Вы увидите обзор ваших результатов с request_counts пакета, который показывает, сколько запросов достигло каждого из этих четырех состояний.
Результаты пакета доступны для загрузки по свойству results_url на Message Batch, и если разрешения организации позволяют, в Консоли. Из-за потенциально большого размера результатов рекомендуется стримить результаты обратно, а не загружать их все сразу.
Результаты будут в формате .jsonl, где каждая строка является действительным JSON-объектом, представляющим результат одного запроса в Message Batch. Для каждого стримингового результата вы можете делать что-то разное в зависимости от его custom_id и типа результата. Вот пример набора результатов:
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","content":[{"type":"text","text":"Hello again! It's nice to see you. How can I assist you today? Is there anything specific you'd like to chat about or any questions you have?"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":11,"output_tokens":36}}}}
{"custom_id":"my-first-request","result":{"type":"succeeded","message":{"id":"msg_01FqfsLoHwgeFbguDgpz48m7","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","content":[{"type":"text","text":"Hello! How can I assist you today? Feel free to ask me any questions or let me know if there's anything you'd like to chat about."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"output_tokens":34}}}}Если ваш результат имеет ошибку, его result.error будет установлен в нашу стандартную форму ошибки.
Результаты пакета могут не соответствовать порядку ввода
Результаты пакета могут возвращаться в любом порядке и могут не соответствовать порядку запросов при создании пакета. В приведенном выше примере результат для второго пакетного запроса возвращается перед первым. Чтобы правильно сопоставить результаты с соответствующими запросами, всегда используйте поле custom_id.
API Message Batches поддерживает кэширование промптов, позволяя потенциально снизить затраты и время обработки для пакетных запросов. Скидки на ценообразование от кэширования промптов и Message Batches могут складываться, обеспечивая еще большую экономию затрат при совместном использовании обеих функций. Однако, поскольку пакетные запросы обрабатываются асинхронно и параллельно, попадания в кэш предоставляются по принципу наилучших усилий. Пользователи обычно испытывают показатели попадания в кэш от 30% до 98%, в зависимости от их паттернов трафика.
Чтобы максимизировать вероятность попаданий в кэш в ваших пакетных запросах:
cache_control в каждый запрос Message в вашем пакетеПример реализации кэширования промптов в пакете:
В этом примере оба запроса в пакете включают идентичные системные сообщения и полный текст "Гордости и предубеждения", помеченный cache_control для увеличения вероятности попаданий в кэш.
Чтобы получить максимум от Batches API:
custom_id для легкого сопоставления результатов с запросами, поскольку порядок не гарантируется.Если вы испытываете неожиданное поведение:
request_too_large.custom_id.created_at пакета (не ended_at обработки). Если прошло более 29 дней, результаты больше не будут доступны для просмотра.Обратите внимание, что сбой одного запроса в пакете не влияет на обработку других запросов.
Изоляция рабочего пространства: Пакеты изолированы в рамках рабочего пространства, в котором они созданы. К ним могут получить доступ только API ключи, связанные с этим рабочим пространством, или пользователи с разрешением на просмотр пакетов рабочего пространства в Консоли.
Доступность результатов: Результаты пакетов доступны в течение 29 дней после создания пакета, предоставляя достаточно времени для получения и обработки.
| $7.50 / MTok |
| $37.50 / MTok |
| Claude Haiku 3 | $0.125 / MTok | $0.625 / MTok |
curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"requests": [
{
"custom_id": "my-first-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, world"}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hi again, friend"}
]
}
}
]
}'curl https://api.anthropic.com/v1/messages/batches/msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
| sed -E 's/.*"id":"([^"]+)".*"processing_status":"([^"]+)".*/Batch \1 processing status is \2/'#!/bin/sh
curl "https://api.anthropic.com/v1/messages/batches/msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
| grep -o '"results_url":[[:space:]]*"[^"]*"' \
| cut -d'"' -f4 \
| while read -r url; do
curl -s "$url" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
| sed 's/}{/}\n{/g' \
| while IFS= read -r line
do
result_type=$(echo "$line" | sed -n 's/.*"result":[[:space:]]*{[[:space:]]*"type":[[:space:]]*"\([^"]*\)".*/\1/p')
custom_id=$(echo "$line" | sed -n 's/.*"custom_id":[[:space:]]*"\([^"]*\)".*/\1/p')
error_type=$(echo "$line" | sed -n 's/.*"error":[[:space:]]*{[[:space:]]*"type":[[:space:]]*"\([^"]*\)".*/\1/p')
case "$result_type" in
"succeeded")
echo "Success! $custom_id"
;;
"errored")
if [ "$error_type" = "invalid_request" ]; then
# Request body must be fixed before re-sending request
echo "Validation error: $custom_id"
else
# Request can be retried directly
echo "Server error: $custom_id"
fi
;;
"expired")
echo "Expired: $line"
;;
esac
done
done
curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"requests": [
{
"custom_id": "my-first-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Analyze the major themes in Pride and Prejudice."}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Write a summary of Pride and Prejudice."}
]
}
}
]
}'