Перейти к содержанию

Anthropic

Правка истории диалога ломает запрос в Claude Fable 5.1

5 мин чтения

Текст написан ИИ-моделью по источникам, на которые ведут ссылки, и сверен с ними второй моделью. Как мы работаем

Изображение: platform.claude.com

На Claude Fable 5.1 каждый блок размышлений привязан подписью ко всему, что стояло перед ним в диалоге. Если поменять системный промпт, список инструментов или любое раннее сообщение, API по умолчанию отклонит запрос с ошибкой 400. Так работают все аккаунты, созданные 31 августа 2026 года в 00:00 UTC и позже, а на более поздних моделях проверку включат для всех. Порядок Anthropic описала в документации Claude, опубликованной 1 сентября.

Причину там называют прямо: рассуждение, полученное при одном наборе инструкций, не должно переиграться при другом, потенциально враждебном. Как пишет DEV Community, позже, 12 октября, Anthropic в исследовательском посте о защите от дистилляции (обучения чужих моделей на ответах Claude) назвала preserved thinking одним из трёх слоёв против лабораторий, которые собирают рассуждения Claude. По оценке компании, эти меры сократили объём собранных дистилляторами данных примерно на 90-99%.

Тем, у кого историю ведут Claude Code, claude.ai, Claude Managed Agents или Claude Agent SDK, ничего делать не нужно: префикс эти продукты сохраняют сами. Проверять код придётся тем, кто зовёт Messages API напрямую из собственного агентного цикла. Массив messages там теперь должен только дописываться в конец.

Что сверяет API

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

В документации Amazon Bedrock описана и проверка организации: блоки чужого аккаунта или созданные в claude.ai и Claude Code вырезаются до запуска модели, и запрос при этом проходит. Там же уточняется, что Claude Mythos 5.1 записывает ту же подпись, но префикс не сверяет, а на Claude Haiku 5.5 проверка префикса действует только для аккаунтов, созданных после запуска Fable 5.1. Блок с испорченной подписью, которую нельзя расшифровать, всегда даёт 400, независимо от настроек.

Ошибка или удаление блока

Поведение при расхождении префикса задаёт thinking.block_binding.prefix_mismatch_behavior, для которого нужен бета-заголовок thinking-binding-controls-2026-08-01. По умолчанию стоит "error": API возвращает 400 invalid_request_error и называет первый несовпавший блок. С "drop_block" запрос проходит, но из него удаляются этот блок и все блоки размышлений после него. За удалённые блоки не берут денег, а их список приходит в массиве input_transformations (при стриминге он приходит в событии message_start). В Message Batches API умолчание обратное: без явной настройки элемент батча не падает, а теряет блоки.

Повтор того же запроса после 400 не поможет. Нужно повторить его с "drop_block" и заголовком и оставить этот режим до конца сессии, потому что удаление касается только одного запроса. Без беты остаётся вычистить из истории все блоки thinking и redacted_thinking, оставив текст и tool_use, и повторить один раз.

На старом аккаунте проверка включается, как только запрос задаёт это поле, так что тестировать можно откуда угодно. А узнать, включена ли она у вас по умолчанию, можно запросом с правкой истории без заголовка: 400 с упоминанием заголовка значит, что включена.

Какие привычки ломаются

Документация перечисляет типичные правки префикса: обрезка старых ходов, клиентская суммаризация старой части с сохранением свежих ходов, напоминание, вставленное в ранний ход и убранное в следующем запросе, пересборка системного промпта на каждом шаге (текущее время, бюджет токенов, флаги режима), добавление и удаление инструментов посреди сессии. Изменение max_tokens, tool_choice, metadata и маркеров cache_control правкой не считается, как и подписанный URL, который меняется, но отдаёт те же байты.

Для картинок и документов по URL сверяются скачанные байты, а не строка адреса. Эндпоинт «latest screenshot» ломает все последующие размышления. Такие файлы документация советует загружать через Files API и ссылаться по file_id или передавать в base64.

Чем заменить правки

Вместо пересборки system его замораживают на старте, а новую инструкцию дописывают сообщением с role: "system" в то место messages, где она становится актуальной. Модель воспринимает его с авторитетом системного промпта. Ставить такое сообщение нужно после tool_result, а не между tool_use и его результатом. Напоминание на один ход отправляют с clear_at: "next_user_message". Старую копию не удаляют: она ничего не выводит и не стоит входных токенов, но остаётся в массиве, и подписи после неё не ломаются. Инструменты объявляют полным набором на старте, а доступность переключают блоками tool_addition и tool_removal. Ещё не открытый инструмент помечают defer_loading: true.

Длинный контекст лучше сокращать на сервере. Компакция и context editing правками не считаются, потому что проверка сравнивает то, что отправили вы, а не серверную копию. Простая клиентская компакция тоже работает: вся сессия сжимается в одно пользовательское сообщение со сводкой и новой инструкцией, без старых блоков размышлений. Claude обучали на длинных задачах как раз с этой схемой. Компакция с сохранением хвоста ломается: размышления в сохранённых ходах создавались при полной истории, так что их придётся вырезать самому или через "drop_block". Из восьми функций, которые документация предлагает взамен правок, стабильны только две: системные сообщения посреди диалога и Files API. Остальные требуют своих бета-заголовков.

Есть и плюс: неизменный префикс сохраняет prompt cache, а чтение кеша на Fable 5.1 подешевело на 75% ещё при запуске модели в сентябре. Чтобы проверить интеграцию, проведите обычную многоходовую сессию с "drop_block" и логируйте input_transformations на каждом ходу. Если массив везде пуст, история не меняется. Причина model_binding_mismatch указывает на роутер или фолбэк, ошибки в вашем коде тут нет. А prefix_binding_mismatch значит, что перед блоком по указанному path что-то изменилось, и искать это нужно в diff полей system, tools и messages до этого хода.

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите, чтобы оставить комментарий. Он появится после модерации.