OpenAI API через curl: первый запрос к Responses API

В этой статье

Для быстрой проверки OpenAI API SDK не обязателен. Нужны curl, API-ключ и модель, доступная именно вашему API-проекту. Запрос отправляется в Responses API: POST https://api.openai.com/v1/responses; минимальные поля — model и input (пример параметров для curl).

Подготовьте ключ

Не вставляйте секрет непосредственно в команду, репозиторий, браузерный JavaScript или текст статьи. Переменная OPENAI_API_KEY передаст ключ процессу curl и не изменит сам JSON-запрос.

В macOS или Linux введите ключ без отображения символов:

read -s OPENAI_API_KEY
export OPENAI_API_KEY

В PowerShell:

$env:OPENAI_API_KEY = [System.Net.NetworkCredential]::new('', (Read-Host 'OPENAI_API_KEY' -AsSecureString)).Password

Ключ вводите вы в своём терминале. Если переменная уже задана в профиле shell или CI, шаг можно пропустить.

Запрос в macOS и Linux

Замените YOUR_AVAILABLE_MODEL на идентификатор модели, доступный вашему проекту. Список моделей и права доступа зависят от проекта, поэтому не копируйте ID из чужого примера вслепую.

curl https://api.openai.com/v1/responses \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
    "model": "YOUR_AVAILABLE_MODEL",
    "input": "Ответь одним предложением, что такое HTTP"
  }'

Обратный слэш продолжает команду на следующей строке. JSON заключён в одинарные кавычки, поэтому shell не интерпретирует его двойные кавычки до отправки.

Чтобы одновременно сохранить тело ответа и вывести HTTP-код, выполните:

curl -sS \
  -D response-headers.txt \
  -o response.json \
  -w "HTTP %{http_code}\n" \
  https://api.openai.com/v1/responses \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
    "model": "YOUR_AVAILABLE_MODEL",
    "input": "Ответь одним предложением, что такое HTTP"
  }'

Код 2xx означает, что HTTP-запрос принят успешно, но этого недостаточно: проверьте JSON и содержательный текст. Если установлен jq, типичный текст ответа можно извлечь так:

jq -r '.output[]?.content[]? | select(.type == "output_text") | .text' response.json

Responses API возвращает объект со статусом и массивом output. У curl нет SDK-свойства output_text: текст нужно найти в JSON (описание объекта ответа). Структура output может отличаться, например при использовании инструментов, поэтому сначала полезно посмотреть весь response.json, а фильтр применять как проверку типичного сообщения.

Вариант для Windows PowerShell

В PowerShell вызывайте именно curl.exe: слово curl в Windows может быть алиасом PowerShell-команды. Запишите тело запроса в UTF-8 без BOM: curl.exe получит байты из файла, поэтому PowerShell не меняет кавычки JSON при передаче аргумента.

$json = @'
{
  "model": "YOUR_AVAILABLE_MODEL",
  "input": "Ответь одним предложением, что такое HTTP"
}
'@
[System.IO.File]::WriteAllText(
  (Join-Path (Get-Location) 'request.json'),
  $json,
  [System.Text.UTF8Encoding]::new($false)
)

curl.exe https://api.openai.com/v1/responses `
  -H "Authorization: Bearer $env:OPENAI_API_KEY" `
  -H "Content-Type: application/json" `
  --data-binary '@request.json'

В PowerShell перенос команды обозначается обратным апострофом `, а не обратным слэшем. [System.Text.UTF8Encoding]::new($false) отключает BOM, а $env:OPENAI_API_KEY подставляется только при запуске. POSIX-вариант нельзя механически копировать в PowerShell: системы по-разному обрабатывают кавычки и переносы.

Проверка с сохранением результата:

$status = curl.exe -sS `
  -o response.json `
  -w "%{http_code}" `
  https://api.openai.com/v1/responses `
  -H "Authorization: Bearer $env:OPENAI_API_KEY" `
  -H "Content-Type: application/json" `
  --data-binary '@request.json'

Write-Host "HTTP $status"
$response = Get-Content -Raw response.json | ConvertFrom-Json
$response | Select-Object status, id, output

ConvertFrom-Json проверяет, что тело разбирается как JSON. В output найдите элемент content с типом output_text. Заранее фиксировать конкретную фразу нельзя: её вернёт выбранная модель при вашем запуске.

Как читать результат и ошибку

Проверяйте три независимые вещи: HTTP-код, возможность разобрать JSON и наличие ожидаемого текста в output.

  • 401 или 403 обычно указывают на неверный или отсутствующий ключ либо на отсутствие доступа проекта к выбранной модели. Сверьте OPENAI_API_KEY, проект и модель; точную причину прочитайте в JSON ошибки.
  • 400 означает, что сервер не принял параметры или JSON. Проверьте кавычки, запятые, имя поля model и значение input.
  • 429 связан с лимитом или слишком частыми запросами. Текст ошибки подскажет, что именно ограничено; повторяйте запрос с учётом этого условия.

Если пришёл 2xx, но фильтр не вывел текст, не объявляйте запрос сломанным по одному пути JSON. Выведите полный response.json и посмотрите фактические элементы output: статус ответа, сообщение и результаты инструментов — разные части структуры.

Если после проверки нужен программный вызов, можно перейти к инструкции с первым запросом через Python SDK; для текущей проверки SDK не нужен.

Если отдельно потребуется оплатить зарубежный цифровой сервис, можно посмотреть каталог оплаты зарубежных цифровых сервисов Amber Market: отдельные заказы там оплачиваются через СБП, а актуальные предложения и условия нужно проверить перед заказом. Это не пополнение OpenAI API: подписка ChatGPT и баланс API — разные вещи, и каталог не обещает наличие API-баланса.

Источники

Есть следующая задача?Ещё по теме «Работа с API» →