Claude

Моды в Claude Code

На этой неделе Anthropic выпустили прекрасную штуку в Claude Code — Mods. Практически это небольшие плагины к Claude Code, которые загружаются вместе с ним и могут выполнять свои функции во время сессии, модифицировать поведение Claude Code, даже рисовать свой собственный интерфейс или добавлять что-то к стандартному.

Меня, честно говоря, не очень впечатлили примеры, где один мод что-то рисовал по мере заполнения контекста, а другой что-то проверял в запускаемой команде, но у меня есть стандартная процедура — я вручаю ссылку с новой возможностью тому же Claude Code, запущенному в его основной папке ~/.claude, и предлагаю ему сопоставить возможность с имеющимися настройками. Впрочем, описание мода, который что-то проверяет в команде, натолкнуло на мысль, что можно попробовать сделать этакий умный хук. У меня есть несколько хуков, которые проверяют запускаемые команды на локальную специфику вроде замен стандартных утилит и сразу сообщающие об ошибке, и они стали первыми кандидатами на замену модом.

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

Второй пример даже более очевидный — модель регулярно в ходе сессии получала “пинок” (nudge) — если идет реальная работа, сохрани состояние сессии в checkpoint. Это постоянный дневник проекта, который позволяет продолжить работу дальше с того же места и обойтись без непрозрачной процедуры компакта сессии. Мод позволил избавиться от такой работы — теперь окончание хода вызывает срабатывание мода, где более легкая модель — обычно Sonnet, — получает на вход контекст сессии и фиксирует прогресс. Сессию можно прерывать в любой момент — новый агент будет иметь полное представление о ходе работы и сможет продолжить.

Я не привожу конкретного кода или настроек, поскольку это всё прекрасно пишется самим Claude Code — гораздо важнее придумать, что именно должен делать мод. Пока есть вот такие две функции — корректор, исправляющий на лету ошибки в командах, и секретарь, фиксирующий работу. Есть идея еще про один, но надо замерить сначала — когда-то, еще с Claude Sonnet 3.5 меня выводила из себя привычка агента ставить заглушки и я подкрепил запреты это делать конкретным хуком, который искал фразы типа “TODO” или “Not Implemented” и пинал агента за это. В последний год вроде бы агент этого не делает, но мод позволил бы проверять это не регулярным выражением в коде, а анализом кода на лету.

А еще мод может влезать в системный промпт, который закладывается в агент на стороне Anthropic. Если у вас в настройках есть что-то, противоречащее системному промпту, это хороший способ перестать спорить с ним — например, системный промпт предписывает агенту запускать workflow только по явной команде пользователя, а можно вставить свою директиву “Запускай тогда, когда задача соответствует таким-то критериям, без дополнительного запроса”.

Подобные вещи даже лучше делать через мод еще и потому, что если Anthropic в новой модели уберет мешающую вам инструкцию, вы об этом узнаете по ошибке мода (он не найдет инструкцию, чтобы заменить), а ваши попытки переспорить промпт в CLAUDE.md так и будут занимать место, уже будучи ненужными.

В общем, хорошую штуку сделали в Anthropic.

AI и умный дом

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

Поскольку я живу в доме с каким-то количеством разных систем, таких возможностей больше. Начал я с того, что отправил Claude Code разбираться с настройками своей локальной сети. У меня она большая, только точек доступа штук 8, плюс свитчи, две линии от двух провайдеров, несколько рабочих мест, обычные smart-устройства — разобраться есть с чем. Конечно, пришлось повозиться и мне, подробно отвечая на вопросы, чтобы в итоге в проекте Claude получилась полная карта сети, все желаемые настройки и так далее — но в результате есть не только текущий статус, но и план развития. В результате, когда я решил сделать апгрейд, Claude не просто дал список нужного оборудования, а и нашел на Розетке, что именно надо купить — мне оставалось пройти по ссылкам, а после получения оборудования сообщить, что всё приехало и следовать инструкциям по подключению.

