API NeuroAPI позволяет получать потоковые ответы от любой модели. Это полезно для создания чат-интерфейсов или других приложений, где пользовательский интерфейс должен обновляться по мере генерации ответа моделью.
Чтобы включить потоковую передачу, установите параметр stream
в true
в вашем запросе. Модель будет передавать ответ клиенту по частям (чанками), а не возвращать весь ответ сразу.
import requests
import json
response = requests.post(
url="https://neuroapi.host/v1/chat/completions",
headers={
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
},
json={
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Напиши длинную историю о космосе"}],
"stream": True
},
stream=True
)
buffer = ""
for chunk in response.iter_content(chunk_size=None, decode_unicode=True):
buffer += chunk
while '\n\n' in buffer:
line, buffer = buffer.split('\n\n', 1)
if line.startswith('data: '):
data = line[6:]
if data == '[DONE]':
print("\n\n--- Стрим завершён ---")
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:
# Игнорируем некорректный JSON, это может быть ping-сообщение
pass
: PING
. Эти сообщения не начинаются с data:
и должны игнорироваться вашим парсером событий (SSE). Наши примеры кода уже учитывают это. Потоковые запросы можно отменить, прервав соединение. Для поддерживаемых провайдеров это немедленно остановит обработку модели и биллинг.
Для этого в JavaScript используется AbortController
, а в Python можно использовать более сложные механизмы, такие как threading.Event
для сигнализации об отмене.
const controller = new AbortController();
async function cancelableStream() {
try {
const response = await fetch(
'https://neuroapi.host/v1/chat/completions',
{
method: 'POST',
headers: {
Authorization: 'Bearer <YOUR_API_KEY>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'Напиши очень длинную историю' }],
stream: true,
}),
signal: controller.signal, // Передаём AbortSignal
},
);
// ... обработка стрима
} catch (error) {
if (error.name === 'AbortError') {
console.log('Поток был отменён');
} else {
console.error('Произошла ошибка:', error);
}
}
}
// Запускаем стрим
cancelableStream();
// Отменяем стрим через 1 секунду
setTimeout(() => {
controller.abort();
}, 1000);