Узнайте, как использовать потоковую передачу для получения ответов Claude в реальном времени с помощью server-sent events.
При создании сообщения вы можете установить "stream": true, чтобы инкрементально передавать ответ в потоковом режиме, используя server-sent events (SSE).
Наши SDK для Python и TypeScript предлагают несколько способов потоковой передачи. Python SDK поддерживает как синхронные, так и асинхронные потоки. Подробности смотрите в документации каждого SDK.
import anthropicclient = anthropic.Anthropic()with client.messages.stream( max_tokens=1024, messages=[{"role":"user","content":"Hello"}], model="claude-opus-4-1-20250805",)as stream:for text in stream.text_stream:print(text, end="", flush=True)
Каждое server-sent event включает именованный тип события и связанные JSON данные. Каждое событие будет использовать имя SSE события (например, event: message_stop) и включать соответствующий type события в своих данных.
Каждый поток использует следующий поток событий:
message_start: содержит объект Message с пустым content.
Серия блоков контента, каждый из которых имеет content_block_start, одно или несколько событий content_block_delta и событие content_block_stop. Каждый блок контента будет иметь index, который соответствует его индексу в финальном массиве content сообщения.
Одно или несколько событий message_delta, указывающих на изменения верхнего уровня в финальном объекте Message.
Финальное событие message_stop.
Количество токенов, показанное в поле usage события message_delta, является кумулятивным.
Мы можем иногда отправлять ошибки в потоке событий. Например, в периоды высокой нагрузки вы можете получить overloaded_error, который обычно соответствует HTTP 529 в не-потоковом контексте:
В соответствии с нашей политикой версионирования, мы можем добавлять новые типы событий, и ваш код должен корректно обрабатывать неизвестные типы событий.
Дельты для блоков контента tool_use соответствуют обновлениям поля input блока. Для поддержки максимальной детализации дельты являются частичными JSON строками, тогда как финальный tool_use.input всегда является объектом.
Вы можете накапливать строковые дельты и парсить JSON после получения события content_block_stop, используя библиотеку типа Pydantic для частичного парсинга JSON, или используя наши SDK, которые предоставляют помощники для доступа к парсированным инкрементальным значениям.
Примечание: Наши текущие модели поддерживают только выдачу одного полного ключа и значения свойства из input за раз. Таким образом, при использовании инструментов могут быть задержки между потоковыми событиями, пока модель работает. Как только ключ и значение input накоплены, мы выдаем их как несколько событий content_block_delta с разбитым на части частичным json, чтобы формат мог автоматически поддерживать более тонкую детализацию в будущих моделях.
При использовании расширенного мышления с включенной потоковой передачей, вы будете получать контент размышлений через события thinking_delta. Эти дельты соответствуют полю thinking блоков контента thinking.
Для контента размышлений специальное событие signature_delta отправляется непосредственно перед событием content_block_stop. Эта подпись используется для проверки целостности блока размышлений.
Типичная дельта размышлений выглядит так:
Thinking delta
event: content_block_deltadata:{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"Let me solve this step by step:\n\n1. First break down 27 * 453"}}
Мы настоятельно рекомендуем использовать наши клиентские SDK при использовании потокового режима. Однако, если вы создаете прямую интеграцию с API, вам нужно будет обрабатывать эти события самостоятельно.
Потоковый ответ состоит из:
События message_start
Потенциально нескольких блоков контента, каждый из которых содержит:
Событие content_block_start
Потенциально несколько событий content_block_delta
Событие content_block_stop
События message_delta
События message_stop
Также могут быть события ping, разбросанные по всему ответу. Смотрите Типы событий для более подробной информации о формате.
Использование инструментов теперь поддерживает детализированную потоковую передачу для значений параметров как бета-функцию. Для получения более подробной информации смотрите Детализированная потоковая передача инструментов.
В этом запросе мы просим Claude использовать инструмент, чтобы сообщить нам погоду.
curl https://api.anthropic.com/v1/messages \-H"content-type: application/json"\-H"x-api-key: $ANTHROPIC_API_KEY"\-H"anthropic-version: 2023-06-01"\-d '{"model":"claude-opus-4-1-20250805","max_tokens":1024,"tools":[{"name":"get_weather","description":"Get the current weather in a given location","input_schema":{"type":"object","properties":{"location":{"type":"string","description":"The city and state, e.g. San Francisco, CA"}},"required":["location"]}}],"tool_choice":{"type":"any"},"messages":[{"role":"user","content":"What is the weather like in San Francisco?"}],"stream":true}'
Потоковый запрос с использованием инструмента веб-поиска
В этом запросе мы просим Claude найти в интернете текущую информацию о погоде.
curl https://api.anthropic.com/v1/messages \--header"x-api-key: $ANTHROPIC_API_KEY"\--header"anthropic-version: 2023-06-01"\--header"content-type: application/json"\--data\'{"model":"claude-opus-4-1-20250805","max_tokens":1024,"stream": true,"tools":[{"type":"web_search_20250305","name":"web_search","max_uses":5}],"messages":[{"role":"user","content":"What is the weather like in New York City today?"}]}'
Response
event: message_startdata:{"type":"message_start","message":{"id":"msg_01G...","type":"message","role":"assistant","model":"claude-opus-4-1-20250805","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":2679,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":3}}}event: content_block_startdata:{"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}event: content_block_deltadata:{"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"I'll check"}}event: content_block_deltadata:{"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the current weather in New York City for you"}}event: pingdata:{"type":"ping"}event: content_block_deltadata:{"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"."}}event: content_block_stopdata:{"type":"content_block_stop","index":0}event: content_block_startdata:{"type":"content_block_start","index":1,"content_block":{"type":"server_tool_use","id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","name":"web_search","input":{}}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"query"}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\":"}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"weather"}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" NY"}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"C to"}}event: content_block_deltadata:{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"day\"}"}}event: content_block_stopdata:{"type":"content_block_stop","index":1}event: content_block_startdata:{"type":"content_block_start","index":2,"content_block":{"type":"web_search_tool_result","tool_use_id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","content":[{"type":"web_search_result","title":"Weather in New York City in May 2025 (New York) - detailed Weather Forecast for a month","url":"https://world-weather.info/forecast/usa/new_york/may-2025/","encrypted_content":"Ev0DCioIAxgCIiQ3NmU4ZmI4OC1k...","page_age":null},...]}}event: content_block_stopdata:{"type":"content_block_stop","index":2}event: content_block_startdata:{"type":"content_block_start","index":3,"content_block":{"type":"text","text":""}}event: content_block_deltadata:{"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"Here's the current weather information for New York"}}event: content_block_deltadata:{"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" City:\n\n# Weather"}}event: content_block_deltadata:{"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" in New York City"}}event: content_block_deltadata:{"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"\n\n"}}...event: content_block_stopdata:{"type":"content_block_stop","index":17}event: message_deltadata:{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":10682,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":510,"server_tool_use":{"web_search_requests":1}}}event: message_stopdata:{"type":"message_stop"}
Когда потоковый запрос прерывается из-за проблем с сетью, таймаутов или других ошибок, вы можете восстановиться, возобновив с того места, где поток был прерван. Этот подход избавляет вас от необходимости повторной обработки всего ответа.
Базовая стратегия восстановления включает:
Захват частичного ответа: Сохраните весь контент, который был успешно получен до возникновения ошибки
Создание запроса продолжения: Создайте новый API запрос, который включает частичный ответ ассистента как начало нового сообщения ассистента
Возобновление потоковой передачи: Продолжите получение остальной части ответа с того места, где он был прерван
Используйте функции SDK: Используйте встроенные в SDK возможности накопления сообщений и обработки ошибок
Обрабатывайте типы контента: Помните, что сообщения могут содержать несколько блоков контента (text, tool_use, thinking). Блоки использования инструментов и расширенного мышления не могут быть частично восстановлены. Вы можете возобновить потоковую передачу с самого последнего текстового блока.