GoRouter

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 немедленно остановил расчёт; итоговое списание выполняется по фактическому результату.

На этой странице