← Главная

Streaming API

Потоковые ответы Claude API в реальном времени, токен за токеном. Формат SSE для Anthropic- и OpenAI-совместимых endpoint.

Обновлено: 25 июля 2026 года.

Как включить streaming

Добавьте stream: true в обычный запрос Messages API. Сервер вернёт поток Server-Sent Events вместо одного JSON-ответа.

Request body
{
  "model": "claude-sonnet-4-6",
  "max_tokens": 512,
  "stream": true,
  "messages": [
    {"role": "user", "content": "Explain SSE in one paragraph"}
  ]
}

Anthropic и OpenAI-compatible

Оба формата поддерживают stream: true. Anthropic endpoint /v1/messages передаёт именованные SSE-события, а OpenAI-compatible /v1/chat/completions — последовательность data chunks с финальным [DONE].

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_deltastop_reason и накопленная статистика usage.
  • message_stopпоток успешно завершён.

Полный HTTP stream response

В прямой HTTP-интеграции читайте строки SSE последовательно. Поле event задаёт тип события, а строка data содержит JSON с тем же type.

text/event-stream
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 в обычном ответе. Частичный текст нельзя считать завершённым ответом.

SSE
event: error
data: {
  "type": "error",
  "error": {
    "type": "overloaded_error",
    "message": "Overloaded"
  }
}
Справочник ошибок Claude API