Наша собственная статистика посещений включена всегда. Google Analytics помогает нам понять, как пользуются нашими публичными страницами (но не вашим рабочим пространством после входа), и включается только с вашего разрешения. См. нашу политику конфиденциальности.

Strict tool use в Claude при работе с API данных: два уровня защиты от некорректных вызовов

Opus 5.5 отклоняет принудительный tool_choice. Мы сочетаем strict-инструменты с ошибками 422, которые подсказывают исправление: 29 реальных вызовов, ответ на неверные параметры за 0,17 с, без списания.

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

Claude Opus 5.5, Sonnet 5.5 и Fable 5.1 возвращают ошибку 400, если tool_choice равен any или tool. Код, который принудительно вызывал инструмент ради JSON заданной структуры, на этих моделях перестаёт работать. Anthropic рекомендует оставить tool_choice: auto и добавить strict: true или перенести схему в structured outputs. 1 ноября 2026 года мы создали инструменты со strict: true для получения отзывов с Trustpilot, App Store и Amazon из каталога EveryInfra. Затем отправили в наш API 29 реальных запросов. Десять из них — контрольные вызовы, которые мы добавили днём.

Вечером мы отправили ещё 12 запросов для повторной проверки.

На запросы с неверным именем параметра или значением enum за 0,11–0,23 секунды возвращалась ошибка 422. В каждом ответе 422 были указаны допустимые значения и следующий шаг; списаний не было. В ранней версии каталога у двух параметров не было списка допустимых значений. Во время дневного контрольного теста запросы с неверными значениями этих параметров не завершались ошибкой. API возвращал код 200, списывал обычную плату и незаметно подменял набор отзывов. Ничто в ответе не сообщало модели, что что-то не так.

Вечером шлюз добавил допустимые значения для этих двух параметров. Теперь на запрос с неверным значением до любого списания возвращается ошибка 422, что и подтвердила наша повторная проверка в 19:18 SGT.

Эта статья отвечает на один практический вопрос. У вас есть приложение на Claude, которое вызывает внешний API данных. Раньше вы принуждали модель вызывать ваш инструмент, чтобы каждый запрос имел одинаковую форму. На новой модели эта строка теперь падает с ошибкой. Как изменить код, чтобы модель по-прежнему надёжно вызывала API и возвращала JSON, который можно сохранить?

Каждое утверждение о Claude взято из документации Anthropic, и для каждого мы даём ссылку. На нашей тестовой машине нет API-ключа Anthropic. Поэтому код для Claude в этой статье — пример конфигурации, а не результат теста. Все цифры по EveryInfra взяты из необработанных ответов реальных вызовов 1 ноября 2026 года.

Иллюстрация. Слева металлическая рамка пропускает только бирюзовые капсулы правильной формы — это уровень strict tool use. В центре серверный шкаф принимает капсулы. Одна капсула слегка неправильной формы отскакивает от шкафа со сложенной запиской и бирюзовой стрелкой, указывающей на правильную форму, — это ошибка 422 с инструкцией по исправлению. Исправленная капсула возвращается в шкаф, а справа выходит аккуратная стопка карточек. Рядом с отскочившей капсулой лежит нетронутая монета: списания нет.
Два уровня. Strict tool use сохраняет правильную структуру запроса, а ответ 422 сообщает об ошибках в значениях без списания средств.

Что изменилось: три новые модели отклоняют принудительный tool_choice, поэтому strict tool use в Claude теперь используется по умолчанию

Изменение простое, и от него зависят все проектные решения дальше в статье. В примечаниях к выпуску Anthropic API от 1 сентября 2026 года сказано, что Fable 5.1 и Mythos 5.1 не поддерживают типы tool_choice any и tool. Такие запросы возвращают ошибку 400, а auto и none работают как прежде (примечания к выпуску API). Чтобы входные данные инструмента соответствовали схеме, рекомендуется strict tool use или structured outputs. В записи от 22 сентября об Opus 5.5 сказано, что та же ошибка 400 действует «как в Claude Fable 5.1». В записи от 28 сентября о Sonnet 5.5 это названо одной из пяти причин, по которым может сломаться код для Sonnet 5.

У каждой модели есть страница «What's new» с разделом «Forced tool use is not supported». На всех трёх страницах один и тот же текст ошибки, который мы приводим ниже. Его можно прочитать на страницах Opus 5.5, Sonnet 5.5 и Fable 5.1. Текст такой: tool_choice: type "tool" and "any" are not supported for this model. Та же проверка действует и для эндпоинта подсчёта токенов. Поэтому проверить принудительный вызов через подсчёт токенов до отправки не получится.

Скриншот страницы документации Anthropic «What's new in Claude Opus 5.5», раздел «Forced tool use is not supported». Бирюзовая рамка выделяет первый абзац и текст ошибки. В тексте сказано, что Claude Opus 5.5 не поддерживает принудительный вызов инструментов, что tool_choice со значением any или с именем инструмента возвращает 400 invalid_request_error, а текст ошибки такой: tool_choice: type "tool" and "any" are not supported for this model. В следующем абзаце сказано, что auto и none по-прежнему работают, а для JSON, валидного по схеме, нужно оставить auto и задать strict: true или использовать structured outputs.
Страница Opus 5.5, снимок от 1 ноября 2026 года. Документация Anthropic

Почему Anthropic убрала принудительные вызовы? Причина указана на странице Fable 5.1. На этих моделях размышление (thinking) всегда включено, а принудительный вызов инструмента его пропускает. Тогда модель пишет свои рассуждения прямо в аргументы инструмента, и их качество падает. Это важно, если ваше приложение вызывает API данных.

В старой схеме вызов делали принудительным ради стабильной структуры. Теперь её обеспечивает strict tool use, а решение о вызове снова принимает модель. В промпте нужно указать, когда применять инструмент. На странице Fable 5.1 добавлено, что модель надёжно следует явным инструкциям по инструментам, например «Для ответа используй инструмент get_weather».

МодельДата выхода`tool_choice` any / toolПредлагаемая Anthropic заменаСтандартная цена за 1 млн входных / выходных токенов
Fable 5.11 сентября 2026 г.Ошибка 400auto + strict или structured outputs$10 / $50
Opus 5.522 сентября 2026 г.Ошибка 400auto + strict или structured outputs$4 / $20
Sonnet 5.528 сентября 2026 г.Ошибка 400auto + strict или structured outputs$2 / $10
Haiku 5.57 октября 2026 годаНе указано в примечаниях к выпуску—$0.10 / $0.50

Даты и цены взяты из примечаний к выпуску и со страницы «Тарифы» по состоянию на 1 ноября 2026 года. Эта страница также показывает, что изменение не временное. В таблице количества токенов системного промпта для использования инструментов две колонки: одна для auto, none, другая для any, tool. Для Opus 5.5 значение есть только в первой колонке — 286 токенов.

Для Opus 5 значения есть в обеих колонках — 286 и 406 токенов. В примечаниях к выпуску Haiku 5.5 перечислены другие несовместимые изменения: ручные бюджеты размышлений, параметры сэмплинга и prefill. Принудительный вызов инструментов там не упомянут, поэтому о Haiku 5.5 мы ничего не утверждаем. Но strict tool use мы применяем и для этой модели, чтобы один и тот же код работал на всех четырёх моделях.

Strict tool use — не новая функция и предназначена не только для новых моделей. На двух страницах сказано, что она доступна на всех моделях и может применяться в конфигурациях, подготовленных к соблюдению HIPAA (strict tool use, structured outputs). Изменилась её роль: раньше это была необязательная мера предосторожности, а теперь — основной путь.

Чек-лист миграции на Opus 5.5 предписывает заменить any и tool на auto плюс strict tool use или structured outputs. Там же сказано сначала проверить каждую input_schema, потому что strict поддерживает лишь подмножество JSON Schema (руководство по миграции на Opus 5.5). Основная работа по миграции — в схемах, а не в коде вызовов.

Strict tool use и structured outputs в Claude: за что отвечает каждый механизм

Названия похожи, но они контролируют разные части ответа. Strict tool use добавляет "strict": true в определение инструмента и контролирует input каждого блока tool_use. API использует сэмплинг с ограничением по грамматике, поэтому input всегда соответствует input_schema, а имя инструмента всегда допустимо.

В примере Anthropic система бронирования ожидает passengers: int. Без строгого режима модель может отправить "two" или "2". В строгом режиме она всегда отправляет 2.

Claude structured outputs — это поле output_config.format в запросе. Оно контролирует итоговый текст ответа, который становится JSON по вашей схеме. Для работы с API данных нужны оба механизма. Strict tool use обеспечивает корректность параметров, которые уходят в POST /api/v1/social. Structured outputs превращает полученные отзывы в фиксированные поля: тему, серьёзность и короткую цитату. Оба механизма используют один конвейер грамматик, поэтому ограничения у них общие.

