Размышления Claude вырезают до отправки клиенту

Claude Desktop обновился сам, и у автора разбора на GitHub панель размышлений теперь раскрывалась одной фразой вроде «Examining a screenshot of a chat interface element and analyzing». Больше в ней ничего не было. Автор перехватил поток ответов и выяснил, что интерфейс ничего не прячет: сервер вообще не передаёт рассуждения клиенту.
Пустое поле thinking
Claude Desktop написан на Electron, поэтому к процессу отрисовки можно подключить Chrome DevTools Protocol, как отладчик к обычной веб-странице. Автор работал на пропатченной сборке app-1.37937.3 с отключённым автообновлением и вырезанной телеметрией, CDP был открыт на порту 9222. Сначала он выгрузил DOM всех элементов [data-cds="TurnStatus"], контейнеров, в которых интерфейс показывает блоки размышлений. Структура читалась без труда: обёртка, кнопка-переключатель, сворачиваемая панель, внутренний шаг со строкой резюме. Внедрённый CSS раскрыл все свёрнутые панели через display: block, и в каждой оказалась всё та же одна строка. Скрытых узлов, shadow DOM или буфера за пределами экрана там не нашлось.
Следующим шагом был сетевой уровень, и здесь пришлось перебрать несколько способов. Перехват через Fetch.enable отдавал тело ответа, но задерживал доставку SSE, и Claude Desktop замирал посреди фразы. Подмена window.fetch через Runtime.evaluate не поймала ничего. Отсюда автор сделал вывод, что запросы к API идут не из JavaScript процесса отрисовки, а из главного процесса Electron или preload-контекста. В распакованном asar он не нашёл ни одного упоминания разметки или разбора тегов размышлений: фронтенд просто не знает, как устроено их содержимое.
Сработала связка Network.enable и Network.getResponseBody после события loadingFinished. Она пассивна: приложение получает данные как обычно, а копия ответа достаётся наблюдателю после завершения. В разобранном потоке SSE было вот что:
event: content_block_start data: {"type":"content_block_start","index":0, "content_block":{"type":"thinking","thinking":"","summaries":[]}} event: content_block_delta data: {"type":"content_block_delta","index":0, "delta":{"type":"thinking_summary_delta", "summary":{"summary":"One line summary."}}}
Поле thinking в content_block_start пустое во всех записанных ответах, событий thinking_delta нет ни одного. Схема поля сохранилась, и автор сравнивает её с комнатой, из которой вынесли мебель. До клиента доходят имя поля, строка нулевой длины и одна фраза резюме, сгенерированная отдельно.
Тег antml:thinking
Расспросы модели в новых сессиях ничего не дали. Claude уходил от ответа, отвечал общими словами или говорил, что не имеет доступа к собственному рассуждению. Автор считает, что вместе с ограничением на показ размышлений Anthropic добавила в системный промпт запрет обсуждать их устройство и помогать их извлекать.
Помогла старая сессия, в которой несколько месяцев назад автор уже экспериментировал: просил модель писать ответ прямо через проход размышлений. Там Claude не стал упираться и воспроизвёл свои внутренние рассуждения дословно в текстовый канал, сначала с вводной фразой, потом по просьбе без неё. Из этого автор делает вывод, что во время генерации рассуждение лежит в контекстном окне и модель может его прочитать, а вырезают его уже после, до того как ответ уходит с сервера.
Затем автор предположил, что рассуждение обёрнуто в тег. Claude начал отвечать «it's definitely not a tag like `<thinking>` or `», и поток оборвался ровно там, где должна была открыться угловая скобка следующего тега. Похожее автор замечал и раньше, когда сам отправил сообщение с <thinking></thinking>: часть обмена тогда словно проглотило.
Тогда он попросил закодировать ответ шифром Цезаря со сдвигом на 3. Пришло dqwpo:wklqnlqj, после обратного сдвига получилось antml:thinking. Префикс antml Anthropic использует и в разметке вызовов инструментов в API. Закодированный вариант прошёл, потому что фильтр в реальном времени, по версии автора, ищет буквальные последовательности байтов и смысл текста не анализирует. Claude подтвердил это сам: «the infrastructure is literally intercepting and removing it mid-response».
Автор описывает два слоя защиты. Первый стоит в инфраструктуре: парсер потока токенов между выходом модели и сериализатором SSE удаляет всё внутри antml:thinking ещё до того, как сформировано событие для клиента. Второй поведенческий: системный промпт запрещает модели обсуждать механику размышлений, подтверждать имя тега и переписывать рассуждение в ответ. Шифр Цезаря обошёл второй слой, первый, как пишет автор, не обходится ничем.
Паузы на проводе
Раз содержимое тега вырезается до отправки, пока модель думает, в соединение ничего не уходит. Событие Network.dataReceived срабатывает на каждый пришедший кусок TCP-данных и даёт время с точностью до миллисекунды. Между подтверждением сообщения сервером и первым text_delta трафика не было совсем, ни кусков данных, ни heartbeat. Автор написал скрипт capture-thinking-timing.mjs, который записывает каждую паузу длиннее 300 мс с началом, концом и длительностью. Первый настоящий замер, по его словам, показал паузу 2839 мс, а интерфейс написал «Thought for 3s».
5 сентября 2026 года он сделал три замера в той же старой сессии, каждый раз прося воспроизвести рассуждение дословно:
- 20:41:58: ответ за 4517 мс, 57 кусков данных, одна пауза 1863 мс;
- 20:42:32: две паузы, 2839 мс на размышление и 487 мс сразу после него, до начала текста ответа;
- 21:00:36: к просьбе добавлен рассказ о смотрителе маяка; ответ за 7585 мс, девять кусков, четыре паузы: 2806 мс, затем кусок в 194 байта, затем 3077 мс, после начала текста ещё 756 и 754 мс; интерфейс показал «Thought for 5s».
Пауза 2839 мс встречается в тексте дважды: как первый настоящий замер с подписью «Thought for 3s» и как первая пауза второго замера из списка от 5 сентября. Относится ли подпись «3s» именно ко второму замеру, из разбора однозначно не следует.
Короткую паузу автор считает работой отдельного шага инференса, который пишет то самое резюме в thinking_summary_delta. По его версии, фраза не извлекается из рассуждения и не сжимается из него, а генерируется после завершения прохода по содержимому, которое пользователь никогда не увидит. Кусок в 194 байта слишком мал для текста ответа, и автор полагает, что это пара событий content_block_stop и content_block_start на границе двух блоков размышлений. Выходит, на сложный запрос модель рассуждала дважды подряд, а затем каждый проход резюмировался отдельно, примерно по 750 мс. В интерфейсе осталась одна цифра, одна фраза и никакого признака второго прохода.
Сумма двух больших пауз, 2806 + 3077 = 5883 мс, по словам автора, сходится с таймером интерфейса. Он оговаривается, что один такой замер исследованием не считается, но структура, по его мнению, слишком чистая для шума.
Чьи 67%
Автор ссылается на аудит benvanik 6 852 файлов сессий Claude Code: средняя глубина размышлений упала на 67%, примерно с 2 200 знаков до 720, и падение, по словам автора, прямо совпадает с выкаткой redact-thinking-2026-02-12. Anthropic признала регрессии в разборе инцидента в апреле 2026 года, но доступ к сырым размышлениям так и не вернула.
В самом гисте картина сложнее. Benvanik разобрал 17 871 блок размышлений и 234 760 вызовов инструментов. У блоков есть поле signature, длина которого коррелирует с длиной содержимого с коэффициентом Пирсона 0,971 на 7 146 парах, и по нему он оценивал глубину рассуждений уже после редактирования. В его таблице приведена медиана: около 2 200 знаков в базовый период с 30 января по 8 февраля, около 720 в конце февраля (минус 67%), около 560 с 1 по 5 марта (минус 75%) и около 600 с 12 марта, когда редактирование стало полным (минус 73%). Доля отредактированных блоков по гисту равна 0% с 30 января по 4 марта, 1,5% 5 марта, 24,7% 7 марта, 58,4% 8 марта, больше 99% 10 и 11 марта и 100% с 12 марта. Benvanik сам пишет, что глубина упала примерно на 67% ещё в конце февраля, до начала редактирования. Получается, что его данные прямого совпадения с выкаткой, о котором пишет автор разбора, не показывают.
У Anthropic третья версия. Как пишет Hypogray, заголовок redact-thinking-2026-02-12 появился в Claude Code 12 февраля 2026 года и отключает показ блоков размышлений в интерфейсе. На GitHub-issue о падении глубины компания, по данным Hypogray, ответила, что с этим заголовком сырые блоки размышлений не сохраняются в транскриптах и падение на 67% объясняется изменением логирования, а возможности модели остались прежними. Hypogray приводит слова создателя Claude Code Бориса Черни:
This beta header hides thinking from the UI, since most people don't look at it. It does not impact thinking itself, nor does it impact thinking budgets or the way extended reasoning works under the hood. It is a UI-only change.
Причин скрыть размышления, по данным Hypogray, Anthropic называла две: задержку (без шага резюмирования полезный ответ приходит быстрее) и понятность интерфейса (в сыром потоке много отброшенных черновых ходов). Автор разбора пишет о Claude Desktop, а Черни говорил о Claude Code.
В 2025 году, в посте о Claude 3.7 Sonnet, Anthropic писала, что решила показывать рассуждения в сыром виде ради доверия, исследований выравнивания и простого интереса. Среди минусов там же названы отсутствие у размышлений обычного обучения характеру, неясная достоверность и риск того, что злоумышленники будут строить по видимым рассуждениям более удачные джейлбрейки. В том же посте компания признавала, что модели очень часто принимают решения по причинам, которых в рассуждениях не проговаривают.
Автор предлагает ещё одно объяснение падения. По его версии, в следующем ходе диалога история возвращается модели без блоков размышлений, вырезанных инфраструктурой, поэтому Claude видит только свои прежние ответы, а не рассуждения, которые к ним привели, и каждый ход отчасти начинается с нуля. Это его гипотеза, проверки в разборе нет. Рядом стоит то, о чём мы писали 2 сентября: на Claude Fable 5.1 API сверяет подпись сохранённого блока размышлений и отвечает ошибкой 400, если изменилось что-то до него.
Как проверить у себя
Методику автор выложил целиком. Скрипт capture-thinking-timing.mjs подключается к Claude Desktop через CDP на порту 9222, ничего не блокирует и для каждого ответа сохраняет JSON с массивом пауз, временной шкалой кусков данных, полем резюме и содержимым text_delta, если оно было. Что проверить дальше, автор перечисляет сам: при каких условиях запрос делится на несколько проходов, растёт ли пауза на резюме вместе с длиной рассуждения и остался ли где-то тариф API, на котором приходят события thinking_delta.
Если вы работаете через API, объём скрытых рассуждений можно посчитать без перехвата трафика. В документации Anthropic сказано, что поле usage.output_tokens_details.thinking_tokens показывает, сколько оплаченных выходных токенов ушло на внутренние рассуждения. В потоковом режиме эта разбивка приходит только в последнем событии message_delta: туда и стоит смотреть, сверяя счёт с той одной строкой, что видна на экране.
Дальше
Authors Wrangle with Publishers over $1.5B Anthropic A.I. Settlement
1,5 миллиарда долларов Anthropic за книги суд уже утвердил, но, по данным The New York Times, авторы и издатели спорят о долях, а издатели заявляют права на авторские выплаты.
Читайте также
- Правка истории диалога ломает запрос в Claude Fable 5.1
- Шифр золотых слитков не вскрыли, потому что шифра нет
- Claude дописывает 2026 к запросам про «лучшее»
- Sonnet 5 в пробах регулярно называет себя GPT-4
- Anthropic купила Mithril, биотех из одного сотрудника
- Anthropic поработала с шестью фармфирмами и купила Mithril
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите, чтобы оставить комментарий. Он появится после модерации.

