This feature is eligible for Zero Data Retention (ZDR). When your organization has a ZDR arrangement, data sent through this feature is not stored after the API response is returned.
Потоковая передача инструментов с точной детализацией доступна на всех моделях и всех платформах. Она позволяет потоковую передачу значений параметров использования инструментов без буферизации или проверки JSON, снижая задержку перед началом получения больших параметров.
При использовании потоковой передачи инструментов с точной детализацией вы можете потенциально получить недействительные или частичные входные данные JSON. Убедитесь, что вы учитываете эти граничные случаи в своем коде.
Потоковая передача инструментов с точной детализацией доступна на всех моделях и всех платформах (Claude API, Amazon Bedrock, Google Vertex AI и Microsoft Foundry). Чтобы использовать её, установите eager_input_streaming в значение true для любого определённого пользователем инструмента, для которого вы хотите включить потоковую передачу с точной детализацией, и включите потоковую передачу в вашем запросе.
Вот пример использования потоковой передачи инструментов с точной детализацией с API:
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=65536,
model="claude-opus-4-7",
tools=[
{
"name": "make_file",
"description": "Write text to a file",
"eager_input_streaming": True,
"input_schema": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "The filename to write text to",
},
"lines_of_text": {
"type": "array",
"description": "An array of lines of text to write to the file",
},
},
"required": ["filename", "lines_of_text"],
},
}
],
messages=[
{
"role": "user",
"content": "Can you write a long poem and make a file called poem.txt?",
}
],
) as stream:
for event in stream:
pass
final_message = stream.get_final_message()
print(final_message.usage)В этом примере потоковая передача инструментов с точной детализацией позволяет Claude потоком передавать строки длинного стихотворения в вызов инструмента make_file без буферизации для проверки того, является ли параметр lines_of_text действительным JSON. Это означает, что вы можете видеть параметр потока по мере его поступления, без необходимости ждать, пока весь параметр буферизуется и проверится.
При потоковой передаче инструментов с точной детализацией блоки использования инструментов начинают потоком передаваться быстрее и часто бывают длиннее и содержат меньше разрывов слов. Это связано с различиями в поведении разбиения на части.
Пример:
Без потоковой передачи с точной детализацией (задержка 15 сек):
Chunk 1: '{"'
Chunk 2: 'query": "Ty'
Chunk 3: 'peScri'
Chunk 4: 'pt 5.0 5.1 '
Chunk 5: '5.2 5'
Chunk 6: '.3'
Chunk 8: ' new f'
Chunk 9: 'eatur'
...С потоковой передачей с точной детализацией (задержка 3 сек):
Chunk 1: '{"query": "TypeScript 5.0 5.1 5.2 5.3'
Chunk 2: ' new features comparison'Поскольку потоковая передача с точной детализацией отправляет параметры без буферизации или проверки JSON, нет гарантии, что результирующий поток завершится в виде действительной строки JSON.
В частности, если достигнута причина остановки max_tokens, поток может завершиться посередине параметра и может быть неполным. Обычно вам нужно написать специальную поддержку для обработки случаев, когда достигнут max_tokens.
Когда блок содержимого tool_use потоком передаётся, начальное событие content_block_start содержит input: {} (пустой объект). Это заполнитель. Фактические входные данные поступают в виде серии событий input_json_delta, каждое из которых содержит фрагмент строки partial_json. Ваш код должен объединить эти фрагменты и проанализировать результат после закрытия блока.
Контракт накопления:
content_block_start с type: "tool_use" инициализируйте пустую строку: input_json = ""content_block_delta с type: "input_json_delta" добавьте: input_json += event.delta.partial_jsoncontent_block_stop проанализируйте накопленную строку: json.loads(input_json)Несоответствие типов между начальным input: {} (объект) и partial_json (строка) сделано намеренно. Пустой объект отмечает слот в массиве содержимого; строки дельта создают реальное значение.
Пакеты SDK Python и TypeScript предоставляют вспомогательные функции потока более высокого уровня (stream.get_final_message(), stream.finalMessage()), которые выполняют это накопление за вас. Используйте ручной шаблон выше только когда вам нужно реагировать на частичный ввод до закрытия блока, например для отображения индикатора прогресса или раннего запуска нижестоящего запроса.
При использовании потоковой передачи инструментов с точной детализацией вы можете получить недействительный или неполный JSON от модели. Если вам нужно передать этот недействительный JSON обратно в модель в блоке ответа об ошибке, вы можете обернуть его в объект JSON, чтобы обеспечить надлежащую обработку (с разумным ключом). Например:
{
"INVALID_JSON": "<your invalid json string>"
}Этот подход помогает модели понять, что содержимое является недействительным JSON, при этом сохраняя исходные неправильно сформированные данные в целях отладки.
При обёртывании недействительного JSON убедитесь, что вы правильно экранируете любые кавычки или специальные символы в строке недействительного JSON, чтобы сохранить действительную структуру JSON в объекте-обёртке.
Полный справочник по событиям, отправляемым сервером, и типам событий потока.
Выполнение инструментов и возврат результатов в требуемом формате сообщения.
Полный каталог инструментов схемы Anthropic и их строк версий.
Was this page helpful?
import json
import anthropic
client = anthropic.Anthropic()
tool_inputs = {} # index -> accumulated JSON string
with client.messages.stream(
model="claude-opus-4-7",
max_tokens=1024,
tools=[
{
"name": "get_weather",
"description": "Get current weather for a city",
"eager_input_streaming": True,
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}
],
messages=[{"role": "user", "content": "Weather in Paris?"}],
) as stream:
for event in stream:
if (
event.type == "content_block_start"
and event.content_block.type == "tool_use"
):
tool_inputs[event.index] = ""
elif (
event.type == "content_block_delta"
and event.delta.type == "input_json_delta"
):
tool_inputs[event.index] += event.delta.partial_json
elif event.type == "content_block_stop" and event.index in tool_inputs:
parsed = json.loads(tool_inputs[event.index])
print(f"Tool input: {parsed}")