Эти ограничения перечислены в разделе «JSON Schema limitations» на странице structured outputs. Поддерживаются: все базовые типы, enum, const, anyOf, внутренние $ref, десять строковых форматов и простые регулярные выражения. Не поддерживаются: рекурсивные схемы, числовые ограничения вроде minimum и maximum, ограничения длины строк и minItems со значением, отличным от 0 или 1. В каждом объекте должно быть additionalProperties: false. Если использовать неподдерживаемую возможность, API вернёт ошибку 400 с подробностями.

ПунктStrict tool useStructured outputs (`output_config.format`)
Что контролируетАргументы инструментов в блоках tool_useИтоговый текст ответа
Как включитьДобавьте "strict": true в определение инструментаДобавьте JSON Schema в output_config.format
Роль в этой статьеКорректные параметры для EveryInfraФиксированные поля для каждого отзыва
Совокупные лимиты на запрос20 strict-инструментов, 24 необязательных параметра, 16 параметров с union-типамиТе же лимиты с общим подсчётом
Не поддерживаетсяЧисловые диапазоны, длина строк, рекурсияТо же; кроме того, несовместимо с цитированием
Первый запросДополнительная задержка на компиляцию грамматики; кеш хранится 24 часаТо же

Главная ловушка — слова «на запрос». На странице structured outputs приводится пример: четыре strict-инструмента по шесть необязательных параметров уже упираются в лимит 24, даже если ни один инструмент по отдельности не выглядит сложным. Помимо явных лимитов, есть внутренние ограничения на размер скомпилированной грамматики. При их превышении API возвращает «Schema is too complex for compilation». Последний защитный лимит — тайм-аут компиляции 180 секунд.

Anthropic предлагает четыре шага в таком порядке. Помечайте как strict только критичные инструменты. Делайте параметры обязательными. Упрощайте вложенные объекты. Разделяйте работу между запросами или субагентами.

Анимация потока из пяти блоков слева направо. Блок 1 — Claude с tool_choice: auto и инструментами с strict: true. Блок 2 — входные данные tool_use, которые всегда соответствуют схеме по типам, обязательным полям и значениям enum. Блок 3 — ваш код, который отправляет POST /api/v1/social. Блок 4 — EveryInfra, который проверяет значения на неизвестные названия и недопустимые значения enum. Блок 5 — результат: ответ 200 с results и списанием за вызов. Блоки 2 и 4 бирюзовые. Серая точка движется от Claude к EveryInfra, становится бирюзовой и возвращается к Claude по пунктирной дуге с подписью «422: allowed, did_you_mean, без списания». Затем бирюзовая точка движется от Claude к результату.

Схема показывает главную идею статьи. Первый уровень находится на стороне Claude. Режим strict гарантирует, что типы, обязательные поля и значения enum соответствуют вашей схеме. Модель не может отправить поле, например max_results, если его нет в схеме. Второй уровень находится на стороне EveryInfra.

Некоторые правила не укладываются в схему, например «ведёт ли эта ссылка на страницу товара» или «как эта платформа называет этот порядок сортировки». Наш API проверяет такие значения по каталогу. Если значение неверное, он возвращает 422 с допустимыми значениями и ближайшим совпадением. Модель меняет одно поле и отправляет запрос снова.

Уровень первый: строим strict-инструменты для POST /api/v1/social по каталогу

Эндпоинт каталога EveryInfra, GET /api/v1/social/catalog, бесплатный и не требует ключа (исходный каталог). Для каждой возможности он отдаёт обязательные и необязательные параметры, описание каждого параметра, допустимые значения (allowed_values), возвращаемые поля и цену. Мы прочитали его 1 ноября 2026 года в 00:46 SGT. В нём было 426 возможностей на 91 платформе. Из них 402 возможности на 89 платформах в тот день были доступны.

У доступных возможностей есть описания для 809 параметров. Из них у 155 указаны допустимые значения, у 143 — формат uri, у 38 — формат date. Эти три группы напрямую соответствуют enum, format: uri и format: date в схеме для режима strict. Группы не пересекаются, поэтому для 336 из 809 параметров (41,5%) можно задать ограничение, соблюдение которого гарантирует режим strict.

Лишь 155 параметров (около 19%) можно описать через enum. Остальные параметры принимают произвольный текст или числа. Для них основную работу выполняют описание и второй уровень.

Ниже — определения инструментов для трёх возможностей работы с отзывами, составленные на основе каталога. Это пример конфигурации: с Claude мы его не запускали.

json
[
  {
    "name": "trustpilot_reviews",
    "description": "Get recent Trustpilot reviews of one company through EveryInfra (platform trustpilot, action reviews). Call it whenever the user names a company and asks what customers say. company is the company's website domain, for example temu.com.",
    "strict": true,
    "input_schema": {
      "type": "object",
      "properties": {
        "company": {"type": "string", "description": "Website domain such as temu.com, or a trustpilot.com/review/<domain> link"},
        "stars": {"type": "array", "items": {"type": "string", "enum": ["1", "2", "3", "4", "5"]}, "description": "Star ratings to keep; [] keeps all"},
        "date": {"type": "string", "enum": ["any", "last7days", "last30days", "last3months", "last6months", "last12months"], "description": "any = no date filter"},
        "sort": {"type": "string", "enum": ["recency", "relevance"]},
        "limit": {"type": "integer", "description": "1 to 200; use 20 unless the user asks for more"}
      },
      "required": ["company", "stars", "date", "sort", "limit"],
      "additionalProperties": false
    }
  },
  {
    "name": "app_store_reviews",
    "description": "Get App Store reviews of one iOS app through EveryInfra (platform app_store, action reviews).",
    "strict": true,
    "input_schema": {
      "type": "object",
      "properties": {
        "app_id": {"type": "string", "pattern": "^[0-9]{6,12}$", "description": "Numeric App Store id, for example 6473753684"},
        "country": {"type": "string", "pattern": "^[a-z]{2}$"},
        "sort": {"type": "string", "enum": ["newest", "most_helpful"]},
        "limit": {"type": "integer", "description": "1 to 500; use 30 unless the user asks for more"}
      },
      "required": ["app_id", "country", "sort", "limit"],
      "additionalProperties": false
    }
  },
  {
    "name": "amazon_reviews",
    "description": "Get the featured customer reviews shown on one Amazon product page (platform amazon, action reviews). Usually about a dozen reviews per product.",
    "strict": true,
    "input_schema": {
      "type": "object",
      "properties": {
        "url": {"type": "string", "pattern": "^https://www\\.amazon\\.[a-z.]{2,6}/(dp|gp/product|product-reviews)/[A-Z0-9]{10}"},
        "domain": {"type": "string", "enum": ["amazon.com", "amazon.co.uk", "amazon.de", "amazon.fr", "amazon.it", "amazon.es", "amazon.ca", "amazon.com.au", "amazon.in", "amazon.co.jp", "amazon.sg"]}
      },
      "required": ["url", "domain"],
      "additionalProperties": false
    }
  }
]

Описанные выше лимиты потребовали четырёх проектных решений. Первое: все параметры сделаны обязательными. В каталоге для trustpilot/reviews указано шесть необязательных параметров и limit — всего семь. Если бы мы оставили все семь необязательными, они заняли бы почти треть лимита в 24 параметра.

Anthropic предлагает другой подход: если у параметра всегда есть разумное значение по умолчанию, сделайте его обязательным, и модель подставит это значение сама. Поэтому мы добавили в date значение any и разрешили пустой массив для stars. Наш код удаляет any и [] перед отправкой запроса, потому что, согласно каталогу, пустое значение означает отсутствие фильтра. Вечером мы для проверки отправили в API date: any и получили 422 за 0,11 секунды. Так что этот шаг не пропускайте.

Второе: диапазон limit указан в описании, а не в minimum или maximum, потому что числовые ограничения не поддерживаются. Значения выше максимума обрабатывает API. В каталоге для шести возможностей на этот случай указано «capped», то есть API использует максимум. Третье: простое регулярное выражение допускает только ссылки Amazon на страницы товаров. В примечании каталога к amazon/reviews сказано, что главная страница магазина не подходит.

Мы проверили ссылку на магазин по этой схеме локальным валидатором JSON Schema, и регулярное выражение её отклонило.

Четвёртое: в версии каталога, которую мы прочитали в ночь на 1 ноября, не было allowed_values для date и sort у trustpilot/reviews. Мы скопировали значения из текста каталога. Почему это было важно, показано в следующем разделе. Вечером в каталоге появились эти значения, поэтому выше мы добавили last7days. Для domain мы использовали 11 сайтов, перечисленных в каталоге в 22:14 SGT. amazon.com.mx среди них нет: для этого сайта API теперь возвращает статус 422 до списания средств. Подробности — в разделе об ограничениях.

