ИИ-агенты и автоматизация

Принудительный вызов инструмента: почему он пропадает

Принудительный вызов инструмента: почему он пропадает

Принудительный вызов инструмента — режим, в котором модель обязана вызвать инструмент, а не ответить текстом, — начал пропадать у новых флагманов. В сентябре 2026 года его не стало у Claude Fable 5.1 и у Claude Opus 5.5: значения any и tool в поле tool_choice там возвращают ошибку 400. В каталоге KeyDealer этот режим подтверждён пробой у 10 из 46 текстовых позиций через основной протокол, у остальных — либо не поддерживается, либо не проверен.

Если ваш код получает структурированный ответ через принудительный вызов, это первое, что сломается при смене модели. Разберём, как устроен режим, где он есть, и чем его заменять заранее.

Что это такое

При вызове модели с инструментами в запросе есть поле tool_choice. У него четыре варианта поведения.

ЗначениеЧто делает модель
autoсама решает: вызвать инструмент или ответить текстом
noneне вызывает инструменты вообще
«любой» (any или required)обязана вызвать какой-нибудь инструмент
конкретный инструмент по имениобязана вызвать именно его

Последние два — это и есть принудительный вызов. Названия различаются по протоколам: в одном «любой» называется any, в другом required, но смысл один.

Зачем его используют

Не ради инструментов, а ради формата.

Инструмент описан схемой: какие поля, каких типов, какие обязательны. Если модель обязана вызвать инструмент, ответ приходит не текстом, а аргументами по этой схеме. Это давно стало стандартным приёмом, когда нужен строгий формат: извлечь поля из письма, разложить заявку, получить классификацию в фиксированном наборе значений.

Именно поэтому поломка болезненная. Многие используют принудительный вызов не потому, что строят агента, а потому, что им нужен JSON без сюрпризов. Про строгий формат ответа отдельно — в материале JSON от нейросети: строгий формат.

Что сломалось в сентябре

У двух моделей Anthropic подряд.

Сначала у Fable 5.1, затем у Opus 5.5. В обоих случаях значения «любой» и «конкретный инструмент» возвращают ошибку 400 с прямым указанием, что эти типы для модели не поддерживаются. Проверка действует и на эндпоинте подсчёта токенов — то есть упадёт даже предварительная оценка стоимости запроса.

Остаются auto и none. Вендор в руководстве по миграции предлагает замену: auto плюс строгая схема у инструмента или структурированный вывод. Подробный разбор перехода на Opus 5.5 со всеми четырьмя поломками — в материале Claude Opus 5.5: на 20% дешевле, но четыре поломки.

Для планирования важен не сам факт, а направление: две модели подряд у одного вендора. Разумно исходить из того, что следующие модели этой линейки режим тоже не получат.

Почему вендоры от него отказываются

Прямого объяснения в документации нет, поэтому скажем осторожно, что наблюдается.

Принудительный вызов — это внешнее ограничение на генерацию: модель не выбирает, что ответить, ей заранее запрещён текстовый ответ. Для моделей с развитым внутренним рассуждением такое ограничение конфликтует с тем, как они устроены: сначала рассуждение, потом решение, вызывать ли инструмент. Запрет на текстовый ответ ломает этот порядок.

Отсюда и логика замены, которую предлагает вендор: не запрещать, а описывать. Строгая схема у инструмента говорит модели, какой формат ожидается, но оставляет ей решение. Структурированный вывод задаёт формат ответа напрямую, без обходного пути через инструмент.

Практический вывод не зависит от того, верно ли это объяснение. Две модели подряд у одного вендора — достаточный сигнал, чтобы не строить новый код на принудительном вызове.

Как выглядит ошибка и как её поймать

Полезно знать, как проявляется поломка, чтобы не искать её часами.

Запрос с принудительным вызовом на модели, где режим не поддерживается, возвращает ошибку 400 с прямым текстом о том, что тип вызова не поддерживается для этой модели. Это не случайный сбой и не перегрузка — повторять запрос бессмысленно, он упадёт так же.

Два места, где её легко пропустить. Первое — подсчёт токенов перед запросом: если вы оцениваете стоимость заранее, падает уже оценка, и кажется, что сломался подсчёт. Второе — обработка ошибок, которая считает любую 400 ошибкой пользователя и молча отдаёт пустой ответ. Про разбор кодов ошибок — в материале ошибки API нейросетей.

Где режим проверен в каталоге

Здесь наши собственные данные, снятые с живого каталога на 24 сентября 2026 года.

ПротоколПроверен пробойЯвно не поддерживаетсяНе проверяли
chat_completions10 позиций332
Anthropic Messages7 позиций38
Responses1 позиция143

Всего текстовых позиций с рублёвой ставкой — 46.

Через основной протокол режим проверен у deepseek-v4-flash, deepseek-v4-pro, gemini-2-5-flash, gemini-2-5-flash-lite, gemini-3-7-flash, glm-5-3, gpt-6-astra, grok-4-7, qwen-3-6-flash и qwen-3-7-max. Через Anthropic Messages — у семейства Claude в каталоге: haiku-4-5, sonnet-4-6, sonnet-5, opus-4-6, opus-4-7, opus-4-8 и opus-5. Через Responses — только у grok-4-7.

Явно не поддерживается через основной протокол у трёх позиций: kimi-k2-7-code, qwen-3-7-plus и qwen-3-8-max. Через Responses — у grok-4-20-multi-agent.

Главная ловушка: инструменты есть, принуждения нет

