Когда использовать поток

Только chat completions принимает stream=true. Текстовый стриминг должен быть включён в сервисе: если он выключен, запрос отклоняется до обработки с HTTP 503 stream_not_enabled (см. ошибки). Ответ имеет Content-Type: text/event-stream.

API отправляет текстовые delta или tool_calls delta, затем finish_reason, usage/billing и [DONE]. OpenAI SDK читает этот поток. Ошибка после начала SSE приходит внутри потока, поскольку HTTP-статус уже отправлен. Если исход подтверждён, событие содержит error и billing.status (released — резерв освобождён, settled — списана подтверждённая стоимость). Если нет, приходит request_pending (409): запрос принят, резерв сохраняется, а результат определяйте повтором с прежним Idempotency-Key.

Пример JavaScript

Подготовьте клиент OpenAI и переменные окружения по быстрому старту. Сохраните отдельный REQUEST_ID для этого запроса. Пример читает текстовые части; инструменты обрабатывайте отдельно по tool_calls.

const stream = await client.chat.completions.create({
  model: process.env.KVANTORA_MODEL_ID,
  messages: [{ role: 'user', content: 'Объясни, что такое API' }],
  max_tokens: 256,
  stream: true,
}, { headers: { 'Idempotency-Key': process.env.REQUEST_ID } });
for await (const chunk of stream) {
  const text = chunk.choices?.[0]?.delta?.content;
  if (text) process.stdout.write(text);
  if (chunk.usage) console.log('\nРасход токенов:', chunk.usage);
}

Сохраните usage и billing из финальных данных для учёта. Частичный текст ещё не подтверждает успешное завершение; при ошибке потока сохраните ID запроса и уже полученные события.

Разрыв соединения

Закрытие вкладки или остановка показа не отменяют обработку и не освобождают резерв неизвестного исхода. Повтор с прежним Idempotency-Key и телом возвращает сохранённый результат либо состояние сверки. Не меняйте ID для «исправления» сетевой ошибки.

Responses и Messages в текущем поднаборе поддерживают только stream=false.