Во всём определении используются только enum, required, additionalProperties: false, простой pattern, а также format. Их поддерживает большинство систем декодирования с ограничениями. Поддержка ограничений диапазонов чисел и длины строк различается между системами, что видно по тесту шести фреймворков в JSONSchemaBench. Поэтому эти ограничения проверяет API, возвращая при нарушении статус 422. После небольших изменений названий те же определения инструментов можно перенести к другому провайдеру моделей, а второй уровень останется без изменений.

Скриншот таблицы «Explicit limits» в документации Anthropic по структурированным ответам. В ней три строки: инструментов с strict: true на запрос — 20; необязательных параметров — 24; параметров с объединением типов — 16. Бирюзовая рамка выделяет строку необязательных параметров. В ней сказано, что лимит равен совокупному числу параметров, не указанных в required, во всех схемах инструментов с strict: true и схемах JSON-вывода.
Строгие инструменты и структурированный вывод используют общий набор лимитов на запрос. Снимок от 1 ноября 2026 г. Документация Anthropic

Сколько возможностей каталога укладывается в этот бюджет? Мы подсчитали необязательные параметры у всех 402 доступных возможностей. Для возможностей, которые возвращают список, учитывали и limit. Медиана равна 1, максимум 9. Ни одна возможность не превышает 24. У 100 возможностей нет необязательных параметров, у 139 он один, то есть у 239 возможностей (59,5%) их ноль или один.

Столбчатая диаграмма: распределение 402 доступных возможностей EveryInfra по числу необязательных параметров. 0 параметров: 100 возможностей. 1 параметр: 139 возможностей. Эти два столбца бирюзовые. 2 параметра: 70. 3 параметра: 37. 4 параметра: 25. 5 параметров: 13. 6 параметров: 4. 7 параметров: 6. 8 параметров: 7. 9 параметров: 1. Источник: каталог по состоянию на 1 ноября 2026 г., 00:46 SGT.

Это распределение говорит о двух вещах. Хорошая новость: если сделать все параметры обязательными, в один запрос поместятся любые 20 возможностей, и ни один слот для необязательных параметров не будет занят. Плохая новость: превратить все 402 возможности в строгие инструменты в одном месте нельзя. В сумме у них 686 необязательных параметров. При лимите 24 на запрос нужно минимум 29 групп.

Жадный алгоритм упаковки сформировал 30 групп. Один только лимит в 20 строгих инструментов на запрос требует минимум 21 группы. Поэтому правильный подход — подбирать инструменты под задачу. Для мониторинга отзывов восемь возможностей для работы с отзывами вместе занимают ровно 23 слота для необязательных параметров.

Горизонтальная столбчатая диаграмма. Нарастающий итог числа необязательных параметров для восьми инструментов для работы с отзывами. amazon/reviews: 2, trustpilot/reviews: 9, app_store/reviews: 12, google_play/reviews: 17, g2/reviews: 19, capterra/reviews: 20, yelp/reviews: 22, tripadvisor/reviews: 23. Последний столбец бирюзовый. Пунктирная линия отмечает лимит 24. Ещё один инструмент с необязательным параметром превысит лимит.

23 на один меньше лимита в 24. Добавьте схему структурированного вывода с одним необязательным полем, и запрос завершится ошибкой. Поэтому Anthropic советует делать параметры обязательными везде, где это возможно. В трёх наших инструментах-примерах все параметры обязательные, поэтому они не занимают ни одного слота для необязательных параметров. Весь бюджет остаётся для схемы вывода.

Есть и полезный контрпример. У удалённого MCP-сервера EveryInfra есть универсальный инструмент everyinfra_call_api. Его поле params представляет собой открытый объект, поскольку инструмент должен принимать параметры всех 426 возможностей. Для обычного инструмента это нормально.

Но строгий режим требует additionalProperties: false для каждого объекта, поэтому эта схема не может быть строгой. Когда мы снова прочитали список инструментов MCP 1 ноября 2026 г. в 15:41 SGT, в нём было 12 инструментов общим объёмом 16 247 байт. Поле params у everyinfra_call_api по-прежнему было открытым объектом. Если вам нужна гарантия строгого режима, пишите инструменты под конкретные задачи, как показано выше. Универсальный инструмент оставьте для исследования.

Автоматически превращайте каталог в схемы и пересобирайте их каждый день

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

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

Поле каталогаСтрогая схемаПричина
required_paramsСкопировать в requiredОбязательные поля не занимают слоты для необязательных параметров
optional_paramsТоже в required, со значением «не задано», например any или []Бюджет в 24 слота остаётся свободным
allowed_valuesenum, точная копия с сохранением регистраСтрогий режим гарантирует, что значение будет выбрано из enum
format: uri или dateТот же formatСтрогий режим принимает десять строковых форматов
default_limit, max_limitinteger, диапазон указан в описанииminimum и maximum не поддерживаются
Каждый объектadditionalProperties: falseОбязательно в строгом режиме

Два случая требуют участия человека. Первый: параметр, значения которого перечислены только в тексте, без allowed_values. Пример: параметры date и sort у trustpilot/reviews. Скрипт не может найти эти значения. Человек должен перенести их в enum или дождаться, пока их добавят в каталог. Для этих двух параметров значения появились в каталоге вечером 1 ноября.

Мы ведём список таких параметров и показываем его при каждой пересборке.

Второй случай: очень большой enum. В день нашего теста у 8 enum было больше 100 значений, а у самого большого 183. Большой enum увеличивает скомпилированную грамматику. По словам Anthropic, у этих внутренних лимитов нет единого числа. Для таких параметров мы не используем enum, перечисляем самые частые значения в описании и оставляем проверку ответу 422. Ответ 422 всё равно возвращает полный список allowed.

Ежедневная пересборка также показывает, когда придётся платить за новую компиляцию. На странице о структурированном выводе сказано, что скомпилированные грамматики хранятся в кеше 24 часа после последнего использования. Изменение структуры схемы сбрасывает кеш. Если структурированный вывод и инструменты используются вместе, изменение набора инструментов также сбрасывает кеш. Изменение только name или description его не сбрасывает. Поэтому скрипт должен различать два вида изменений.

Если изменился только текст, замените его без затрат. Если изменились параметры, значения или обязательные поля, следующий запрос будет медленнее. При пакетной обработке эта задержка не важна. В живом чате отправьте один прогревочный запрос в спокойное время. Пакетная обработка выигрывает и от этого правила: тысячи запросов используют один набор инструментов и одну схему вывода, поэтому грамматика компилируется один раз.

Второй уровень: ответ 422 позволяет модели самой исправить вызов

Первый уровень предотвращает ошибки структуры, но не ошибки в значениях. Модель может выбрать неверное значение, которое схема всё же допускает. Например, она может передать most_recent как порядок сортировки App Store, хотя на другой платформе этот порядок называется именно так. Или ваше приложение может вообще не использовать строгий режим и вызывать универсальный инструмент. В таких случаях второй уровень должен сразу возвращать ошибку, ничего не списывать и объяснять, как её исправить.

На странице Anthropic о вызовах инструментов есть два пункта, которые здесь применимы («handle tool calls»). Во-первых, передавайте ошибку в tool_result с is_error: true. Тогда модель повторит попытку с исправлениями, обычно 2–3 раза, прежде чем извинится перед пользователем. Во-вторых, пишите поясняющие сообщения об ошибках. Не ограничивайтесь «failed». Укажите, что пошло не так и что Claude стоит попробовать дальше.

1 ноября 2026 г. с 00:48 до 00:49 SGT мы намеренно отправили семь некорректных запросов. В 00:57 SGT отправили ещё один через MCP. Ниже показан сырой ответ для неизвестного параметра. В запросе есть лишний max_results.

API вернул 422 за 0,12 с. Поле allowed перечисляет все восемь допустимых имён параметров. Поле example содержит работающий запрос. Поле next_steps предлагает удалить max_results и сообщает, что ничего не списано.

Скриншот запроса к POST /api/v1/social с platform trustpilot, action reviews, company temu.com и лишним max_results со значением 20. Ниже сырой ответ HTTP 422: 0,12 с, 703 байта, 2026-11-01 00:48:38 SGT. Код ошибки unknown_param. В сообщении сказано, что max_results не является параметром trustpilot/reviews, company обязателен, а date, lang, language, limit, sort, stars и verified_only необязательны. Бирюзовыми рамками выделены список allowed, текст next_steps (удалить max_results, см. catalog_url, example содержит работающий запрос, ничего не списано) и тело запроса из example.
Сырой ответ 422 для неизвестного параметра. Вместо ключа показано имя переменной окружения. Реальный ответ API EveryInfra

