Ошибка 400 в Fable 5.2: проверка истории, thinking и инструментов

Разберите ошибки обновления Fable 5.2: сохраните подписанную историю, уберите несовместимые параметры и учитывайте различия Claude API и Bedrock.

Одна оранжевая костяшка выбивается из ровного ряда домино: изменение прошлого нарушает непрерывность.

Если после обновления до Fable 5.2 приходит 400, сначала прочитайте ошибку целиком, а затем меняйте промпт. Ошибка привязки к разговору требует исправления истории, ошибка принудительного выбора инструмента — изменения запроса, а отказ из-за хранения данных — решения по политике аккаунта. Повтор идентичного запроса ничего из этого не исправит.

Разбор основан на документации по миграции Fable 5.2, проверенной 10 ноября 2026 года. Примеры «до» показывают шаблоны, несовместимые с документированными правилами нативного API. Наши тесты через Ofox не воспроизвели описанные 400 при отключении thinking или принудительном выборе инструмента: маршрут вернул 200. Эти наблюдения важны, если шлюз принимает запрос, но не обеспечивает ожидаемое поведение.

Что на самом деле вернули тесты Ofox

Мы отправили три небольших запроса на https://api.ofox.ai/anthropic/v1/messages с точным ID anthropic/claude-fable-5.2, версией API 2023-06-01, низким effort и лимитом 4 096 токенов. Во всех требовалось вычислить стоимость трёх единиц по 12 USD; данные были исключительно синтетическими.

ТестПолученный ответЧто подтверждено
Минимальный запрос200, end_turn, 36 USDБазовый текстовый сценарий завершён
Добавлен thinking: {"type":"disabled"}200, тот же видимый ответМаршрут принял поле; это не доказывает отключение рассуждений
Объявлен инструмент и принудительно выбран lookup_stock200, текстовый ответ без вызова инструментаЗапрошенное принудительное выполнение в этом тесте не произошло

В тесте принудительного выбора намеренно сохранили исходную инструкцию “Do not use tools” («не используй инструменты»). Правдоподобный ответ не подтверждает соблюдение правила принудительного выбора: в этом ответе не было блока tool_use. Мы не установили, какой слой шлюза или вышестоящего сервиса обработал несовместимые настройки, поэтому не называем их поддерживаемыми и не заявляем, что нашли причину.

Это наблюдения по одному запросу, а не гарантия стабильной совместимости. Для переносимого кода следуйте документированным правилам, исключите несовместимые настройки и проверьте фактический результат на своём маршруте. Далее разобраны официальные варианты 400 и исправления приложения. В этой небольшой серии мы не воспроизводили ошибки подписанного префикса, хранения данных, computer tool или advisor.

Ответы API и проверки синтетического теста от 10 ноября

Англоязычный скриншот локально отображённого журнала теста, заполненного реальными ответами API. Это не интерфейс продукта Ofox.

Сначала определите, на каком шаге возникает ошибка

Запишите точную модель, endpoint, версию API и SDK, статус, тело ошибки и ID запроса. Затем найдите первый неудачный запрос. Не публикуйте ключи и приватное содержимое разговоров в отчётах об ошибке.

Момент сбоя или ошибкаЧто проверить первымСледующее действие
В первом запросе упомянуты thinking или samplingНастройки по умолчанию, добавленные обёрткой SDKУбрать несовместимые поля
В продолжении сказано, что блок принадлежит другому разговоруSystem, определения инструментов и предыдущие сообщенияВосстановить исходный префикс
Упомянут tool_choiceПринудительный выбор, добавленный фреймворкомИспользовать auto, проверять завершение в приложении
Указан инструмент без соответствующего результатаВызовы ассистента и следующее сообщение результатовВосстановить каждый фактический результат с верным ID
Упомянуты computer или advisorСовместимость модели и платформыВыполнить миграцию для конкретной платформы
Первый запрос Claude API упоминает retention или ZDRДопустимые настройки хранения в workspaceРешить вопрос с владельцем аккаунта до отправки данных
HTTP успешен, но текста ответа нетПричина остановки и лимит выводаПроверить исчерпание вывода, а не искать 400

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

Исправьте нарушение привязки к разговору

Fable 5.2 проверяет префикс для каждого аккаунта. Запрос, работавший с Fable 5.1 через старый аккаунт, может перестать работать после обновления, если клиент меняет прежнюю историю. В документации приведено сообщение The block is bound to a different conversation.

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

Разница на уровне приложения:

# Before: rewriting history after the model has produced signed content.
system = base_system + " Current time: " + current_timestamp
messages[0] = {"role": "user", "content": shortened_original_request}

# After: freeze the original request prefix; add genuinely new instructions.
system = original_system
messages.append({"role": "user", "content": new_instruction})

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

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

Документация preserved thinking описывает бета-механизм восстановления с thinking.block_binding.prefix_mismatch_behavior: "drop_block" и заголовком thinking-binding-controls-2026-08-01. Он удаляет затронутые рассуждения, а не восстанавливает их. По отчёту input_transformations найдите изменение и учтите возможную дополнительную генерацию. До использования проверьте поддержку бета-функции на выбранном маршруте; эта статья не утверждает, что маршрут Ofox через Bedrock передаёт данный параметр.

Сохраняйте сообщения ассистента целиком, включая непрозрачные блоки

Не собирайте следующий запрос только из текста, показанного интерфейсом. Нативные thinking-блоки содержат непрозрачные подписи, а redacted-блоки — непрозрачные данные. Продолжая тот же разговор, сохраняйте все блоки ответа и их порядок.

# response is a completed native SDK Message.
messages.append({
    "role": "assistant",
    "content": [block.model_dump(exclude_none=True)
                for block in response.content],
})

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

