Alltokens

Стриминг

API, быстрый старт и гайды. Совместимо с OpenAI chat completions и streaming.

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 в поток не подмешиваются (ответ уже начат).

Чтобы получить модель, провайдер и латентность после стрима:

  1. Возьмите из любого chunk поле id (generation id).
  2. Вызовите 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);
    }
  }
}