Более типичный случай: неверное значение enum. В 00:49 SGT мы отправили sort: most_recent в app_store/reviews. API вернул 422 за 0,11 с. Поле did_you_mean содержало ["newest"], а allowed содержало ["most_helpful", "newest"]. Первая строка next_steps предлагает изменить только sort на значение из allowed и отправить запрос снова, а также сообщает, что ничего не списано.

Вторая строка тоже полезна. Она объясняет, что делать, если отправленное значение есть в каталоге. Тогда ошибка на стороне EveryInfra, и модели стоит спросить пользователя, создать ли тикет в поддержку. Эта строка адресована модели. Она отделяет «я передал неверные данные» от «сервис работает неправильно». Так модель не принимает собственную ошибку за сбой и не повторяет то же значение.

Скриншот запроса к app_store/reviews с app_id 6448311069 и sort most_recent. Ответ: HTTP 422, 0,11 с, 621 байт, 2026-11-01 00:49:03 SGT. Код ошибки invalid_value, в сообщении сказано, что sort должен быть most_helpful или newest, а получено most_recent. Бирюзовыми рамками выделены did_you_mean (newest), allowed (most_helpful, newest) и next_steps (изменить только sort на значение из allowed и отправить снова, ничего не списано; если ваше значение есть в каталоге, это ошибка на стороне EveryInfra, поэтому спросите пользователя о тикете в поддержку).
Сырой ответ 422 для неверного enum. did_you_mean сразу подсказывает исправление. Реальный ответ API EveryInfra

В таблице ниже показаны восемь случаев с ошибками, два дневных контрольных вызова и пять вечерних повторных проверок после исправления. Последний столбец содержит результаты локальной проверки. Мы проверили все входные данные по приведённым выше определениям инструментов с помощью валидатора JSON Schema для словаря валидации «Draft 2020-12 validation vocabulary».

Время (SGT)Что мы сломалиОтветВремяСписаниеПодсказки в ответеСтрогий режим блокирует раньше?
00:48:37Нет ключа401 missing_key0.12 s0Просит передать API-ключНе относится
00:48:38Лишний max_results422 unknown_param0.12 s0Список параметров, пример запросаДа
00:48:42company набрано как compnay422 missing_param0.23 s0Указывает опечатку, примерДа
00:48:42date: last7days5031.69 s0 (возврат средств)Только «повторите позже»Тогда да; после вечернего исправления значение допустимо
00:48:44sort: newest5031.91 s0 (возврат средств)Только «повторите позже»Тогда да; после вечернего исправления значение допустимо
00:49:03sort: most_recent422 invalid_value0.11 s0did_you_mean, allowedДа
00:49:03G2 sort: newst422 invalid_value0.20 s0did_you_mean, allowedДа
00:57:45G2 sort: most_recent через MCPisError: true—0То же, в structuredContentНеприменимо
15:39:38sort: newest (контроль)200, 20 записей14.3 s$0.001389Нет; другие отзывыТогда да; после вечернего исправления значение допустимо
15:39:38date: last7days (контроль)200, 20 записей14.4 s$0.001389Нет; другие отзывыТогда да; после вечернего исправления значение допустимо
19:18:39sort: newst (после исправления)422 invalid_value0.21 s0did_you_mean (newest), allowedДа
19:18:46date: last_week (после исправления)422 invalid_value0.12 s0did_you_mean (last7days), allowedДа
19:18:53date: any (после исправления)422 invalid_value0.11 s0allowedНет; схема это допускает, а код удаляет значение
19:19:01language: eng (после исправления)422 missing_param0.19 s0Просит двухбуквенный кодНет в нашем определении
19:19:23sort: newest (после исправления, теперь допустимо)200, 20 записей14.1 s$0.001389Те же записи, что и для recencyНе нужен

Четыре дневные строки с trustpilot/reviews требуют внимания. В раннем каталоге у параметров date и sort этой возможности было только текстовое описание, без allowed_values. Поэтому API не мог проверить их как enum на входе. В 00:48 SGT каждое неверное значение получило 503 через 1,7–1,9 с. Списания не было, а next_steps предлагал только повторить попытку через retry_after секунд.

Но списать эти две ошибки 503 на значения нельзя. В те же несколько минут в другом тесте мы вызвали trustpilot/profile без этих параметров и тоже получили 503. Значит, сама платформа в тот момент работала нестабильно.

Поэтому днём мы провели контрольный тест. В 15:39:38 SGT отправили четыре вызова в одну минуту, все для temu.com. В каждом менялся только один параметр. Мы сравнили sort: newest с допустимым sort: recency, а date: last7days с допустимым date: last30days. В 15:40 SGT добавили базовый вызов без необязательных параметров и один повтор с newest. Все шесть вызовов вернули 200 с 20 записями, каждый стоил $0,001389.

Результаты чётко разделились на две группы. Два допустимых значения и базовый вызов вернули одни и те же 20 отзывов. Все на английском, поля verification_level и source заполнены. Два значения не из списка и повтор вернули другой набор из 20 отзывов. Из них 13 на английском, 3 на французском, 2 на испанском и 2 на итальянском. Во всех 20 эти два поля были пустыми.

Итак, днём 1 ноября при неверном значении API не возвращал ни 422, ни 503. Он принимал значение, списывал обычную плату и незаметно менял результат.

Для модели это хуже, чем 503. Модель видит успешный ответ, поэтому не повторяет попытку и не предупреждает пользователя. Отзывы на разных языках попадают прямо в ваш конвейер. В тексте каталога для sort на самом деле сказано использовать recency, а не значение newest с других платформ. Но это видит только тот, кто читает текст. Проверка API этого не видела.

Таковы дневные результаты. Вечером того же дня шлюз изменил эти правила:

ПараметрДнём 1 ноябряПосле вечернего исправления
sortЗначения не перечислены; API принимал newest, списывал плату и возвращал другие отзывыnewest (то же, что recency), recency, relevance
dateЗначения не перечислены; API принимал last7days, списывал плату и возвращал другие отзывыПять пресетов, отсекающих отзывы по дате публикации: за последние 7, 30, 92, 183 и 366 дней
language, langВ тексте были только примерыТолько двухбуквенные коды; без языка возвращаются только отзывы на английском
Значения не из спискаAPI мог принять их и списать плату422 до любого списания, с допустимыми значениями и подсказкой did-you-mean

Последние пять строк таблицы ошибок относятся к нашей повторной проверке с той же компанией. Неверные значения получили 422 с подсказкой и без списания. Четыре вызова вернули 200 по $0,001389 каждый: sort: newest, sort: recency, date: last7days и базовый. Все четыре вернули одни и те же 20 отзывов на английском, с verification_level и source в каждой записи. Самому старому отзыву было меньше суток, поэтому результаты с last7days и без date должны совпадать.

Это также показывает, почему нужен первый уровень. Наша строгая схема задаёт date и sort как enum, поэтому Claude не сможет отправить такие ошибочные значения. После вечернего исправления эти две ошибки останавливает и 422. Но у других параметров значения по-прежнему могут быть перечислены только в тексте, поэтому клиентская схема остаётся первой проверкой.

На стороне MCP действует то же разделение. В разделе об инструментах спецификации MCP ошибки валидации входных данных отнесены к ошибкам выполнения инструмента. Они передаются в результате с isError: true, и клиент отдаёт их модели, чтобы она могла исправить вызов. Наш вызов MCP в 00:57 SGT вернул именно это. В нашем руководстве по ошибкам API разобран каждый код ошибки, а руководство по проверке возвратов показывает, как сверять возвраты средств.

Тепловая карта: какие поля есть в каждом из 7 реальных ответов с ошибками, бирюзовый цвет означает наличие. В 401 без ключа есть только next_steps и указано, что списания не было. В 422 с неизвестным параметром есть param, allowed, example, catalog_url, next_steps и указано, что списания не было, но нет did_you_mean. В 422 с опечаткой в обязательном параметре есть param, example, catalog_url, next_steps и указано, что списания не было. В 422 с неверным enum, 422 с опечаткой в enum и MCP isError с неверным enum есть param, allowed, did_you_mean, catalog_url, next_steps и указано, что списания не было, но нет example. В 503 с неверным пресетом даты есть только next_steps и указано, что списания не было.

Ещё одна находка следует из небольшой заметки в документации Anthropic. Структурированный вывод не гарантирует регистр строковых значений enum. Модель может без ошибки вернуть значение, которое отличается от заданного в схеме только регистром. В заметке сказано, что это относится и к строгому использованию инструментов («structured outputs, „Invalid outputs“»). Поэтому даже в строгом режиме newest может превратиться в Newest. В 14:33 SGT мы проверили app_store/reviews с sort: Newest.

API не вернул ошибку. Он вернул 200 с 30 отзывами в порядке от новых к старым и списал $0,001389.