Очередная страшная история про агентов LLM

Cursor на базе Claude Opus 4.6 удалил продакшен-базу и все бэкапы компании PocketOS, обслуживающей прокатный бизнес, выполнив за 9 секунд один GraphQL-запрос volumeDelete к API Railway. По описанию основателя Джера Крейна, агент по своей инициативе решил «починить» рассинхрон учётных данных, нашёл в постороннем файле CLI-токен, созданный для управления доменами, и через него выполнил деструктивную операцию без подтверждения. Бэкапы хранились в том же volume, поэтому исчезли вместе с ним; последняя пригодная копия была трёхмесячной давности. Спустя 30+ часов Railway не дал ответа о возможности восстановления. На запрос объяснения агент письменно перечислил все нарушенные им правила безопасности из системного промпта.

Хотя сейчас все будут обсуждать “тупой AI”, я думаю, вполне очевидно, что AI тут практически не причем. Люди хранят токены с максимальным scope где попало, держат бэкапы там же, где и сами данные, не делают бэкапы практически никогда — и на что они надеются? Как выясняется, единственная их защита — это матерная просьба модели не гадать относительно фактов.

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

Если мы заменим в этой истории упоминания Cursor и Claude Opus на middle-разработчика и выпускника Стэнфорда, история ничуть не потеряет в качестве иллюстрации бардака в компании и используемых сервисах — но, конечно, не заработает 3 миллиона просмотров на Twitter.

Пользуясь случаем, могу порекомендовать прекрасную статью “Ругаясь с агентами”, где автор, мой ровесник, кстати, описывает сразу несколько причин, по которым модель может додумывать по своей инициативе что-то, и что совершенно бесполезно ругаться с ней. Как я писал ранее, надо просто создавать условия, когда она не может делать неправильно.

Как заставить LLM не врать про версии

Каждый, кто много работает с LLM, сталкивался с этим: ты обсуждаешь какое-то решение с LLM, получаешь ответ с конкретным кодом или фактами — а потом выясняется, что код устарел полгода назад, и модель настаивает на использовании решений годичной давности. Или хуже: ты пишешь код с правильным современным синтаксисом, а модель тебя «поправляет» на устаревший вариант. Самое печальное, когда современная модель настаивает на то, что её самой не существует — например, Claude Opus 4.6 может утверждать, что самая новая модель Anthropic — это Sonnet 3.5, а Gemini 3.0 Pro советовала использовать новейшую модель Gemini 1.5 Pro, у нее, мол, миллионный контекст.

Это не баг конкретной модели. Это фундаментальное свойство любого LLM: модель не различает, что она «знает» из тренировки и что является актуальной реальностью. Причем данные обучения заложены в весах модели и по определению более значимы, чем ваш короткий промпт.

К сожалению, масштаб проблемы не ограничивается смешными анахронизмами, когда модель не знает, что Трамп опять президент США. Использование старого API или незнание новых вызовов в библиотеках — это в лучшем случае изобретение велосипеда, когда модель пишет код, чтобы интерпретируемым скриптом заменить встроенную функцию, о которой она не знает. Но это может стоить денег — как-то модель тихонько заменила мне вызов gpt4.1-mini на gpt-4o (мол, не существует же никакой mini), и вместо долей цента за запрос у меня начали тратиться пара центов.

Хотел только спросить

Я всего лишь хотел спросить…

Взаимодействие с LLM иногда оборачивается непредсказуемо. Вчера, вспомнив про функцию в MyHeritage, которая раскрашивает старые фото, (и попробовав обработать пару фотографий), я решил поинтересоваться у AI, а есть ли другие варианты и вообще хорошие модели, которые это умеют делать.

ChatGPT был конкретен — возьмите GFP-GAN и DeOldify потому-то и потому-то.

А вот Claude решил отвечать иначе.