Стриминг ответов
Как получать ответ по мере генерации через SSE: примеры на curl и Node.js, разбор событий и настройка таймаутов.
Обновлено 20 июл. 2026 г.⏱ 5 мин
#стриминг#streaming#sse#поток#node#curl
Стриминг отдаёт ответ по мере генерации через Server-Sent Events (SSE) — пользователь видит текст сразу, без ожидания полного ответа. Формат событий совпадает с оригинальным API вендора.
#Как включить
Добавьте в тело запроса "stream": true. Ответ придёт потоком SSE-событий вместо одного JSON.
#curl
стриминг через curl
curl -N https://api.tkbk.io/openai/v1/chat/completions \
-H "Authorization: Bearer cr_your_key" \
-H "content-type: application/json" \
-d '{
"model": "gpt-5-mini",
"stream": true,
"messages": [{"role": "user", "content": "Считай вслух от 1 до 5"}]
}'Флаг -N (--no-buffer) отключает буферизацию curl, чтобы токены появлялись сразу.
#Node.js
OpenAI SDK, потоковый ответ
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.tkbk.io/openai/v1",
apiKey: process.env.OPENAI_API_KEY,
});
const stream = await client.chat.completions.create({
model: "gpt-5-mini",
stream: true,
messages: [{ role: "user", content: "Расскажи про токены в двух предложениях" }],
});
for await (const part of stream) {
process.stdout.write(part.choices[0]?.delta?.content || "");
}#Разбор SSE-событий
- Каждое событие — строка
data: {…}с очередным фрагментом (delta). - У Claude приходят типизированные события (
content_block_deltaи др.), у OpenAI — чанки сchoices[].delta. - Признак конца потока: строка
data: [DONE](OpenAI) или событиеmessage_stop(Claude). - Склеивайте фрагменты
deltaв полный текст на своей стороне.
#Таймауты
⚠
Держите соединение живым
Для стриминга ставьте таймаут по бездействию, а не по общей длительности: длинный ответ — это нормально долгий поток. Обрывайте соединение только если фрагменты перестали приходить.