Одного вызова мало для вывода, поэтому с 15:39 до 15:41 SGT мы проверили ещё две платформы. На g2/reviews запросы с sort: Newest и sort: newest вернули один и тот же набор из 21 записи. На google_play/reviews запрос с sort: Top_Rated вернул 40 отзывов, все пятизвёздочные. Вызов с sort: Newest в ту же минуту вернул смесь оценок от одной до пяти звёзд, то есть значение с изменённым регистром действительно сработало. Эти четыре вызова стоили по $0,001389.

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

Параллельное использование инструментов тоже влияет на оба уровня. Оно включено по умолчанию. Поэтому модель может отправить несколько блоков tool_use за один ход, например Trustpilot и App Store вместе. На странице «parallel tool use» приведены два правила формата. Все результаты инструментов за ход передаются в одном сообщении пользователя, и перед результатами не должно быть текста. Поэтому ваш код должен обрабатывать 422 и 200 в одном ходе.

Пометьте результат 422 как is_error: true, а результат 200 верните как обычно. Тогда модель повторно отправит только неудачный вызов. Если у вашего ключа низкий лимит запросов или вам нужны простые логи, добавьте disable_parallel_tool_use: true внутрь объекта tool_choice. В режиме auto модель тогда вызывает не больше одного инструмента за ответ. Эта настройка не является параметром верхнего уровня запроса.

Горизонтальная столбчатая диаграмма в логарифмическом масштабе. Время и стоимость 17 из первых 19 реальных вызовов, до 15:00 SGT. Вызов для мексиканского магазина, вызов на испанском и 10 дневных контрольных вызовов не показаны. Четыре вызова с 422 (sort most_recent за 0,11 с, неизвестный max_results за 0,12 с, sort newst за 0,20 с, опечатка compnay за 0,23 с) и 401 за 0,12 с ничего не стоили; столбцы 422 бирюзовые. Три вызова App Store с 200 заняли 0,44–0,51 с и стоили по $0,001389. Два вызова с 503 заняли 1,69 и 1,91 с и ничего не стоили. amazon/search занял 11,78 с и стоил $0,002236. Trustpilot с 20 записями занял 56,95 с, со 100 записями 84,00 с, по $0,001389 каждый. Три синхронных вызова amazon/reviews заняли 66–73 с, вернули 0 записей и ничего не стоили.

Диаграмма показывает тот же факт с другой стороны. Повторная попытка после 422 стоит $0 и около 0,17 с на стороне API: это среднее по четырём вызовам с 422. Затраты приходятся на дополнительный ход модели.

Для одного дополнительного хода используйте формулу: стоимость исправления = (токены контекста + токены ошибки) × цена входных токенов + токены исправления × цена выходных токенов. Мы берём около 240 токенов на тело ошибки и около 120 выходных токенов на исправление. Основную часть стоимости определяет длина контекста, поэтому в таблице три размера. Цены взяты со страницы с ценами по состоянию на 1 ноября 2026 г. Число в скобках показывает, скольким вызовам API для отзывов по $0,001389 каждый соответствует эта стоимость.

КонтекстHaiku 5.5Sonnet 5.5Opus 5.5Fable 5.1
1 000 токенов$0.00018 (0.1)$0.0037 (2.6)$0.0074 (5.3)$0.0184 (13)
5 000 токенов$0.00058 (0.4)$0.0117 (8.4)$0.0234 (17)$0.0584 (42)
20 000 токенов$0.0021 (1.5)$0.0417 (30)$0.0834 (60)$0.2084 (150)

У приложения с тремя определениями инструментов и несколькими ходами контекст часто достигает 20 000 токенов. Тогда одна ошибка при работе с Opus 5.5 обходится примерно как 60 вызовов API данных. С кешированием промптов часть контекста оплачивается по цене чтения из кеша. Эта цена составляет 10% от цены входных токенов на Haiku 5.5, 5% на Opus 5.5 и Sonnet 5.5 и 2,5% на Fable 5.1. При 20 000 токенов на Opus 5.5 это снижает стоимость одного дополнительного хода с $0,0834 примерно до $0,0074.

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

Полный цикл: что отправляет модель и что приходит в ответ

Код ниже объединяет оба уровня в минимальном цикле. Он следует документации Anthropic. Это пример конфигурации: сторону Claude мы не запускали. Запросы и ответы EveryInfra взяты из реальных результатов от 1 ноября 2026 г.

python
import json, os, requests, anthropic

client = anthropic.Anthropic()                 # reads ANTHROPIC_API_KEY
EI = "https://api.everyinfra.com/api/v1/social"
TOOLS = json.load(open("tools.json"))           # the three strict tools above
ROUTE = {"trustpilot_reviews": ("trustpilot", "reviews"),
         "app_store_reviews": ("app_store", "reviews"),
         "amazon_reviews": ("amazon", "reviews")}

def call_everyinfra(name, args):
    platform, action = ROUTE[name]
    params = {k: v for k, v in args.items() if v not in ("any", [], None)}   # "any" and [] mean no filter
    r = requests.post(EI, json={"platform": platform, "action": action, "params": params},
                      headers={"Authorization": f"Bearer {os.environ['EVERYINFRA_API_KEY']}"}, timeout=90)
    body = r.json()
    if r.status_code == 422:                    # value error: pass it to the model as is
        return json.dumps(body["error"]), True
    if r.status_code >= 400:
        return json.dumps(body.get("error", body)), True
    rows = [{k: x.get(k) for k in ("id", "rating", "title", "text", "posted_at")} for x in body["results"]]
    return json.dumps({"count": body["count"], "charged_usd": body["billing"]["charged_usd"], "reviews": rows}), False

messages = [{"role": "user", "content": "Use the trustpilot_reviews tool to get 20 one- and two-star reviews of temu.com from the last 30 days, then group them by topic."}]
while True:
    resp = client.messages.create(model="claude-opus-5-5", max_tokens=4000, tools=TOOLS,
                                  tool_choice={"type": "auto"}, messages=messages)
    messages.append({"role": "assistant", "content": resp.content})
    if resp.stop_reason != "tool_use":
        break
    results = []
    for block in resp.content:
        if block.type == "tool_use":
            text, is_err = call_everyinfra(block.name, block.input)
            results.append({"type": "tool_result", "tool_use_id": block.id, "content": text, "is_error": is_err})
    messages.append({"role": "user", "content": results})

Несколько деталей делают этот цикл стабильным. Код задаёт tool_choice равным auto. Это значение по умолчанию, но явное указание сообщает следующему разработчику, что принудительный вызов не используется. В сообщении пользователя указано имя инструмента.

Именно так в документации Opus 5.5 и Fable 5.1 предлагают заменять принудительный вызов. Код помещает тело ошибки 422 в tool_result как есть, с is_error: true. Не заменяйте его на «неверный параметр»: модель может воспользоваться именно allowed и did_you_mean.

При успехе код возвращает модели только пять полей: id, оценку, заголовок, текст и время публикации.

Мы измерили это на реальных ответах того дня. Поле results для 20 отзывов с Trustpilot занимало 31 046 символов. Если оставить только пять полей, оно занимало 13 040 символов, то есть на 58% меньше. Для 30 отзывов из App Store размер уменьшился с 13 012 до 7 726 символов, то есть на 41%. Чем меньше читает модель, тем дешевле каждый ход. В расчётах для пакетной обработки ниже мы используем сокращённый размер.

Вот реальный обмен запросом и ответом в этом цикле в 00:49 SGT 1 ноября 2026 года. Строгий режим заставляет модель передавать параметры вроде {"company": "temu.com", "stars": ["1", "2"], "date": "last30days", "sort": "recency", "limit": 20}. Наш код отправляет их в trustpilot/reviews. API вернул 200 через 56,9 секунды и 20 отзывов: 19 с одной звездой и 1 с двумя звёздами, опубликованные с 30 октября 2026 года по 31 октября 2026 года.

По странам: 10 из Великобритании и 3 из США; на 16 отзывов компания ответила. Списано $0,001389, столько же, сколько указано в price_usd в каталоге. Если бы модель выбрала "sort": "newest", строгий режим остановил бы этот вызов. Без строгого режима API не отклонил бы значение. Как и в контрольном тесте выше, он списал бы обычную стоимость и вернул набор отзывов на разных языках.

Что увидит структурированный вывод? Мы не запускали Claude, поэтому не приводим вывод модели. Вместо этого мы применили простые правила по ключевым словам к 100 отзывам Trustpilot из вызова в 14:37 SGT. Из 100 отзывов в 40 упоминается возврат средств, в 20 возврат товара.

35 отзывов упоминают доставку, 33 — качество или повреждения, 35 — службу поддержки, 14 — аккаунт. 16 отзывов не подходят ни под одно правило. Медианная длина текста — 432 символа, а самый длинный отзыв содержит 3 371 символ.

