Потоковые ответы

В потоковом режиме сгенерированные данные поступают постепенно, поэтому ждать полного ответа не нужно. GetRouter поддерживает потоковую передачу для эндпоинтов Chat Completions и Responses, если её поддерживают выбранная модель и канал.

Chat Completions с cURL

Задайте для stream значение true и используйте curl -N, чтобы отключить буферизацию на стороне клиента:

curl -N https://getrouter.ai/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MODEL_ID",
    "stream": true,
    "messages": [
      {"role": "user", "content": "Напиши стихотворение из четырёх строк."}
    ]
  }'

Chat Completions передаёт Server-Sent Events. Текстовые фрагменты находятся по адресу:

choices[0].delta.content

Обычно поток завершается терминальным событием, например [DONE].

Chat Completions с Python

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://getrouter.ai/v1",
)

stream = client.chat.completions.create(
    model="MODEL_ID",
    stream=True,
    messages=[{"role": "user", "content": "Напиши стихотворение из четырёх строк."}],
)

for chunk in stream:
    text = chunk.choices[0].delta.content
    if text:
        print(text, end="", flush=True)

Потоковая передача Responses API

curl -N https://getrouter.ai/v1/responses \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MODEL_ID",
    "stream": true,
    "input": "Перечисли три преимущества потоковых API."
  }'

В потоковой передаче Responses используются объекты событий Responses API, а не фрагменты Chat Completions choices[].delta. Разбирайте события в соответствии с их type и не используйте парсер, предназначенный только для Chat Completions.

stream_options

Схема Chat Completions принимает stream_options, но поддержка зависит от выбранного канала модели. Если параметр, поддерживаемый вышестоящим сервисом, отклонён, удалите его и повторите запрос только с stream: true.

Вызовы инструментов при потоковой передаче

Аргументы вызова инструмента могут поступать в нескольких фрагментах. Накапливайте их по индексу или идентификатору вызова, а затем разбирайте и выполняйте только полный набор аргументов.

Обработка разрывов соединения

Потоковое соединение может завершиться до терминального события из-за тайм-аута клиента или прокси, сетевого сбоя либо ошибки вышестоящего сервиса.

Клиент должен:

  • Считать ответ без терминального события незавершённым
  • При необходимости сохранять уже полученный текст
  • Не повторять без проверки неидемпотентные действия инструментов
  • Устанавливать достаточные для выбранной модели тайм-ауты
  • Записывать идентификатор запроса и ошибку в журнал, но не записывать ключ API
Warning

Не запускайте частично выполненный сценарий работы агента или инструмента повторно, если приложение не умеет предотвращать дублирование побочных эффектов.

Устранение неполадок

Весь ответ приходит сразу

Клиент, обратный прокси или промежуточное ПО может буферизовать данные SSE. Прежде чем отлаживать интерфейс, проверьте запрос напрямую с помощью curl -N.

Соединение сразу закрывается

Убедитесь, что модель поддерживает потоковую передачу для выбранного эндпоинта. Прежде чем считать проблему сетевым сбоем, также проверьте событие ошибки или тело HTTP-ответа.

Во фрагментах нет данных об использовании

Наличие данных об использовании в потоковых ответах зависит от протокола, параметров запроса и канала модели. Не требуйте, чтобы они присутствовали в каждом фрагменте.

Что дальше