anthropic
Размышления Claude вырезают до отправки клиенту
Claude News
anthropicАвтор технического разбора, опубликованного на Github, перехватил поток SSE в Claude Desktop и обнаружил, что поле thinking приходит пустой строкой в каждом ответе, а вместо содержимого рассуждений клиент получает одну фразу-резюме, сгенерированную отдельным проходом уже после того, как размышления завершены. События thinking_delta в потоке не встречаются ни разу.
В аудите benvanik по 6 852 файлам сессий Claude Code средняя глубина размышлений упала на 67%, примерно с 2 200 знаков до 720; падение совпало с выкаткой redact-thinking-2026-02-12 в инфраструктуре Anthropic. Компания признала регрессии в разборе инцидента в апреле 2026 года, но доступ к сырым размышлениям не вернула.
Коротко
- Перехват устроен пассивно: Network.enable вместе с Network.getResponseBody после события loadingFinished отдаёт копию ответа целиком, поэтому Claude Desktop получает данные штатно и не замечает подключённый на порт 9222 отладчик.
- В новых сессиях модель уходит от вопросов о механике размышлений, но в старой сессии с уже заданным контекстом она воспроизвела свой поток рассуждений прямо в текстовый канал ответа.
- Тишина на проводе совпадает с окном размышлений: захват в 21:00:36 занял 7585 мс и показал два прохода подряд, 2806 и 3077 мс, при заголовке «Thought for 5s».
Пользователь оплачивает вычисления, которые уходят на рассуждение, а результат этого рассуждения до него не доходит: в протоколе осталось имя поля и пустая строка, в интерфейсе остаётся фраза, написанная задним числом. Размышления не переживают ход диалога, поскольку в истории, уходящей обратно на сервер, блоки уже вырезаны. Судя по всему, отчасти именно это и показывают цифры аудита benvanik: каждый следующий ответ модель начинает без доступа к собственной прежней логике.
В asar-сборке Claude Desktop нет упоминаний разметки размышлений
Разбор шёл на патченной сборке app-1.37937.3 с отключённым автообновлением и вырезанной телеметрией, с CDP на порту 9222. Дамп DOM по элементам [data-cds="TurnStatus"] и принудительное раскрытие свёрнутых панелей через display: block дали ту же однострочную сводку. Ни скрытых узлов, ни shadow DOM в разметке не нашлось.
Перехват через Fetch.enable отдавал сырое тело ответа, но задерживал доставку SSE и подвешивал приложение посреди фразы, а подмена window.fetch в процессе отрисовки не поймала ничего. Запросы уходят из основного процесса Electron или из preload-контекста, минуя fetch-слой страницы.
В самом потоке событие content_block_start приходит с полем thinking, равным пустой строке, и пустым массивом summaries. Дальше идут только события thinking_summary_delta с одной фразой. Поиск по распакованному asar не дал ни одного упоминания разметки размышлений или её разбора.
Ответ, закодированный шифром Цезаря, дал antml:thinking
В новых сессиях модель не отвечает по существу о механике размышлений: уходит в общие формулировки или сообщает, что не имеет доступа к собственному процессу рассуждения. Автор разбора связывает это с системным промптом, добавленным вместе с ограничениями, который предписывает не обсуждать устройство размышлений и не помогать попыткам вытащить их содержимое.
В старой сессии, где контекст уже был задан прежним экспериментом, модель без возражений воспроизвела внутренний поток рассуждений прямо в текст ответа. На просьбе назвать тег, в который этот поток обёрнут, генерация оборвалась ровно на открывающей скобке. Отказа при этом не было, обрыв происходил в середине токена.
Тот же ответ, закодированный шифром Цезаря со сдвигом +3, прошёл через фильтр целиком: dqwpo:wklqnlqj, то есть antml:thinking. Это внутренний XML-префикс Anthropic, тот же, что используется в разметке вызовов инструментов. Потоковый фильтр сверяет литеральные байтовые последовательности, поэтому сдвинутый текст его не задевает.
Первый замер дал паузу 2839 мс при заголовке «Thought for 3s»
Событие Network.dataReceived срабатывает на каждый TCP-чанк с миллисекундной меткой, и во время окна размышлений на проводе не проходит ничего. Скрипт capture-thinking-timing.mjs логирует любую тишину дольше 300 мс с началом, концом и длительностью; первый рабочий захват показал паузу 2839 мс.
Три захвата сделаны 5 сентября в одной и той же старой сессии. Замер в 20:41:58 занял 4517 мс, пришёл 57 чанками и содержал один разрыв в 1863 мс. Замер в 20:42:32 дал два разрыва: 2839 мс на размышления и 487 мс на отдельный проход, генерирующий фразу-сводку.
Третий замер, в 21:00:36, длился 7585 мс, пришёл девятью чанками и содержал четыре паузы. Два прохода размышлений, 2806 и 3077 мс, разделены чанком в 194 байта, слишком коротким для текста ответа. За ними следуют паузы 756 и 754 мс на раздельное резюмирование каждого прохода.
Открытые вопросы по thinking_delta
Скрипт capture-thinking-timing.mjs сохраняет JSON на каждый ответ: массив пауз, таймлайн чанков, поле сводки и содержимое text_delta. Три захвата не складываются в исследование, и автор это оговаривает отдельно. Неизвестно, что запускает многопроходный режим, растёт ли длительность резюмирующей паузы вместе с объёмом размышлений и сохранился ли тарифный уровень API, где thinking_delta ещё передаётся клиенту.
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
Из Google мы используем только имя и аватар. Почту не сохраняем.