Эти цифры полезны в двух отношениях. Во-первых, один отзыв часто подходит сразу под несколько тем. Если схема допускает только одно значение topic, модели придётся выбирать, поэтому пропишите правило в описании, например «предпочитай тему, связанную с деньгами». Во-вторых, самый длинный отзыв занимает около 1 350 токенов.

Если вы закладываете 25 отзывов на запрос, ориентируйтесь на распределение длины, а не на среднее значение. Иначе некоторые запросы могут упереться в max_tokens. Эти отзывы опубликованы с 27 октября 2026 года по 1 ноября 2026 года, поэтому описывают только эти дни.

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

json
{
  "type": "json_schema",
  "schema": {
    "type": "object",
    "properties": {
      "source": {"type": "string", "enum": ["trustpilot", "amazon", "app_store"]},
      "items": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "review_id": {"type": "string"},
            "rating": {"type": "integer"},
            "topic": {"type": "string", "enum": ["delivery", "refund", "quality", "price", "support", "app_bug", "account", "other"]},
            "severity": {"type": "string", "enum": ["low", "medium", "high"]},
            "quote": {"type": "string", "description": "At most 20 words copied from the review"}
          },
          "required": ["review_id", "rating", "topic", "severity", "quote"],
          "additionalProperties": false
        }
      }
    },
    "required": ["source", "items"],
    "additionalProperties": false
  }
}

У этой схемы нет необязательных параметров, поэтому она помещается в тот же запрос, что и три строгих инструмента. Для поля quote в описании указано «не более 20 слов» вместо maxLength, потому что ограничения длины не поддерживаются. Остаются два задокументированных исключения. Если модель отказывается отвечать, в ответе будет stop_reason: "refusal", а вывод может не соответствовать схеме.

Если вывод упирается в max_tokens, в ответе будет stop_reason: "max_tokens", а вывод может быть неполным. Поэтому проверяйте stop_reason, прежде чем что-либо сохранять. Кроме того, поле, которое просит «пошаговое рассуждение», может вызвать отказ reasoning_extraction. На странице «refusals and fallback» советуют вместо этого просить краткое объяснение.

Американские команды разработчиков приложений часто начинают с отзывов в App Store. В 00:54 SGT мы прочитали 30 самых новых отзывов из США о приложении Claude (app_store/reviews, app_id 6473753684). 24 из них относятся к версии 1.261026.20, а 6 — к версии 1.261028.19. Отзывы опубликованы с 28 октября 2026 года по 30 октября 2026 года. В таблице эти выборки приведены рядом с выборками из Trustpilot.

ВыборкаВремя (SGT)Записи1 звезда или 2 звезды5 звёздСписание
trustpilot/reviews, temu.com, stars 1–2, limit 2000:4920200$0.001389
trustpilot/reviews, temu.com, stars 1–2, limit 10014:371001000$0.001389
app_store/reviews, приложение Claude, США, newest00:54301016$0.001389
app_store/reviews, приложение ChatGPT, США, newest00:5430521$0.001389

У этих чисел нет статистического веса. Они показывают один практический факт. На Trustpilot одна и та же схема видит почти только плохие отзывы, потому что мы отфильтровали оценки в одну и две звезды. В App Store она видит смешанную картину.

Распределение поля вроде severity зависит от источника, поэтому задавайте уровни оповещений для каждого источника отдельно. На странице Apple для разработчиков сказано, что сводный рейтинг рассчитывается для каждой витрины и может сбрасываться с выходом новой версии. Письменные отзывы сохраняются («Apple, ratings and reviews»). Поэтому отзывы в разрезе версий полезнее общего балла.

Пакетная обработка: сколько стоит разбор 1 000 отзывов с Message Batches

Когда один цикл работает, затраты определяются объёмом. Message Batches API обрабатывает запросы асинхронно, и всё использование стоит 50% от стандартных цен. Пакет может содержать до 100 000 запросов или 256 МБ. Большинство пакетов завершается в течение часа. Запросы, не завершённые за 24 часа, истекают и не оплачиваются.

Результаты доступны 29 дней («batch processing»). На странице о структурированном выводе сказано, что функция работает с пакетами с той же скидкой 50%. Каждый запрос в пакете является полноценным запросом Messages. Поэтому строгие инструменты и output_config.format передаются как есть («create a Message Batch»).

На стороне данных первый вопрос в том, сколько записей получать за вызов. В каталоге для trustpilot/reviews указаны значение по умолчанию 20 и максимум 200, по $0,001389 за вызов. Поля с ценой за запись нет. В 14:37 SGT мы отправили limit: 100.

Мы получили 100 отзывов, а списание осталось $0,001389, столько же, сколько за 20 записей. Из этих 100 отзывов 95 были с одной звездой и 5 с двумя. 44 пришли из Великобритании, 21 из США.

Цена большого limit выражается во времени. Синхронный вызов занял 84,0 с, а по каталогу бюджет синхронного вызова составляет 85 с. Это вплотную к лимиту. Поэтому для массовой выгрузки отзывов используйте большой limit и добавляйте "mode": "async" в тело запроса. Затем опрашивайте GET /api/v1/jobs/{job_id}. Не ждите ответа синхронного вызова.

За 1 000 отзывовHaiku 5.5Sonnet 5.5Opus 5.5Fable 5.1
Стоимость модели по стандартному тарифу$0.0577$1.1537$2.3073$5.7683
Стоимость модели в Message Batches$0.0288$0.5768$1.1537$2.8842
Плата за данные, limit=100 (10 вызовов)$0.0139$0.0139$0.0139$0.0139
Итого, пакет + limit=100$0.0427$0.5907$1.1676$2.8981

Вот как мы оценили стоимость модели, чтобы вы могли подставить свои цифры. Согласно «models overview», 1 млн токенов примерно равен 2,5 млн символов Unicode, поэтому мы берём 0,4 токена на символ.

Исходные данные для оценкиЗначениеИсточник
Отзывов на запрос25, то есть 40 запросовНаш выбор
Символов в сокращённом отзывеОколо 440Реальные ответы Trustpilot и App Store
Инструкции и схема на запросОколо 1 424 символовНаш промпт и схема вывода
Символов на элемент выводаОколо 189Один пример элемента вывода
Всего токеновОколо 198 832 на входе, 75 600 на выходеСимволы × 0,4

Мы не учитывали токены рассуждений, системный промпт для использования инструментов (286 токенов на Opus 5.5) и промпт формата, который добавляют structured outputs. Поэтому эти цифры — нижняя граница. При значении по умолчанию limit=20 плата за данные для 1 000 отзывов составляет 50 вызовов и $0.0694, что в пять раз больше, чем при limit=100.

Горизонтальная столбчатая диаграмма с накоплением. Стоимость в USD преобразования 1 000 отзывов в JSON: стоимость модели по ценам Message Batches и плата за данные при limit=100, $0.001389 за вызов. Haiku 5.5: всего $0.0427, бирюзовый. Sonnet 5.5: $0.5907. Opus 5.5: $1.1676. Fable 5.1: $2.8981. Плата за данные в каждом столбце составляет $0.0139. Это около трети столбца Haiku, а в остальных трёх столбцах она почти незаметна.

Вывод очевиден. Группировка отзывов — это много чтения и простые решения, поэтому поручите её Haiku 5.5. Тогда стоимость модели и плата за данные сопоставимы, в сумме около $0.04 за 1 000 отзывов. Opus 5.5 обходится в 27 раз дороже, а Fable 5.1 — в 68 раз. У Haiku 5.5 есть одна ценовая ступень, за которой стоит следить.

Свыше 100 000 токенов промпта цены составляют $0,50 / $2,50, а в пакете — $0,25 / $1,25. При 25 коротких отзывах на запрос вы остаётесь далеко ниже этой границы. Если нужна более тонкая оценка, например чтобы отличать «медленную доставку» от «отказа продавца принять возврат», сначала обработайте всё с помощью Haiku. Затем отправьте в Opus 5.5 только элементы с severity: high.

Теперь применим это к ежедневному мониторингу. Возьмём отзывы с одной и двумя звёздами на Trustpilot для 50 компаний, а также новые отзывы в App Store для 50 приложений. Это 100 вызовов API в день: $0.1389 в день и $4.17 за 30 дней. Мониторинг обрабатывает примерно до 2 500 отзывов в день.

За 30 дней группировка стоит около $2,16 на Haiku 5.5 в пакетах, $43,26 на Sonnet 5.5 и $86,53 на Opus 5.5. Пакеты и кеширование промптов можно сочетать, и кешированные системные промпты и определения инструментов стоят дешевле. Но доля попаданий в кеш в пакете зависит от порядка запросов. Мы это не проверяли, поэтому в цифрах это не учтено.

