Текст и векторы
Потоковый ответ
SSE, завершение и разрыв соединения.
Когда использовать поток
Только 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.