anthropic
Правка истории диалога ломает запрос в Claude Fable 5.1
Claude News
anthropicНа Claude Fable 5.1 правка уже отправленной истории диалога стала ошибкой: API сверяет подпись сохранённого блока размышлений и отклоняет запрос с кодом 400, если изменились системный промпт, список инструментов или любое из более ранних сообщений. Подпись подтверждает, что предшествующая часть диалога не менялась и что текущая модель способна прочитать блок, сказано в документации Claude.
Коротко
- Ограничение затрагивает тех, кто обращается к Messages API из собственного агентного цикла: массив messages должен оставаться строго дополняемым, иначе подписи сохранённых блоков размышлений перестают сходиться и запрос завершается ошибкой.
- По умолчанию проверка включена для аккаунтов, созданных 31 августа 2026 года в 00:00 UTC и позже, одинаково в Claude API и на облачных платформах; на более поздних моделях её включат для всех.
- Режим prefix_mismatch_behavior: "drop_block" с бета-заголовком thinking-binding-controls-2026-08-01 удаляет несовпавший блок и все блоки размышлений после него в диалоге; запрос при этом проходит, удалённые блоки не тарифицируются и перечисляются в массиве input_transformations в ответе.
Ограничение переносит работу с историей диалога из клиента в API: собственные циклы, построенные на переписывании массива messages, придётся переделывать и переводить на серверные механизмы. Судя по формулировкам документации, запас времени невелик: на Claude Fable 5.1 проверка касается только новых аккаунтов, но на следующих моделях она станет обязательной для всех. Побочный эффект выглядит выгодным: неизменные байты перед блоком держат префикс стабильным для кеширования промпта.
Подпись блока проверяется по трём условиям сразу
API проверяет, что модель та же или более новая, что всё до блока не изменилось (верхнеуровневый system, набор tools и каждое предшествующее сообщение) и что цепочка более ранних блоков размышлений не прервана. Ограничение введено, чтобы рассуждение, выработанное под одним набором инструкций, нельзя было воспроизвести под другим, потенциально враждебным.
При серверной компакции проверяемый префикс начинается с последнего блока компакции. Блоки размышлений можно удалять с начала истории, но удаление из середины лишает силы все блоки после него. Блок, не прошедший проверку модели, удаляется всегда: диалог, перешедший на более новую модель, сохраняет рассуждения, на более старой они теряются для этого запроса.
Правкой не считаются изменение параметров запроса вне system, tools и messages, перестановка или удаление меток cache_control, ротация подписанного URL, отдающего те же байты, а также серверная компакция и контекстное редактирование, поскольку сверяется отправленное клиентом. Правкой считаются добавление текстового блока в ранний пользовательский ход и переименование инструмента.
Официальные продукты Claude сохраняют префикс без участия разработчика
Claude Code, claude.ai, Claude Managed Agents и Claude Agent SDK ведут историю сами и префикс не ломают. Проверять код нужно тем, кто обращается к Messages API напрямую: массив messages должен быть строго дополняемым, а ответы модели возвращаться обратно ровно в том виде, в каком пришли, со всеми типами блоков.
Префикс ломают пять распространённых приёмов: обрезка старых ходов, клиентская суммаризация с сохранением свежих ходов, вставка напоминания в ранний ход с удалением на следующем запросе, пересборка системного промпта под каждый запрос и добавление или удаление записей в tools посреди сессии.
Проверить интеграцию документация предлагает так: снять точные тела запросов за несколько ходов и сравнить system, tools и общую часть messages на побайтовое совпадение, а затем прогнать многоходовую сессию с prefix_mismatch_behavior: "drop_block" на claude-fable-5-1 и логировать input_transformations. Значение reason: "prefix_binding_mismatch" указывает на правку префикса, "model_binding_mismatch" на смену модели маршрутизатором. Поле работает с любого аккаунта, так как его установка сама включает проверку.
Изменение инструкций и инструментов переносится внутрь messages
Если код каждый раз пересобирает верхнеуровневый system (текущее время, бюджет токенов, флаг режима), проверку не проходит ни один блок размышлений в диалоге. Вместо этого system фиксируется на старте сессии, а новые инструкции добавляются сообщением с role: "system" в том месте messages, где они вступают в силу. На Claude Fable 5.1 бета-заголовок для этого не нужен.
Ежеходовые напоминания оформляются как ходовые системные сообщения с clear_at: "next_user_message" (заголовок mid-conversation-system-clear-at-2026-08-21): очищенное сообщение остаётся в массиве, ничего не отображает и не стоит входных токенов, поэтому размышления следующего хода сохраняют силу. Без беты напоминание добавляется текстовым блоком после блоков tool_result, а прежние копии остаются на месте.
Набор инструментов объявляется целиком на старте, изменения передаются блоками tool_addition и tool_removal (mid-conversation-tool-changes-2026-07-01), а недоступный пока инструмент помечается defer_loading: true. Обрезка контекста переносится на сервер: компакция с собственным промптом в параметре instructions и контекстное редактирование правилами clear_tool_uses_20250919 и clear_thinking_20251015. Файлы, используемые в нескольких ходах, отдаются через file_id или base64.
Что делать после ошибки 400
Повторная отправка того же запроса ошибку не снимает: нужно повторить его с prefix_mismatch_behavior: "drop_block" и бета-заголовком, причём настройка действует только на один запрос, поэтому передавать её придётся до конца сессии. Без беты остаётся вырезать из истории все блоки thinking и redacted_thinking, сохранив text и tool_use. В Message Batches API незаданное значение по умолчанию удаляет несовпавшие блоки, а не завершает элемент пакета ошибкой.
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
Из Google мы используем только имя и аватар. Почту не сохраняем.