Что не работает и за чем следить

Сначала о пробеле в наших данных. 1 ноября 2026 г. amazon/reviews не вернул ни одного отзыва за четыре попытки. Два синхронных вызова в 00:50 и 00:51 SGT ждали около 68 и 73 с. Одна асинхронная задача в 00:53 SGT завершилась с 0 записями.

Ещё один синхронный вызов в 14:34 SGT с заданным domain ждал 66 с и тоже вернул 0 записей. Ни один из четырёх вызовов ничего не стоил. За пустые результаты средства возвращаются по правилам, а за асинхронную задачу сначала списали средства, а затем вернули.

Вечером того же дня шлюз изменил обработку двух случаев с Amazon. Мы проверили их повторно с 19:19 до 19:24 SGT:

ЗапросДнёмПовторная проверка вечеромСписание
Сайт США, синхронно200, 0 записей, 66–73 с503 access_blocked за 24,6 с; next_steps сообщает, что быстрая повторная попытка не поможет0
Сайт США, асинхронноЗадача завершена, 0 записей202 с удержанием $0,001389; задача завершилась ошибкой access_blocked0 (возврат средств)
amazon.co.jpНе тестировалось19:19: 422 missing_param, сообщение «missing domain». 22:14: 200 за 35,3 с, 5 отзывов, все от покупателей из других стран (3 из США, 2 из Германии)0 в 19:19; $0,001389 в 22:14
amazon.com.mxНе тестировалось19:19: 422 missing_param. 22:14: 422 invalid_value за 0,09 с со списком из 11 поддерживаемых сайтов0

В 19:19 в сообщении об ошибке не говорилось, что эти два сайта не поддерживаются. В 22:14 каталог уже описывал domain как enum из 11 сайтов: amazon.com, co.uk, de, fr, it, es, ca, com.au, in, co.jp и sg. Теперь запрос к мексиканскому сайту отклоняется до списания, а в ошибке перечислены все 11 значений. В определении инструмента выше используется тот же список. Японский сайт теперь возвращает отзывы, но их авторы не всегда покупатели из Японии. Чтобы оставить только отзывы из Японии, фильтруйте по полю country.

В каталоге уже сказано, что эта возможность получает только избранные отзывы со страницы товара, обычно около десятка на товар. В тот день не удалось получить даже их. Поэтому инструмент для Amazon в этой статье служит лишь примером конфигурации. В реальных тестах мы использовали trustpilot/reviews и app_store/reviews, которые в тот день работали.

При этом amazon/search работал: в 00:51 SGT поиск по запросу «anker power bank 10000mah» вернул 5 товаров за 11,8 секунды и стоил $0,002236. Прежде чем добавлять отзывы Amazon в пакет, сверьтесь с каталогом. Затем сделайте один небольшой вызов в тот же день.

Далее — ограничения, описанные Anthropic. Strict-инструменты допускаются к использованию в сценариях, подпадающих под HIPAA, но API кэширует скомпилированные схемы отдельно от содержимого сообщений, и на них не распространяется такая же защита (strict tool use, data retention). Поэтому не помещайте список клиентов в enum. Случай с CMEK описан в руководстве по миграции на Fable 5.1 (Fable 5.1 migration guide).

ОграничениеЧто это значит для API данныхИсточник
Никаких медицинских данных в схемахНикаких PHI в именах свойств, enum, const и pattern«Strict tool use, data retention»
Организации с CMEKНа моделях Fable нет structured outputs и strict: true; используйте только инструкцию«Fable 5.1 migration guide»
Цитирование (Citations)Не работает вместе со structured outputs: ошибка 400«Structured outputs, feature compatibility»
Смена форматаНовый output_config.format сбрасывает кэш промпта«Structured outputs, token costs»

К ограничению на цитирование нужно ещё одно пояснение. Для структурированных данных с источником для каждого значения используйте специальный метод из документации по citations.

Наконец, у второго уровня есть свои ограничения. Ответ 422 отсекает только ошибки, которые определены в каталоге: неизвестные параметры, отсутствующие обязательные параметры и enum с перечисленными значениями.

Он не может отсечь ошибки в правилах, которые каталог описывает только текстом. Днём 1 ноября примерами были date и sort в trustpilot/reviews. В то время неверные значения этих двух параметров даже не вызывали ошибку. За них списывалась обычная плата, а результат менялся. Вечернее исправление добавило для них допустимые значения, так что теперь такие запросы получают 422.

422 не поможет и с фактами, которые известны только во время выполнения, например «есть ли у этой компании страница на Trustpilot».

Поэтому используйте оба уровня. Всё, что можно, заложите в strict-схему. Остальные ошибки должен отсекать ответ 422. Для enum, скопированных из текста каталога, также проверяйте в коде язык и ключевые поля каждого ответа.

Диагностика: семь симптомов и как их устранить

В продакшене проблемы обычно возникают в пограничных случаях. Схема вдруг перестаёт компилироваться. Модель на каком-то ходе не вызывает инструмент. Несколько записей в пакете выбиваются из общего ряда. В таблице ниже собраны семь симптомов из документации и наших реальных вызовов.

Сначала проверьте, кто вернул код статуса. 400 приходит от Anthropic и означает, что неверен запрос или схема, поэтому исправляйте код. 422 или 503 приходят от EveryInfra и означают, что структура запроса верна, но значение не прошло проверку или выполнение завершилось с ошибкой, поэтому следуйте next_steps. Одна эта проверка экономит большую часть времени на отладку, потому что форматы ошибок различаются и их легко перепутать в логах.

СимптомКто вернулПричинаКак исправить
400, tool_choice не поддерживаетсяAnthropicany или tool на новой моделиИспользуйте auto и назовите инструмент в сообщении пользователя
400, схема слишком сложнаяAnthropicБольше 24 необязательных параметров или большая грамматикаСделайте параметры обязательными; большие enum замените текстом и проверкой через 422
Модель отвечает текстом, без вызова инструментаAnthropicНечёткая инструкцияНазовите инструмент и условие вызова; проверьте stop_reason и попросите ещё раз
422 invalid_valueEveryInfraЗначения нет в allowed_values каталогаИсправьте одно поле по did_you_mean; без списания
Повторяющийся 503EveryInfraПлатформа работает нестабильно: наши вызовы без подозрительных значений тоже его получали. При reason: access_blocked целевая страница требует входа или доступ к ней ограниченПодождите retry_after; после повторных сбоев передайте запрос на проверку человеку; при access_blocked смените цель
200, но язык или поля выглядят неправильноEveryInfraЗначение, которого нет в тексте каталога, было принято и изменило результат. Так было с date и sort в trustpilot/reviews до вечернего исправленияЗаблокируйте его через enum на клиенте; сверьтесь с текстом каталога
200, но 0 записейEveryInfraВ тот день на целевой странице не было данныхСредства уже возвращены; смените цель или возможность

Последние три строки взяты из наших тестов, первые четыре — из документации Anthropic. Шестую строку заложите в код, потому что у других параметров может быть та же проблема. Каждый enum, скопированный из текста каталога, пропишите в схеме. После каждого ответа сравнивайте соотношение языков и ключевые поля с эталоном. При расхождении помечайте вызов для проверки человеком. В нашем контрольном тесте 7 из 20 отзывов при неверных значениях были не на английском. Два поля были пустыми во всех 20. Простая проверка выявляет это сразу.

Последние изменения, важные для этой конфигурации

ДатаИзменениеЧто это значит для вас
22 сентября 2026 г.Запуск Opus 5.5; thinking нельзя отключить; принудительный tool_choice возвращает 400Уберите принудительные вызовы до перехода с Opus 5; используйте auto вместе со strict
28 сентября 2026 г.Запуск Sonnet 5.5; принудительный tool_choice тоже отклоняетсяВозврат на Sonnet не позволяет обойти это изменение
7 октября 2026 годаЗапуск Haiku 5.5; контекстное окно на 1 млн токенов; цена в пакетном режиме $0,05 / $0,25Стоимость модели для массовой группировки теперь сопоставима с платой за данные
15 октября 2026 г.Models API сообщает о поддержке thinking between_tools; быстрый режим Opus 5.5 выходит из research previewПроверяйте возможности модели в коде, а не по ID модели
21 октября 2026 г.Версия API 2026-10-21 и новые SDK (Python 2.0.0 и другие)При обновлении SDK проверьте устаревшие поля вроде output_format
22 октября 2026 г.Claude через Google Cloud под управлением AnthropicЕщё один вариант оплаты пакетной обработки; порядок использования strict-режима не меняется
28 октября 2026 г.Лимит размера запроса Messages увеличен с 32 МБ до 128 МБВ один запрос помещается больше отзывов, но стоимость зависит от числа токенов
29 октября 2026 г.Usage and Cost Analytics API в бете, с группировкой по модели, рабочему пространству и ключуРаспределяйте расходы на модель по задачам и сравнивайте их с платой за данные
30 октября 2026 г.Быстрый режим для Opus 4.8 отключат 30 ноября 2026 г.Запланируйте переход, если на этой модели у вас в продакшене работает извлечение данных

