Обработка вызовов инструментов
Разбор блоков tool_use, форматирование ответов tool_result и обработка ошибок с помощью is_error.
На этой странице описан жизненный цикл вызова инструмента: чтение блоков tool_use из ответа Claude, форматирование блоков tool_result в вашем ответе и сигнализация об ошибках. Об абстракции SDK, которая обрабатывает это автоматически, см. Tool Runner.
Ответ Claude различается в зависимости от того, использует ли он клиентский или серверный инструмент.
Обработка результатов клиентских инструментов
Ответ будет иметь stop_reason со значением tool_use и один или несколько блоков содержимого tool_use, которые включают:
id: Уникальный идентификатор данного конкретного блока использования инструмента. Он будет использоваться позже для сопоставления с результатами инструмента.name: Имя используемого инструмента.input: Объект, содержащий входные данные, передаваемые инструменту, в соответствии сinput_schemaинструмента.
Блок tool_use для члена набора инструментов computer use (использование компьютера) или browser use (использование браузера) также содержит поле toolset_name ("computer" или "browser"). Его name — это инструмент-член набора, который вызывает Claude, например screenshot или navigate, поэтому диспетчеризуйте такие блоки по обоим полям.
{
"id": "msg_01Aq9w938a90dw8q",
"model": "claude-opus-5-5",
"stop_reason": "tool_use",
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll check the current weather in San Francisco for you."
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": { "location": "San Francisco, CA", "unit": "celsius" }
}
]
}Когда вы получаете ответ с использованием инструмента для клиентского инструмента, вам следует:
- Извлечь
name,idиinputиз блокаtool_use. - Запустить в вашей кодовой базе фактический инструмент, соответствующий этому имени инструмента, передав ему
inputинструмента. - Продолжить разговор, отправив новое сообщение с
roleравнымuserи блокомcontent, содержащим типtool_resultи следующую информацию:tool_use_id:idзапроса на использование инструмента, для которого это результат.content(необязательно): Результат инструмента в виде строки (например,"content": "15 degrees"), списка вложенных блоков содержимого (например,"content": [{"type": "text", "text": "15 degrees"}]) или списка блоков документов (например,"content": [{"type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}}]). Эти блоки содержимого могут использовать типыtext,image,documentилиsearch_result.is_error(необязательно): Установите вtrue, если выполнение инструмента завершилось ошибкой.
tool_result, отвечающий на блок члена набора computer use или browser use, также должен повторять то же значение toolset_name, что и блок tool_use; результат члена набора, в котором оно опущено, отклоняется. Его content также более ограничен: результат члена набора может содержать только блоки text и image, а результат browser use может добавить один блок browser_state (члены набора для управления вкладками возвращают только этот блок).
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "15 degrees"
}
]
}{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": [
{ "type": "text", "text": "15 degrees" },
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
]
}
]
}{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9"
}
]
}{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": [
{ "type": "text", "text": "The weather is" },
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "15 degrees"
}
}
]
}
]
}После получения результата инструмента Claude использует эту информацию, чтобы продолжить генерацию ответа на исходную подсказку пользователя.
Обработка результатов серверных инструментов
Claude выполняет инструмент внутренне и включает результаты непосредственно в свой ответ, не требуя дополнительного взаимодействия с пользователем.
Обработка ошибок с помощью is_error
Существует несколько различных типов ошибок, которые могут возникнуть при использовании инструментов с Claude:
Если сам инструмент выдаёт ошибку во время выполнения (например, сетевая ошибка при получении данных о погоде), вы можете вернуть сообщение об ошибке в content вместе с "is_error": true:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "ConnectionError: the weather service API is not available (HTTP 500)",
"is_error": true
}
]
}Затем Claude включит эту ошибку в свой ответ пользователю. Например: «Извините, мне не удалось получить текущую погоду, так как API погодного сервиса недоступен. Пожалуйста, попробуйте позже.»
Если попытка Claude использовать инструмент недопустима (например, отсутствуют обязательные параметры), это обычно означает, что у Claude было недостаточно информации для правильного использования инструмента. Лучшее, что можно сделать во время разработки, — повторить запрос с более подробными значениями description в определениях ваших инструментов.
Однако вы также можете продолжить разговор с tool_result, указывающим на ошибку, и Claude попытается использовать инструмент снова, заполнив недостающую информацию:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "Error: Missing required 'location' parameter",
"is_error": true
}
]
}Если запрос инструмента недопустим или в нём отсутствуют параметры, Claude повторит попытку 2–3 раза с исправлениями, прежде чем извиниться перед пользователем.
Когда серверные инструменты сталкиваются с ошибками (например, сетевые проблемы с Web Search), Claude прозрачно обработает эти ошибки и попытается предоставить пользователю альтернативный ответ или объяснение. В отличие от клиентских инструментов, вам не нужно обрабатывать результаты is_error для серверных инструментов.
Конкретно для веб-поиска возможные коды ошибок включают:
too_many_requests: Превышено ограничение скоростиinvalid_input: Недопустимый параметр поискового запросаmax_uses_exceeded: Превышено максимальное количество использований инструмента веб-поискаquery_too_long: Запрос превышает максимальную длинуunavailable: Произошла внутренняя ошибка
Следующие шаги
Обрабатывайте ответы, в которых Claude вызывает несколько инструментов за один ход.
Позвольте SDK управлять циклом tool_use, форматированием результатов и повторными попытками за вас.
Пишите схемы и описания, которые направляют Claude к правильному инструменту.
Was this page helpful?