С "stream": true ответ приходит по мере генерации — токен за токеном через Server-Sent Events. Пользователь видит первые слова почти мгновенно, а не ждёт весь ответ.
Стриминг не делает модель быстрее — он снижает воспринимаемую задержку. Вместо паузы в несколько секунд до полного ответа клиент получает текст по мере его генерации. Это критично для чатов и редакторов кода: ответ «печатается» на глазах. Тарификация и итоговые счётчики токенов не меняются — стоимость считается так же, как при обычном запросе.
Добавьте "stream": true в тело запроса к /v1/messages. Ответ придёт с заголовком content-type: text/event-stream — это поток SSE, а не один JSON. Остальные параметры (model, max_tokens, messages, system,tools) работают как обычно.
curl https://api.evomodels.xyz/v1/messages \
-H "x-api-key: sk-ev-ВАШ_КЛЮЧ" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 256,
"stream": true,
"messages": [{"role": "user", "content": "Назови три простых числа."}]
}'Поток открывается событием message_start (метаданные сообщения и начальный usage). Затем для каждого блока приходят content_block_start, серия content_block_delta с text_delta (для моделей -thinking — ещё и thinking_delta) и content_block_stop. Завершает поток message_delta, несущий итоговый stop_reason и финальный usage, и затем message_stop.
event: message_start
data: {"type":"message_start","message":{"id":"msg_01...","role":"assistant","content":[],"model":"claude-sonnet-4-6","usage":{"input_tokens":15,"output_tokens":0}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"2, 3"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":", 5."}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":9}}
event: message_stop
data: {"type":"message_stop"}[DONE]. Конец потока — это событие message_stop. Не ждите data: [DONE] — официальный SDK Anthropic уже обрабатывает это корректно.С официальным SDK разбирать SSE вручную не нужно. В Python используйте контекстный менеджер client.messages.stream(...) и итерируйте text_stream; в TypeScript — client.messages.stream и событие text.
from anthropic import Anthropic
client = Anthropic(base_url="https://api.evomodels.xyz", api_key="sk-ev-ВАШ_КЛЮЧ")
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=256,
messages=[{"role": "user", "content": "Назови три простых числа."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print()На совместимом эндпоинте /v1/chat/completions формат потока другой: строки data: с чанками choices[].delta, а завершается поток отдельной строкой data: [DONE]. Шлюз добавляет stream_options.include_usage, поэтому перед [DONE] приходит финальный чанк с usage.
data: {"choices":[{"delta":{"role":"assistant","content":""},"index":0}]}
data: {"choices":[{"delta":{"content":"2, 3"},"index":0}]}
data: {"choices":[{"delta":{"content":", 5."},"index":0}]}
data: {"choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}
data: {"choices":[],"usage":{"prompt_tokens":15,"completion_tokens":9,"total_tokens":24}}
data: [DONE]