Tool schema design в 2026 полезно понимать не как формальное описание параметров, а как контракт между моделью и внешним миром. Если схема размытая, агент начинает угадывать intent, подставлять правдоподобные значения и путать подготовку действия с самим действием. Если схема хорошая, модель получает узкий и понятный интерфейс, а система становится заметно стабильнее.
Это особенно важно сейчас, когда tool use всё чаще живёт не в demo-loop, а в production workflows:
perform_action с десятком режимов и свободным payload. Такая схема почти всегда выглядит гибкой, но на деле повышает ambiguity, ухудшает eval и делает side effects менее контролируемыми.Когда модель выбирает tool, она отвечает сразу на два вопроса:
Поэтому схема инструмента влияет не только на format correctness, но и на поведение всей системы:
Если schema не задаёт явную границу между safe read и dangerous write, агент начинает относиться к ним как к одной операции.
Самое полезное practical правило: инструмент должен выражать один чёткий глагол.
Хорошие примеры:
search_kblookup_orderdraft_emailissue_refundcreate_ticketСлабые примеры:
process_requestmanage_customerhandle_taskrun_workflowПочему это критично:
Модель лучше работает там, где ей не нужно каждый раз изобретать допустимые значения.
Поэтому production schema обычно выигрывает от:
enum для типов действий и категорий;required полей;Частая проблема - поле вида:
{ "priority": "something urgent but maybe medium" }
Для модели это invitation to improvise. Гораздо лучше:
{ "priority": "high" }
с жёстким enum low | medium | high.
Свободный текст полезен для:
Но free text плохо подходит как основа для управления side effects. Если действие реально зависит от текста вроде mode, action_notes, special handling, вы переносите decision boundary из schema обратно в prose.
Это обычно ломает:
Это один из самых сильных паттернов для tool design.
Инструменты, которые только читают:
Инструменты, которые готовят действие, но ещё ничего не меняют:
Инструменты, которые уже меняют внешний мир:
Если risky workflow оформить именно так, появляется понятная граница для:
Есть поля, которые модель не должна придумывать сама:
customer_id, если он должен идти из trusted system;currency, если она уже задана ордером;actor_id, если это identity текущего пользователя;policy_version, если его задаёт приложение.Такие значения лучше подставлять app-side. Иначе агент начинает:
Общее правило: всё, что можно безопасно определить кодом, лучше не поручать модели.
Один универсальный инструмент с подрежимами почти всегда хуже набора маленьких.
Когда почти все поля optional, модель начинает гадать, что реально обязательно.
Название выглядит безопасно, а внутри уже происходит write.
Похожие поля вроде customer, customer_id, customer_ref, account создают путаницу и bad calls.
Например, когда один и тот же notes должен и объяснять решение человеку, и управлять логикой backend.
Если смотреть только на общий task success, вы не поймёте, в чём проблема. Полезнее отдельные tool metrics:
Именно эти метрики быстрее показывают, что схема перегружена или двусмысленна.