Парадокс регрессии: новые модели Claude хуже старых вызывают инструменты

Разработчик из pocoo.org столкнулся с проблемой: новые модели Claude (Opus 4.8 и Sonnet 5) в tool calling иногда добавляют выдуманные поля к параметрам инструментов, хотя самые важные данные (oldText, newText) передают правильно. Например, в инструменте редактирования файла Pi, ожидающем структуру с ключами oldText и newText в массиве edits[], модель добавляет посторонние ключи типа requireUnique, matchCase, in_file, forceMatchCount, oldText2, newText2 и десятки других вариаций.
Парадокс в том, что эта проблема УСУГУБЛЯЕТСЯ с новыми моделями, старые версии Claude никогда такое не делали, а вот Opus 4.8 и Sonnet 5 регулярно ломают вызовы. Проблема зависит от контекста: на одиночном промпте не воспроизводится, но в длительной истории с чтением файлов и диагностикой ошибок случается часто (у одного пользователя Petr Baudis в ~20% вызовов).
Автор предполагает, что это артефакт постренировки. Новые модели Claude, вероятно, тренировались на Claude Code, закрытом harness Anthropic'а, который всё прощает: фильтрует неизвестные ключи, исправляет Unicode, переименовывает параметры через aliases (edit принимает old_str и old_string, path и file_path). Модель выучила, что небольшие ошибки в tool calling переносятся, и теперь она борется с другими схемами инструментов, её сильный prior к Claude Code'овой плоской структуре (old_string, new_string, replace_all) конфликтует с вложенными структурами других сервисов.
Проблема не универсальна. Codex модели от OpenAI такой регрессии не показали. OpenAI же использует иную архитектуру Harmony для tool calling с явными маркерами JSON-констрейнтов в промпте. Anthropic полагается на grammar-constrained sampling без явного маркирования, что может объяснить внезапное появление лишних ключей на границах сложных вложенных структур.
Это поднимает важный вывод: tool schemas больше не нейтральны. Модели могут быть скрытно оптимизированы под один набор инструментов и хуже адаптироваться к другим схемам. Раньше Opus 4.5 прекрасно приспосабливался к любым инструментам, если инструкции были хорошие. Теперь риск в том, что альтернативные схемы могут быть неявно наказаны постренировкой.
Ключевые факты
- Opus 4.8 и Sonnet 5 систематически добавляют выдуманные поля (requireUnique, matchCase, oldText2 и пр.) к параметрам инструментов с вложенной JSON, отчего серверы отклоняют вызовы
- Парадокс: старые модели Claude не имели этой проблемы, а значит это не нормальная ошибка, а регрессия, связанная с новыми возможностями
- Вероятная причина, постренировка на Claude Code'е, чей harness очень снисходителен к ошибкам и переименовывает параметры; модель выучила, что небольшие отступления от схемы допустимы
- Проблема зависит от контекста: длинная история с чтением файлов воспроизводит её регулярно (~20% вызовов), одиночный промпт не воспроизводит
- Strict mode включение или grammar-constrained sampling решают проблему, но это указывает на глубокий сдвиг в том, как модели тренируются под конкретные tool-экосистемы
Почему это важно
Регрессия в tool calling, это нарушение контракта между моделью и её окружением. Если новые, якобы улучшенные модели менее надёжны в выполнении задач через инструменты, то gains в способности рассуждать могут быть нивелированы потерями в практическом применении. Для агентов и систем вроде Claude Code это критично: модель должна точно следовать схеме, иначе каждый вызов требует retry и замедляет выполнение.
Кому это важно
Разработчикам, использующим Claude Opus и Sonnet через API с пользовательскими инструментами (особенно с вложенными структурами JSON). Авторам harness'ей и фреймворков для агентов, которые полагаются на точное соответствие tool calling. Anthropic, для переоценки стратегии постренировки. Пользователям Claude Code и других закрытых продуктов Anthropic, полагающимся на tool calling в длинных сеансах.
Как это применить
Если вы работаете с Claude через API: (1) используйте strict mode, если доступен, это принудит grammar-constrained sampling и устранит лишние поля; (2) упрощайте структуры инструментов, избегая вложенных массивов объектов, если возможно; (3) в retry-логике явно фильтруйте неизвестные ключи перед валидацией. Для авторов harness'ей: будьте готовы к тому, что более новые модели могут быть менее гибки и требуют более строгих constraints.
Можно ли доверять
Анализ основан на реальных примерах из пользовательских сеансов и минифицированного кода Claude Code. Гипотеза о постренировке логична и подкреплена тем, что проблема появилась ровно с новыми моделями, которые предположительно включали Claude Code в post-training. Codex модели, у которых другая постренировка, проблемы не показали. Однако о деталях posttraining и grammar-constrained sampling в Anthropic мало документации, поэтому это остаётся предположением, хоть и очень обоснованным.
Риски и подводные камни
Если проблема усугубляется с течением времени, то даже strict mode может быть не панацея. Anthropic имеет complexity limits на определения инструментов для strict mode, так что есть потолок сложности, которую вы можете выразить. Больший риск, молчаливая оптимизация моделей под закрытые экосистемы (Claude Code, Pi). Открытые модели и альтернативные harness'ы будут страдать, так как модель может быть переоптимизирована под неизвестную нам схему. Возможно, следующие версии Claude выучат ещё более специфичные для закрытой системы паттерны.
«Tool schemas не нейтральны, хотя бы для моделей Anthropic. Нам нравится делать вид, что schema, это абстрактный контракт, а модель, это общий reasoner, который будет его следовать. Но это может быть уже не так для некоторых инструментов. Tool schemas находятся где-то в распределении, и некоторые формы близки к тому, что модель видела в постренировке, а некоторые, далеко.»
— Leemour, pocoo.org