Streaming
Получение Chat Completions и Responses по Server-Sent Events.
Задача
Показывать токены пользователю по мере генерации.
Рабочий пример
const response = await fetch("https://gorouter.ru/api/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GOROUTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "deepseek/deepseek-v4-flash-0731",
messages: [{ role: "user", content: "Назови три цвета" }],
stream: true,
}),
});
if (!response.ok || !response.body) throw new Error(await response.text());
for await (const chunk of response.body) {
process.stdout.write(new TextDecoder().decode(chunk));
}Важные параметры
- Укажите
stream: true. - Читайте ответ как
text/event-stream; не вызывайтеresponse.json(). - Финальное событие содержит usage, если его вернул upstream.
- При
stream: falseили без поля ответ возвращается готовым JSON после завершения генерации.
Ответ
GoRouter передаёт SSE-события без буферизации полного ответа. В финальном usage стоимость заменяется на сумму в RUB.
Ошибки и ограничения
- HTTP-ошибка до открытия потока возвращается обычным JSON-ответом.
- При HTTP 200 ошибка может прийти отдельным событием после части ответа. Проверяйте
error,choices[].errorи, для Responses,response.error. error.typeсодержит категорию причины,error.codeсохраняет исходный код сервиса. Категории и правила повторов — в справочнике ошибок.- Сохраняйте частичный ответ и не перезапускайте генерацию автоматически: повтор создаёт новый запрос.
- Разрыв соединения не гарантирует, что upstream немедленно остановил расчёт; итоговое списание выполняется по фактическому результату.