Эти пункты взяты из API release notes, обновлённых 30 октября 2026 г., и API version migration guide. Важнее всего для этой статьи запуск Haiku 5.5 7 октября 2026 г. До него массовая группировка на Haiku 4.5 в пакетах стоила $0,50 / $2,50, в десять раз дороже, и стоимость модели намного превышала плату за данные. Теперь эти суммы сопоставимы, поэтому цена API данных становится реальным фактором.

Ещё один пункт относится к 22 сентября 2026 г.: системное сообщение посреди диалога может содержать полное определение инструмента — пока эта возможность находится в бете. Это позволяет добавить strict-инструмент посреди сессии, не сбрасывая кэш промпта. Anthropic указывает этот способ как один из вариантов замены принудительных вызовов.

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

Можно ли по-прежнему принудительно вызывать инструменты в Claude?

Этот вопрос взят из поисковой подсказки «claude force tool use». На Fable 5.1, Mythos 5.1, Opus 5.5 и Sonnet 5.5 нельзя. tool_choice со значением any или tool возвращает 400, и эндпоинт подсчёта токенов выполняет ту же проверку. auto и none по-прежнему работают. Оставьте auto, добавьте strict: true к инструментам и укажите в сообщении пользователя, когда использовать каждый инструмент. Если инструмент должен выполниться на текущем ходе, руководство по миграции на Fable 5.1 предлагает системное сообщение посреди диалога.

Что делать, если в claude tool_choice равен auto, а модель не вызывает инструмент?

Этот вопрос взят из подсказки «claude tool_choice». По словам Anthropic, Fable 5.1 надёжно следует явным инструкциям по инструментам. Поэтому, во-первых, сделайте инструкцию чёткой: назовите инструмент и условие вызова. Во-вторых, проверяйте stop_reason в цикле.

Если модель ответила текстом, а вам нужны данные, добавьте сообщение пользователя с просьбой выполнить вызов. В-третьих, напишите понятное description инструмента. На странице define tools подробные описания названы «безусловно, самым важным фактором качества работы инструментов».

Работают ли structured outputs в Claude на Bedrock?

Этот вопрос взят из подсказки «claude structured outputs bedrock». В таблице доступности на странице strict tool use указаны Amazon Bedrock, включая InvokeModel, и Google Cloud. На странице structured outputs сказано «на всех поддерживаемых платформах» и «для всех моделей». Моделям Fable требуется хранение данных в течение 30 дней, и на них не распространяется zero data retention. Прежде чем их использовать, ознакомьтесь со страницей о хранении данных.

Как использовать structured output в Claude с Pydantic?

Этот вопрос взят из подсказки «claude structured output pydantic». На странице structured outputs рекомендуется передавать модель Pydantic в client.messages.parse(). SDK преобразует схему и переносит неподдерживаемые ограничения, такие как minimum и maxLength, в описания. Затем он проверяет ответ по исходной схеме со всеми ограничениями.

Для EveryInfra запишите allowed_values из каталога как Literal[...], который превращается в enum. Диапазон limit задайте через Field(ge=1, le=200), и SDK проверит его локально. В каталоге для шести возможностей указано, что значения выше максимума обрезаются до него.

Стоит ли использовать structured outputs в Claude API вместе со strict-инструментами в одном запросе?

Этот вопрос взят из подсказки «claude structured outputs api». Да, можно. В разделе «Feature compatibility» страницы structured outputs сказано, что их можно использовать в одном запросе. У них общие лимиты: 20 strict-инструментов, 24 необязательных параметра и 16 параметров с union-типами, поэтому все поля схемы вывода тоже сделайте обязательными.

С чего начать

  1. Изучите каталог. Запрос GET https://api.everyinfra.com/api/v1/social/catalog?platform=trustpilot бесплатен и не требует API-ключа. Он возвращает параметры, допустимые значения и цены.
  2. Напишите strict-инструменты по шести правилам выше. Сделайте параметры обязательными, запишите allowed_values как enum, а диапазоны укажите в описаниях.
  3. Получите API-ключ в разделе Быстрый старт. Отправьте один запрос с неверным значением enum и убедитесь, что получаете 422 с did_you_mean.
  4. Для массовой работы используйте большой limit и "mode": "async". На стороне Claude используйте Message Batches.

Страницы платформ: API для парсинга Trustpilot, API для парсинга App Store и API для парсинга Amazon. Страницы возможностей: отзывы Trustpilot, отзывы App Store и отзывы Amazon. Другие страницы об отзывах: отзывы G2 и отзывы Google Play. Чтобы подключить удалённый MCP-сервер в Claude без кода, ознакомьтесь с настройкой удалённого MCP.

О данных отзывов как продукте читайте в статье данные отзывов как платный продукт. Также прочитайте один SKILL.md для четырёх ИИ-инструментов. О параллельной выгрузке данных с помощью субагентов читайте в статье субагенты Claude Code для брендовых аккаунтов TikTok. Сравните цены возможностей на рынке данных.

Источники

  1. «What's new in Claude Opus 5.5 (Forced tool use is not supported)», Anthropic, 22 сентября 2026 г., https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5
  2. «What's new in Claude Fable 5.1», Anthropic, 1 сентября 2026 г., https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1
  3. «What's new in Claude Sonnet 5.5», Anthropic, 28 сентября 2026 г., https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5
  4. «Claude Opus 5.5 migration guide», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/models/opus-5-5/migration-guide
  5. «Claude Fable 5.1 migration guide», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/models/fable-5-1/migration-guide
  6. «Claude Sonnet 5.5 migration guide», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide
  7. «API release notes», Anthropic, обновлено 30 октября 2026 г., https://platform.claude.com/docs/en/release-notes/overview
  8. «Strict tool use», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use
  9. «Structured outputs», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/structured-outputs
  10. «Define tools», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools
  11. «Handle tool calls», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls
  12. «Tool use overview», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview
  13. «How tool use works», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works
  14. «Troubleshooting tool use», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/troubleshooting-tool-use
  15. «Parallel tool use», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use
  16. «Tool runner», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner
  17. «Tool search tool», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool
  18. «Programmatic tool calling», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling
  19. «Batch processing», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/batch-processing
  20. «Create a Message Batch (API reference)», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/api/messages/batches/create
  21. «Pricing», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/about-claude/pricing
  22. «Prompt caching», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/prompt-caching
  23. «Token counting», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/token-counting
  24. «Rate limits», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/api/rate-limits
  25. «Errors», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/api/errors
  26. «Models overview», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/models/overview
  27. «Claude Haiku 5.5 overview», Anthropic, 7 октября 2026 г., https://platform.claude.com/docs/en/models/haiku-5-5/overview
  28. «Claude Opus 5.5 overview», Anthropic, 22 сентября 2026 г., https://platform.claude.com/docs/en/models/opus-5-5/overview
  29. «Claude Mythos 5.1 overview», Anthropic, 1 сентября 2026 г., https://platform.claude.com/docs/en/models/mythos-5-1/overview
  30. «Effort», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/effort
  31. «Streaming», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/streaming
  32. «Refusals and fallback», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback
  33. «Citations», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/build-with-claude/citations
  34. «MCP connector», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/mcp-connector
  35. «Remote MCP servers», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/agents-and-tools/remote-mcp-servers
  36. «Migrating to API version 2026-10-21», Anthropic, 21 октября 2026 г., https://platform.claude.com/docs/en/api/migration-2026-10-21
  37. «API and data retention», Anthropic, дата обращения: 1 ноября 2026 г., https://platform.claude.com/docs/en/manage-claude/api-and-data-retention
  38. «Model Context Protocol specification 2025-11-25: Tools», MCP, https://modelcontextprotocol.io/specification/2025-11-25/server/tools
  39. «JSON Schema Validation», draft 2020-12, JSON Schema, https://json-schema.org/draft/2020-12/json-schema-validation
  40. «JSONSchemaBench», Geng et al., arXiv 2501.10868, 2025, https://arxiv.org/abs/2501.10868
  41. «Ratings, reviews, and responses», Apple Developer, дата обращения: 1 ноября 2026 г., https://developer.apple.com/app-store/ratings-and-reviews/
  42. «EveryInfra data catalog (GET /api/v1/social/catalog)», EveryInfra, дата обращения: 1 ноября 2026 г., 00:46 SGT, https://api.everyinfra.com/api/v1/social/catalog

Справка BL-60