Используйте Anthropic Messages

Отправьте запрос формата Messages с заголовками и базовым адресом Anthropic-клиента.

Задайте BASE_URL как корневой HTTPS-адрес API без завершающего / и без /v1, а API_KEY передайте из хранилища секретов. OpenAI-совместимые SDK используют ${BASE_URL}/v1, Anthropic-совместимые — BASE_URL.

Выбирайте Messages для Anthropic-совместимого клиента. Базовый адрес — BASE_URL, без /v1. Нужны ключ организации, доступная модель и кредиты.

Отправьте одно сообщение

bash
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; эта операция всё равно учитывается в минутном лимите запросов. Формат событий описан в потоках.

Прочитайте ответ и usage

Пример показывает форму завершённого ответа; ID, текст и токены вашего запроса будут другими:

json
{
  "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 по мере поступления. Один раз создайте ключ идемпотентности, чтобы после обрыва повторить тот же логический запрос:

bash
export UNLIMGPT_REQUEST_KEY="$(openssl rand -hex 16)"

Отправьте запрос из той же оболочки:

bash
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:

bash
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}; оценка зависит от ввода. Вызов не запускает генерацию, но входит в минутный лимит запросов организации. В ответе также есть заголовки оставшегося лимита запросов. Если каталог модели или тариф не разрешают вызов, проверьте модели и лимиты.

Далее: авторизация и ошибки.