Используйте Chat Completions

Отправьте массив сообщений через OpenAI-совместимый API Chat Completions.

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

Выбирайте Chat Completions, если клиент ожидает массив messages и choices. Для новой интеграции основной путь — Responses. Нужны ключ, доступная модель и кредиты.

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

bash
printf 'Authorization: Bearer %s\n' "$API_KEY" \
  | curl -q -H @- -i "$BASE_URL/v1/chat/completions" \
    -H "Content-Type: application/json" \
    -d '{
  "model": "gpt-5.6-sol",
  "messages": [
    {
      "role": "user",
      "content": "Ответь одним коротким предложением."
    }
  ],
  "max_tokens": 64,
  "stream": false
}'

HTTP 200 возвращает chat completion с массивом choices и usage. Ответ помощника находится в choices[0].message; текст генерации не детерминирован. Сохраните HTTP-заголовок request-id для поддержки; endpoint, время и исход недавней операции смотрите в активности API. ID запуска отличается от заголовка. Если клиенту нужен вывод по частям, установите stream: true и откройте руководство по потокам. Неизвестные поля и неподдерживаемые обязательные возможности отклоняются до генерации. Необязательные параметры могут быть опущены, если недоступны при исполнении выбранной модели; это отображается в активности API.

Найдите ответ в choices

Пример показывает структуру успешного ответа; ID, текст и числа токенов у вашего вызова изменятся:

json
{
  "id": "chatcmpl-018f3f407b447cc4b8ba3f62656c299c",
  "object": "chat.completion",
  "created": 1790244000,
  "model": "gpt-5.6-sol",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "Готово." },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 5,
    "total_tokens": 17,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 0 }
  }
}

Проверяйте choices[0].finish_reason: stop означает обычное завершение, length — ограничение длины, tool_calls — необходимость выполнить функцию в вашем приложении. При вызове инструмента message.content может быть null, а message.tool_calls содержит имя, JSON-аргументы и ID вызова. Текущая активность API показывает исход, токены и окончательное списание в кредитах; не считайте total_tokens ценой в деньгах.

Когда включать поток

Ключ -N позволяет видеть SSE-события по мере поступления. Если после обрыва потребуется безопасный повтор, один раз создайте ключ идемпотентности и сохраните его с неизменным телом запроса:

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

В той же оболочке запросите финальную часть с расходом токенов, если он нужен клиенту:

bash
test -n "${UNLIMGPT_REQUEST_KEY:-}" \
  && printf 'Authorization: Bearer %s\n' "$API_KEY" \
  | curl -q -H @- -i -N "$BASE_URL/v1/chat/completions" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: $UNLIMGPT_REQUEST_KEY" \
    -d '{
  "model": "gpt-5.6-sol",
  "messages": [
    {
      "role": "user",
      "content": "Посчитай до трёх."
    }
  ],
  "max_tokens": 64,
  "stream": true,
  "stream_options": {
    "include_usage": true
  }
}'

HTTP 200 означает начало потока. Собирайте choices[].delta по порядку. Последняя часть с выбором содержит finish_reason; при include_usage: true за ней идёт часть с пустым choices и итоговым usage, затем data: [DONE]. Обрыв TCP до этого маркера не доказывает завершение. Для повтора запускайте только второй блок с прежним ключом и тем же телом; повтор команды OpenSSL создаст новый запрос. Формат событий и безопасный повтор описаны в потоках и идемпотентности. Для новой интеграции со структурированным выводом и сохранением ответа начните с Responses.

Далее: ошибки и лимиты.