Вызов инструментов проверен у 27 позиций, а принудительный — только у 10. Разница в 17 позиций — это место, где код может работать на одной модели и падать на соседней.

Выглядит это так. Вы проверили, что модель вызывает инструменты, — работает. Переключили позицию на соседнюю, у которой инструменты тоже проверены, — и получили ошибку, потому что код задаёт tool_choice принудительно, а у этой позиции режим не подтверждён или не поддерживается.

Статус unknown здесь означает буквально «пробы не было». Это не «не работает», но и не приглашение рискнуть в проде. Про то, как читать статусы каталога, мы писали в материале какие модели поддерживают вызов функций.

Чем заменить

Два способа, и оба работают там, где принуждения нет.

auto плюс строгая схема. Оставляете инструмент, убираете требование обязательно его вызвать, а у самого инструмента включаете строгое соответствие схеме. Модель в подавляющем большинстве случаев вызовет его сама, если промпт однозначно говорит, что ответ должен прийти через инструмент. Остаток ловится проверкой на вашей стороне: пришёл текст вместо вызова — повторить запрос.

Структурированный вывод. Схема ответа задаётся напрямую, без обёртки в инструмент. Это чище, если инструмент вам на самом деле не нужен и вы использовали его только ради формата. Но у этого способа своя поддержка по позициям: строгий JSON на выходе проверен в каталоге у шести позиций, у остальных статус неизвестен.

В обоих случаях проверка формата на вашей стороне обязательна. Её отсутствие — самая частая причина, по которой переезд на новую модель выглядит как «модель сломалась», хотя сломалось допущение в коде.

Как найти уязвимые места в своём коде

Порядок из трёх шагов, занимает полчаса.

Шаг первый: найдите все места, где задаётся tool_choice. Поиском по коду. Интересуют значения «любой» — any или required — и указание конкретного инструмента по имени.

Шаг второй: сверьте с каталогом. Для каждой позиции, которую вы используете или планируете использовать, посмотрите статус принудительного вызова в нужном протоколе. Живой список отдаётся запросом к каталогу моделей тем же ключом.

Шаг третий: переведите на замену заранее. Не в день переезда, а сейчас, пока текущая модель работает. Тогда переход на новую позицию станет сменой одной строки, а не срочной переделкой.

Проверять такие вещи удобно там, где статусы возможностей публикуются по каждой позиции: KeyDealer даёт один ключ на каталог из 57 позиций, 44 из которых доступны сейчас, с оплатой российской картой в рублях и ставками от 1 ₽ за миллион токенов. Статус принудительного вызова лежит в каталоге отдельным полем для каждого протокола — узнать его можно до интеграции, а не после ошибки в проде.

Чего мы не утверждаем

Три оговорки.

Мы не утверждаем, что принудительный вызов исчезнет у всех вендоров. Две модели одного вендора — это направление у этого вендора, а не отраслевое правило. У других поставщиков моделей режим пока подтверждён.

Мы не гарантируем, что статусы неизменны. Проверка идёт по мере появления данных; unknown может смениться на проверенный или на неподдерживаемый. Смотрите каталог перед интеграцией.

Мы не утверждаем, что замена даёт то же качество. Режим auto со строгой схемой в подавляющем большинстве случаев ведёт себя так же, но «в подавляющем большинстве» — не «всегда». Проверка формата на вашей стороне остаётся обязательной.

Что держать в голове

Первое. Принудительный вызов часто используют не для агентов, а ради формата. Если это ваш случай, у вас есть зависимость, о которой вы, скорее всего, не помните.

Второе. «Инструменты проверены» и «принудительный вызов проверен» — разные поля. У 17 позиций каталога первое есть, а второго нет.

Третье. Замену лучше сделать сейчас, пока всё работает. Переход на новую модель тогда будет сменой строки, а не аварийной переделкой в день, когда старую модель отключат. Что мы за проект — на странице о проекте, ключ заводится на keydealer.ru/login.

Частые вопросы

Что такое принудительный вызов инструмента?

Режим, в котором модель обязана вызвать инструмент, а не ответить текстом. В запросе он задаётся полем tool_choice — значением «любой инструмент» или именем конкретного. В режиме auto модель сама решает, вызывать инструмент или ответить словами.

Зачем его вообще используют?

Чтобы получить на выходе структуру, а не текст. Инструмент описан схемой, и если модель обязана его вызвать, ответ гарантированно придёт в виде аргументов по этой схеме. Это старый и популярный способ добиться строгого формата.

У каких моделей он перестал работать?

В сентябре 2026 года у Claude Fable 5.1 и у Claude Opus 5.5. У обеих значения any и tool в поле tool_choice возвращают ошибку 400, в том числе на эндпоинте подсчёта токенов. Остаются auto и none.

У каких позиций каталога KeyDealer он проверен?

Через протокол chat_completions — у 10 из 46 текстовых позиций. Через Anthropic Messages — у 7, это семейство Claude. Через Responses — у одной, grok-4-7. У трёх позиций режим явно не поддерживается, у остальных статус неизвестен, то есть пробы не было.

Чем заменить принудительный вызов?

Режимом auto плюс строгой схемой у инструмента, либо структурированным выводом, где формат ответа задаётся схемой напрямую. Оба способа дают структуру без требования «обязательно вызови инструмент».

Как проверить свой код?

Поиском по коду: найдите все места, где tool_choice задаётся значением any, required или именем конкретного инструмента. Это и есть список того, что сломается при переходе на модель, где режим не поддерживается.

Источники