Loading...
  • Разработка
  • Администрирование
  • Модели и цены
  • Клиентские SDK
  • Справочник API
Search...
⌘K
Log in
Детальная потоковая передача инструментов
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Solutions

  • AI agents
  • Code modernization
  • Coding
  • Customer support
  • Education
  • Financial services
  • Government
  • Life sciences

Partners

  • Amazon Bedrock
  • Google Cloud's Vertex AI

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Company

  • Anthropic
  • Careers
  • Economic Futures
  • Research
  • News
  • Responsible Scaling Policy
  • Security and compliance
  • Transparency

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Help and security

  • Availability
  • Status
  • Support
  • Discord

Terms and policies

  • Privacy policy
  • Responsible disclosure policy
  • Terms of service: Commercial
  • Terms of service: Consumer
  • Usage policy
Разработка/Инфраструктура инструментов

Потоковая передача инструментов с точной детализацией

Потоковая передача входных данных инструментов посимвольно для приложений, чувствительных к задержкам.

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. Ваш код должен объединить эти фрагменты и проанализировать результат после закрытия блока.

Контракт накопления:

  1. При content_block_start с type: "tool_use" инициализируйте пустую строку: input_json = ""
  2. Для каждого content_block_delta с type: "input_json_delta" добавьте: input_json += event.delta.partial_json
  3. При content_block_stop проанализируйте накопленную строку: json.loads(input_json)

Несоответствие типов между начальным input: {} (объект) и partial_json (строка) сделано намеренно. Пустой объект отмечает слот в массиве содержимого; строки дельта создают реальное значение.

Пакеты SDK Python и TypeScript предоставляют вспомогательные функции потока более высокого уровня (stream.get_final_message(), stream.finalMessage()), которые выполняют это накопление за вас. Используйте ручной шаблон выше только когда вам нужно реагировать на частичный ввод до закрытия блока, например для отображения индикатора прогресса или раннего запуска нижестоящего запроса.

Обработка недействительного JSON в ответах инструментов

При использовании потоковой передачи инструментов с точной детализацией вы можете получить недействительный или неполный JSON от модели. Если вам нужно передать этот недействительный JSON обратно в модель в блоке ответа об ошибке, вы можете обернуть его в объект JSON, чтобы обеспечить надлежащую обработку (с разумным ключом). Например:

{
  "INVALID_JSON": "<your invalid json string>"
}

Этот подход помогает модели понять, что содержимое является недействительным JSON, при этом сохраняя исходные неправильно сформированные данные в целях отладки.

При обёртывании недействительного JSON убедитесь, что вы правильно экранируете любые кавычки или специальные символы в строке недействительного JSON, чтобы сохранить действительную структуру JSON в объекте-обёртке.

Следующие шаги

Потоковая передача сообщений

Полный справочник по событиям, отправляемым сервером, и типам событий потока.

Обработка вызовов инструментов

Выполнение инструментов и возврат результатов в требуемом формате сообщения.

Справочник инструментов

Полный каталог инструментов схемы Anthropic и их строк версий.

Was this page helpful?

  • Как использовать потоковую передачу инструментов с точной детализацией
  • Накопление дельта входных данных инструмента
  • Обработка недействительного JSON в ответах инструментов
  • Следующие шаги
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}")