Руководства
Streaming и SSE
Потоковая доставка Chat Completions и Responses API через Server-Sent Events.
Добавьте "stream": true. Сервер отвечает text/event-stream; каждый фрейм начинается с data: и отделяется пустой строкой.
curl -N https://demoqa.ru/v1/chat/completions \
-H "Authorization: Bearer $DEMOQA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4.1-mini",
"messages": [{"role":"user","content":"Дай чек-лист smoke-теста"}],
"stream": true
}'Чтение потока в TypeScript
const response = await fetch('https://demoqa.ru/v1/responses', options);
if (!response.ok || !response.body) throw new Error(`HTTP ${response.status}`);
const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
let buffer = '';
while (true) {
const { value = '', done } = await reader.read();
if (done) break;
buffer += value;
const frames = buffer.split('\n\n');
buffer = frames.pop() ?? '';
for (const frame of frames) {
const data = frame.split('\n').find(line => line.startsWith('data:'))?.slice(5).trim();
if (data && data !== '[DONE]') console.log(JSON.parse(data));
}
}Не предполагаете, что один network chunk равен одному SSE-событию: граница может пройти в любом месте UTF-8 текста. Учитывайте AbortController, таймаут бездействия и возможное завершение соединения до финального события.