Используйте Anthropic Messages
Отправьте запрос формата Messages с заголовками и базовым адресом Anthropic-клиента.
Отправьте запрос формата Messages с заголовками и базовым адресом Anthropic-клиента.
Задайте BASE_URL как корневой HTTPS-адрес API без завершающего / и без /v1, а API_KEY передайте из хранилища секретов. OpenAI-совместимые SDK используют ${BASE_URL}/v1, Anthropic-совместимые — BASE_URL.
Выбирайте Messages для Anthropic-совместимого клиента. Базовый адрес — BASE_URL, без /v1. Нужны ключ организации, доступная модель и кредиты.
printf 'x-api-key: %s\n' "$API_KEY" \
| curl -q -H @- -i "$BASE_URL/v1/messages" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"max_tokens": 64,
"messages": [
{
"role": "user",
"content": "Ответь одним коротким предложением."
}
],
"stream": false
}'
HTTP 200 возвращает объект message с блоками content и usage. Текст находится в текстовых блоках; слова генерации могут отличаться. Чтобы оценить входные токены без генерации, вызовите POST /v1/messages/count_tokens с теми же model и messages; эта операция всё равно учитывается в минутном лимите запросов. Формат событий описан в потоках.
Пример показывает форму завершённого ответа; ID, текст и токены вашего запроса будут другими:
{
"id": "msg_018f3f407b447cc4b8ba3f62656c299c",
"type": "message",
"role": "assistant",
"model": "gpt-5.6-sol",
"content": [{ "type": "text", "text": "Готово." }],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 12,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"output_tokens": 5
}
}
Показывайте пользователю текстовые блоки content, а tool_use выполняйте отдельным циклом только после проверки входных аргументов. stop_reason: max_tokens означает частичный ответ; tool_use означает, что ход ждёт результат инструмента. В Messages input_tokens обозначает некэшированную часть ввода: при анализе контекста учитывайте также cache read/write. Окончательное списание в кредитах смотрите в активности API.
Ключ -N позволяет видеть нативные события Messages по мере поступления. Один раз создайте ключ идемпотентности, чтобы после обрыва повторить тот же логический запрос:
export UNLIMGPT_REQUEST_KEY="$(openssl rand -hex 16)"
Отправьте запрос из той же оболочки:
test -n "${UNLIMGPT_REQUEST_KEY:-}" \
&& printf 'x-api-key: %s\n' "$API_KEY" \
| curl -q -H @- -i -N "$BASE_URL/v1/messages" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $UNLIMGPT_REQUEST_KEY" \
-d '{
"model": "gpt-5.6-sol",
"max_tokens": 64,
"messages": [
{
"role": "user",
"content": "Посчитай до трёх."
}
],
"stream": true
}'
HTTP 200 означает начало потока. message_start содержит ID сообщения; content_block_start, content_block_delta и content_block_stop обозначают границы каждого текстового блока или вызова инструмента. Прочитайте итоговые stop_reason и usage в message_delta, затем дождитесь message_stop, прежде чем отмечать запрос завершённым. Событие event: error в середине потока или обрыв до message_stop не означает успешный ответ. Для повтора запускайте только второй блок с прежним ключом и неизменным телом; новый ключ может начать ещё одну платную генерацию. В руководстве по потокам описаны восстановление и различия протоколов.
Перед генерацией отправьте те же model и messages в POST /v1/messages/count_tokens:
printf 'x-api-key: %s\n' "$API_KEY" \
| curl -q -H @- -i "$BASE_URL/v1/messages/count_tokens" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"messages": [
{
"role": "user",
"content": "Посчитай токены этого сообщения."
}
]
}'
HTTP 200 возвращает JSON с числом input_tokens, например {"input_tokens":12}; оценка зависит от ввода. Вызов не запускает генерацию, но входит в минутный лимит запросов организации. В ответе также есть заголовки оставшегося лимита запросов. Если каталог модели или тариф не разрешают вызов, проверьте модели и лимиты.
Далее: авторизация и ошибки.