Streaming
Потоковая выдача ответа модели по частям (Server-Sent Events). Удобно для чат-интерфейсов и длинных ответов.
Включение
В теле запроса к /api/v1/chat/completions или /api/v1/completions укажите:
json
"stream": trueОтвет приходит в формате SSE: каждая строка data: {...} — один chunk. Завершающая строка: data: [DONE].
Пример (curl)
bash
curl -X POST "https://api.alltokens.ru/api/v1/chat/completions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "router",
"messages": [{"role": "user", "content": "Count from 1 to 5"}],
"stream": true
}'Формат chunk'ов
Каждый chunk — JSON-объект с полем choices, обычно с одним элементом и delta:
json
{"id":"gen-...","choices":[{"delta":{"content":"1"},"index":0}]}
{"id":"gen-...","choices":[{"delta":{"content":" 2"},"index":0}]}
...В последнем chunk'е может быть usage (подсчёт токенов).
Доказательства маршрута при streaming
При stream: true заголовки x-alltokens-* и поле alltokens_route в поток не подмешиваются (ответ уже начат).
Чтобы получить модель, провайдер и латентность после стрима:
- Возьмите из любого chunk поле id (generation id).
- Вызовите GET /api/v1/route/explain с параметром
generation_id=<id>или GET /api/v1/generation с параметромid=<id>.
В ответе explain будет текстовая причина выбора и метрики.
Обработка в коде (Python)
python
import requests
import json
url = "https://api.alltokens.ru/api/v1/chat/completions"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "router",
"messages": [{"role": "user", "content": "Hello"}],
"stream": True
}
with requests.post(url, headers=headers, json=payload, stream=True) as r:
for line in r.iter_lines(decode_unicode=True):
if not line or not line.startswith("data: "):
continue
data = line[6:]
if data == "[DONE]":
break
chunk = json.loads(data)
content = chunk.get("choices", [{}])[0].get("delta", {}).get("content")
if content:
print(content, end="")Обработка в коде (JavaScript)
javascript
const response = await fetch('https://api.alltokens.ru/api/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'router',
messages: [{ role: 'user', content: 'Hello' }],
stream: true,
}),
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { value, done } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6);
if (data === '[DONE]') break;
const chunk = JSON.parse(data);
const content = chunk.choices?.[0]?.delta?.content;
if (content) process.stdout.write(content);
}
}
}