Стриминг
Узнайте, как реализовать стриминг ответов с помощью API AITUNNEL. Полное руководство по Server-Sent Events (SSE) и получению ответов от моделей в реальном времени.
API AITUNNEL позволяет получать ответы в режиме стриминга от любой модели. Это полезно для создания чат-интерфейсов или других приложений, где интерфейс должен обновляться по мере генерации ответа моделью.
Для включения стриминга установите параметр stream
в значение true
в вашем запросе. Модель будет отправлять ответ клиенту частями, а не возвращать весь ответ сразу.
Вот пример того, как реализовать стриминг и обработать ответ:
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
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 полезных нагрузок. Мы рекомендуем следующие клиенты: