Streaming API
Потоковые ответы Claude API в реальном времени, токен за токеном. Формат SSE для Anthropic- и OpenAI-совместимых endpoint.
Обновлено: 25 июля 2026 года.
Как включить streaming
Добавьте stream: true в обычный запрос Messages API. Сервер вернёт поток Server-Sent Events вместо одного JSON-ответа.
{
"model": "claude-sonnet-4-6",
"max_tokens": 512,
"stream": true,
"messages": [
{"role": "user", "content": "Explain SSE in one paragraph"}
]
}Anthropic и OpenAI-compatible
Streaming через SDK и cURL
SDK Anthropic сами разбирают SSE и предоставляют готовый поток текста. При прямом HTTP-вызове cURL показывает исходные event и data.
curl https://api.llm-gate.tech/v1/messages \ --header "x-api-key: $CLAUDE_API_KEY" \ --header "anthropic-version: 2023-06-01" \ --header "content-type: application/json" \ --no-buffer \ --data '{ "model": "claude-sonnet-4-6", "max_tokens": 512, "stream": true, "messages": [ {"role": "user", "content": "Explain SSE in one paragraph"} ] }'Порядок SSE-событий
Каждый поток начинается с message_start, содержит один или несколько content blocks и заканчивается message_stop. Между ними могут приходить ping.
message_start— объект Message с пустым массивом content.content_block_start— начало нового text, tool_use или thinking block.content_block_delta— очередная часть содержимого блока.content_block_stop— блок полностью передан.message_delta— stop_reason и накопленная статистика usage.message_stop— поток успешно завершён.
Полный HTTP stream response
В прямой HTTP-интеграции читайте строки SSE последовательно. Поле event задаёт тип события, а строка data содержит JSON с тем же type.
event: message_start
data: {"type":"message_start","message":{"id":"msg_...","content":[]}}
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":"Hello"}}
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":8}}
event: message_stop
data: {"type":"message_stop"}Основные delta types
| Delta | Что передаёт | Как обрабатывать |
|---|---|---|
| text_delta | Фрагмент текста ответа | Сразу добавляйте delta.text к отображаемому тексту. |
| input_json_delta | Часть JSON для tool_use | Накапливайте partial_json и разбирайте после content_block_stop. |
| thinking_delta | Поток thinking content | Обрабатывайте только если thinking включён и доступен. |
| signature_delta | Подпись thinking block | Сохраняйте без изменений перед content_block_stop. |
Когда считать ответ завершённым
Не завершайте обработку после первого текста или content_block_stop. Полный ответ готов только после message_stop. Значения usage в message_delta являются накопительными.
- Собирайте блоки по полю index — оно соответствует позиции блока в финальном content.
- Игнорируйте ping и неизвестные будущие event types без падения парсера.
- Если нужен итоговый объект Message, используйте finalMessage() в TypeScript или get_final_message() в Python.
Ошибки внутри streaming response
HTTP-запрос может начаться со статуса 200, а затем получить event: error. Например, overloaded_error внутри потока соответствует HTTP 529 в обычном ответе. Частичный текст нельзя считать завершённым ответом.
event: error
data: {
"type": "error",
"error": {
"type": "overloaded_error",
"message": "Overloaded"
}
}