Отправка результатов

Чему научитесь

Видео 9:22 и текст урока

К концу урока вы сможете:

Видео и текст урока.

Смотреть урок на Skilljar Sending tool results · 9:22

Когда Claude запросил вызов инструмента, нужно выполнить функцию и отправить результат обратно. Это завершает цикл tool use: Claude получает запрошенную информацию.

Запускаем функцию-инструмент

Когда Claude отвечает блоком вызова инструмента, вы извлекаете входные параметры и вызываете свою функцию. Параметры инструмента лежат здесь:

response.content[1].input

Это словарь аргументов, которые Claude хочет передать функции. Функция ждёт именованные аргументы, а не словарь, поэтому используем распаковку Python:

get_current_datetime(**response.content[1].input)
Ячейка ноутбука с вызовом через распаковку, возвращающая строку времени 14:41:05.
Вызов с распаковкой аргументов возвращает строку времени «14:41:05».

Блок tool_result

Выполнив функцию, нужно отправить результат Claude в блоке результата инструмента (tool result). Этот блок кладётся в сообщение пользователя и сообщает Claude, что произошло при выполнении инструмента.

Пример JSON результата инструмента: type tool_result, content 12:47:13, is_error False и совпадающий tool_use_id.
Блок результата: type: "tool_result", content: "12:47:13", is_error: False и совпадающий tool_use_id.

Важные свойства блока результата:

Несколько вызовов инструментов

Claude может запросить несколько вызовов в одном ответе. Например, на вопрос «What's 10 + 10 and what's 30 + 30?» Claude может ответить двумя отдельными блоками ToolUse.

Claude отправляет блоки вызова калькулятора ab3 для 10 + 10 и po9 для 30 + 30; результаты возвращаются как po9 = 60, затем ab3 = 20.
Два вызова калькулятора: ab3 (10 + 10) и po9 (30 + 30). Результаты приходят в другом порядке: сначала po9 = 60, потом ab3 = 20.

У каждого вызова свой уникальный ID, и при отправке результатов нужно указывать эти ID. Так Claude знает, какой результат к какому запросу относится, даже если результаты пришли в другом порядке.

Claude возвращает вызовы ab3 и po9; сервер отвечает результатом po9 = 60, затем ab3 = 20.
Сервер отвечает на оба вызова; связь держится на совпадении ID, а не на порядке.

Собираем следующий запрос

Следующий запрос к Claude должен содержать всю историю разговора плюс новый результат инструмента. Структура такая:

messages.append({
    "role": "user",
    "content": [{
        "type": "tool_result",
        "tool_use_id": response.content[1].id,
        "content": "15:04:22",
        "is_error": False
    }]
})

Теперь история сообщений содержит:

Итоговый запрос

В следующем запросе нужно по-прежнему передавать схему инструмента, даже если вы не ждёте, что Claude снова его вызовет. Схема нужна Claude, чтобы понимать ссылки на инструмент в истории разговора.

client.messages.create(
    model=model,
    max_tokens=1000,
    messages=messages,
    tools=[get_current_datetime_schema]
)
Сервер отправляет Claude схему инструмента, вопрос Whats the current time?, блоки вызова и результата.
Итоговый запрос: схема инструмента, вопрос «Whats the current time?», блок вызова и блок результата.

Claude ответит итоговым сообщением, которое включает результаты инструмента в естественный ответ для пользователя. Цикл tool use завершён — вы дали Claude доступ к информации в реальном времени через свою функцию.

Дальше

Дальше — разговоры, в которых Claude вызывает несколько инструментов подряд, прежде чем ответить.

Оригинал урока: Sending tool results.