Цикл инструмента целиком
В прошлом уроке модель попросила вызвать get_order с order_id: "7788" и вернула блок tool_use с id: "toolu_01ABC". Теперь нужно: выполнить функцию у себя, отдать результат модели и получить человеческий ответ.
Возвращаем результат
API без состояния — он не помнит прошлый запрос. Поэтому шлём всю историю заново: исходное сообщение пользователя, ответ ассистента с блоком tool_use, и новое user-сообщение с блоком tool_result. Главное — tool_use_id должен совпадать с id из блока tool_use.
from anthropic import Anthropic
client = Anthropic()
order_status = "в пути, доставка завтра" # результат твоей функции
resp = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "Где мой заказ 7788?"},
{"role": "assistant", "content": previous_content},
{"role": "user", "content": [{
"type": "tool_result",
"tool_use_id": "toolu_01ABC",
"content": order_status
}]}
],
)
print(resp.stop_reason) # end_turn
Теперь модель видит результат и формулирует финальный ответ покупателю. stop_reason станет end_turn.
tool_use_id не совпадёт с id из блока tool_use — будет 400. Это не ошибка ключа, ретраить бесполезно: чини запрос.tool_result всегда идёт в сообщении с ролью user — это «ответ от инструмента» в глазах API.