# Замыкаем цикл: возвращаем tool_result

Курс: Claude API для разработчиков — https://zero2claude.ru/learn/api
Канонический URL: https://zero2claude.ru/learn/api/2-4-tool-result

Отправляем результат функции обратно с нужным tool_use_id и доводим диалог до финального ответа.

## Цикл инструмента целиком

В прошлом уроке модель попросила вызвать `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.
