Skip to content

Стриминг

Узнайте, как реализовать стриминг ответов с помощью API AITUNNEL. Полное руководство по Server-Sent Events (SSE) и получению ответов от моделей в реальном времени.

API AITUNNEL позволяет получать ответы в режиме стриминга от любой модели. Это полезно для создания чат-интерфейсов или других приложений, где интерфейс должен обновляться по мере генерации ответа моделью.

Для включения стриминга установите параметр stream в значение true в вашем запросе. Модель будет отправлять ответ клиенту частями, а не возвращать весь ответ сразу.

Вот пример того, как реализовать стриминг и обработать ответ:

python
import requests
import json

question = "Как построить самое высокое здание в мире?"

url = "https://api.aitunnel.ru/v1/chat/completions"
headers = {
  "Authorization": "Bearer <AITUNNEL_API_KEY>",
  "Content-Type": "application/json"
}

payload = {
  "model": "gpt-4o",
  "messages": [{"role": "user", "content": question}],
  "stream": True
}

buffer = ""
with requests.post(url, headers=headers, json=payload, stream=True) as r:
  for chunk in r.iter_content(chunk_size=1024, decode_unicode=True):
    buffer += chunk
    while True:
      try:
        # Находим следующую полную строку SSE
        line_end = buffer.find('\n')
        if line_end == -1:
          break

        line = buffer[:line_end].strip()
        buffer = buffer[line_end + 1:]

        if line.startswith('data: '):
          data = line[6:]
          if data == '[DONE]':
            break

          try:
            data_obj = json.loads(data)
            content = data_obj["choices"][0]["delta"].get("content")
            if content:
              print(content, end="", flush=True)
          except json.JSONDecodeError:
            pass
      except Exception:
        break
typescript
const question = "Как построить самое высокое здание в мире?";
const response = await fetch("https://api.aitunnel.ru/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer <AITUNNEL_API_KEY>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "gpt-4o",
    messages: [{ role: "user", content: question }],
    stream: true,
  }),
});

const reader = response.body?.getReader();
if (!reader) {
  throw new Error("Тело ответа не может быть прочитано");
}

const decoder = new TextDecoder();
let buffer = "";

try {
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    // Добавляем новый чанк в буфер
    buffer += decoder.decode(value, { stream: true });

    // Обрабатываем полные строки из буфера
    while (true) {
      const lineEnd = buffer.indexOf("\n");
      if (lineEnd === -1) break;

      const line = buffer.slice(0, lineEnd).trim();
      buffer = buffer.slice(lineEnd + 1);

      if (line.startsWith("data: ")) {
        const data = line.slice(6);
        if (data === "[DONE]") break;

        try {
          const parsed = JSON.parse(data);
          const content = parsed.choices[0].delta.content;
          if (content) {
            console.log(content);
          }
        } catch (e) {
          // Игнорируем неверный JSON
        }
      }
    }
  }
} finally {
  reader.cancel();
}

Дополнительная информация

Некоторые реализации SSE-клиентов могут не парсить полезную нагрузку согласно спецификации, что приводит к необработанной ошибке при JSON.stringify не-JSON полезных нагрузок. Мы рекомендуем следующие клиенты:

AITUNNEL