Tool description является частью prompt
До сих пор модель только говорила. Как только она берёт инструменты, описание инструмента становится частью prompt: модель выбирает tool по имени, описанию, параметрам и текущему контексту. Плохой интерфейс системной инструкцией уже не спасти.
name: preview_refund
description: |
Рассчитывает возможность и сумму возврата без изменения данных.
Используй после получения order_id, когда пользователь спрашивает о возврате
или хочет его оформить. Не используй для отмены доставки.
input:
order_id: "ID из account_read, никогда не из догадки"
reason_code: "один из enum, выбранный по сообщению пользователя"
output:
eligible: boolean
amount: Money | null
policy_source_id: string
confirmation_summary: string
side_effects: none
next_step: confirm_refund requires explicit user approvalРазница между плохим и хорошим tool - почти всегда в одном и том же.
- list_all_contacts → search_contacts. Не тратит context на нерелевантные записи.
- do_order → orders_preview_refund. Ясный namespace и отсутствие скрытого side effect.
- UUID без подписи → ID плюс человекочитаемое имя. Меньше ошибок сопоставления.
- Три low-level вызова → один доменный tool. Снижает tool loop и прячет техническую механику.
И контринтуитивное правило про количество.
Много tools не означает больше способностей. Пересекающиеся и расплывчатые tools создают новые развилки, где модель может ошибиться. Anthropic советует несколько продуманных high-impact tools; OpenAI - namespaces и deferred tool search для больших поверхностей.