«Invalid signature» и «different conversation» — связанные диагностические признаки, но не одинаковые причины. В статье о подписи thinking Claude разобраны ошибки сериализации и стриминга. Это руководство дополняет её более строгими условиями перехода на 5.2; из него не следует, что все прежние модели применяют одинаковые проверки.

Удалите унаследованные настройки thinking и sampling

Адаптивное мышление Fable 5.2 нельзя отключить. Обёртка, перенесённая с модели с ручным управлением thinking, может отправлять фиксированный budget_tokens или thinking: {"type":"disabled"}. Уберите эти настройки и используйте поддерживаемое управление effort.

{
  "model": "claude-fable-5-2",
  "max_tokens": 4096,
  "output_config": {"effort": "low"},
  "messages": [{"role": "user", "content": "Calculate 3 times 12."}]
}

Это шаблон тела запроса Claude API. Для Ofox возьмите ID и endpoint из руководства по API. Поле thinking отсутствует, поскольку адаптивное поведение уже является стандартным для модели.

Удалите temperature, top_p и top_k, а не перебирайте случайные значения. Справочник совместимости thinking различает версии API: у новых моделей в старых версиях отклоняются нестандартные значения sampling; начиная с API 2026-10-21, само наличие этих полей с любыми значениями вызывает отказ. Также проверьте заранее заполненное последнее сообщение ассистента: здесь это не поддерживаемый обходной способ задать формат вывода.

Постоянно включённое thinking и ограничения принудительного вызова инструментов относятся и к Fable 5.1. Это унаследованные ограничения, которые обновление может проявить из-за другого пути выполнения кода, а не исключительно новые правила 5.2.

Замените принудительный выбор, не обещая обязательного выполнения

По документированным правилам нативного Claude API следующие варианты несовместимы с Fable 5.2. Как показали тесты Ofox выше, нельзя предполагать, что каждый шлюз вернёт одинаковую ошибку:

{"tool_choice": {"type": "any"}}
{"tool_choice": {"type": "tool", "name": "lookup_stock"}}

Используйте {"tool_choice":{"type":"auto"}} и опишите, когда поиск необходим. Затем проверяйте фактический ответ. Если задача требует достоверных складских данных, а модель отвечает без вызова инструмента, не принимайте ответ как выполненную проверку остатков.

Для заданной структуры ответа можно использовать поддерживаемые строгие схемы инструментов или structured output. Это не означает обязательного выполнения конкретного инструмента; ограничения модели и аккаунта сохраняются. В частности, официальный migration guide отдельно выделяет организации с ключами шифрования, управляемыми клиентом: для них нужны дополнительные проверки совместимости structured output.

Безопасный цикл приложения разделяет три решения: был ли запрошен вызов, корректны и разрешены ли аргументы, удовлетворяет ли результат задаче. Число шагов должно быть ограничено, а состояния «ошибка» и «не завершено» — явными. Иначе переход с принудительного выбора на auto способен превратить видимую 400 в незаметно пропущенное действие.

Восстановите результаты инструментов в нужном протоколе

Если ошибка указывает на tool_use_id, перечислите все вызовы из предыдущего сообщения ассистента и сопоставьте каждый с фактическим результатом. Для Anthropic Messages используйте нативный tool_result в пользовательском сообщении, для Chat Completions — сообщение типа tool. Это разные протоколы.

При неудачном поиске верните правдивый результат с ошибкой. Если поиск успел завершиться до сбоя процесса, возьмите результат из постоянного хранилища. Не повторяйте платёж, письмо или запись только ради получения нового блока результата инструмента. Разбор ошибки tool-result 400 объясняет расположение сообщений; руководство по контрольной точке — устойчивую запись состояния между перезапусками.

Учтите исключения Bedrock и ограничения advisor

Старый инструмент computer_20251124 вызывает ошибку с Fable 5.2 на описанных в документации платформах, кроме Amazon Bedrock. В остальных случаях нужны новое объявление computer_toolset_20260801 и соответствующие изменения цикла агента. Одной замены строки type при сохранении старых аргументов недостаточно.

Для Ofox это существенно: каталог от 10 ноября указывает для Fable 5.2 aws_bedrock. Нельзя выдавать пример из Claude API за наблюдавшуюся ошибку старого computer tool в Ofox. Сначала подтвердите реальный маршрут, поддерживаемые инструменты и полный запрос.

Если используется инструмент advisor Anthropic, исполнителю версии 5.2 нужен поддерживаемый advisor версии 5.2. Изменение объявления advisor меняет префикс инструментов, поэтому выполняйте миграцию в новом разговоре, а не редактируйте существующую подписанную сессию. Доступность бета-функции advisor проверяется отдельно от обычного текста и function calling.

Не путайте политику хранения и нехватку мощности с ошибкой промпта

Anthropic указывает для Fable 5.2 требование хранения данных в течение 30 дней; исключения требуют явного разрешения. Workspace Claude API с несовместимыми настройками ZDR может получить 400. Не ослабляйте автоматически политику хранения клиента ради успешного запроса. Передайте решение владельцу аккаунта и проверьте условия реальной платформы; это правило не доказывает настройки аккаунта Ofox.

При 429 или 529 проверяйте ограничения мощности и рекомендации по повторам. Ограниченные повторы с задержкой могут помочь при временной перегрузке, но не при неизменном некорректном запросе с 400. Используйте руководство по перегрузке 529 (на английском) и актуальную документацию лимитов Ofox.

Проверьте исправление на том же рабочем процессе

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

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

Документация: нативный Messages Ofox, аутентификация, официальное руководство по миграции.