В каждом программном проекте наступает момент, когда понимаешь, что строил не то. Ты потратил недели на написание маршрутизатора сообщений, движка выполнения инструментов, менеджера состояния разговоров и системы повторных попыток — а потом обнаруживаешь, что AI-провайдер уже всё это делает, лучше тебя, одним вызовом API.
Именно этот момент привёл к архитектуре NanoClaw. Всё ядро — часть, которая превращает сообщение WhatsApp в ответ AI-агента с использованием инструментов, веб-браузингом, доступом к файлам и многоходовым диалогом — это примерно 500 строк TypeScript. Не 500 строк клея, импортирующего 50 000 строк фреймворка. Пятьсот строк, всего, построенных поверх Claude Agent SDK от Anthropic.
Реакция разработчиков, впервые читающих исходный код, обычно — недоверие, за которым следует главный вопрос: «А где остальное?»
Что на самом деле делает Claude Agent SDK
Большинство фреймворков для AI-агентов существуют потому, что исторически API языковых моделей были stateless и простыми. Вы отправляли промпт, получали ответ. Если нужно было использование инструментов — приходилось строить цикл выполнения самостоятельно. Если нужен многоходовый диалог — управлять историей сообщений самостоятельно. Если нужно, чтобы модель выбирала между инструментами — строить логику маршрутизации самостоятельно.
Claude Agent SDK фундаментально меняет это уравнение. SDK не просто вызывает Claude API — он запускает агентный цикл. Вы даёте ему системный промпт, набор инструментов и сообщение пользователя. SDK делает всё остальное: отправляет сообщение Claude, получает ответ, проверяет, хочет ли Claude использовать инструмент, выполняет инструмент, отправляет результат обратно Claude и повторяет, пока Claude не выдаст финальный ответ. Весь цикл использования инструментов — то, на реализацию чего большинство фреймворков тратят тысячи строк — это один вызов функции.
Это не тонкая обёртка. SDK обрабатывает стриминг, логику повторных попыток, подсчёт токенов и состояние разговора. Он управляет обменом между Claude и инструментами на протяжении нескольких ходов, обрабатывая крайние случаи вроде сбоев выполнения инструментов и лимитов контекстного окна. Сложность, которую NanoClaw не реализует, не отсутствует — она вынесена в хорошо протестированный SDK, поддерживаемый инженерной командой Anthropic.
Что на самом деле строит NanoClaw
Если SDK обрабатывает агентный цикл, что делают 500 строк NanoClaw? Ответ — всё вокруг цикла, то, что специфично для запуска персонального AI-ассистента, а не просто вызова API.
Первая обязанность — интеграция с каналами. NanoClaw подключается к WhatsApp через библиотеку Baileys, получает сообщения и направляет их в нужный контейнер агента. Это связующее звено между «кто-то отправил сообщение в WhatsApp» и «агент должен обработать это сообщение». Код несложный, но необходимый — без него у агента нет способа связаться с пользователями там, где они уже находятся.
Вторая обязанность — оркестрация контейнеров. Каждый разговор агента происходит внутри собственного Linux-контейнера — Apple Container на macOS, Docker на Linux. NanoClaw создаёт контейнеры, монтирует нужные директории, передаёт секреты через stdin и собирает ответы. Это граница безопасности, которая не позволяет скомпрометированному агенту получить доступ к чему-либо за пределами песочницы. Управление жизненным циклом контейнеров — это примерно 80 строк кода, но именно эти 80 строк отличают агента, которому можно доверить реальные учётные данные, от того, которому нельзя.
Третья обязанность — постоянная память. NanoClaw ведёт базу данных SQLite с разговорами, состоянием групп и запланированными задачами. Каждая группа WhatsApp получает свой файл CLAUDE.md, который служит долговременной памятью агента для этой группы. Система памяти проста — намеренно, потому что сложная часть памяти (определение релевантности, извлечение нужного, использование контекста) обрабатывается самим Claude.
Четвёртая обязанность — запланированные задачи. Пользователи могут попросить агента делать что-то в определённое время — «напомни мне в 15:00» или «проверяй этот сайт каждое утро». Cron-подобный планировщик NanoClaw запускает контейнеры агентов в нужное время — небольшая, но действительно полезная функция, превращающая реактивного чат-бота в проактивного ассистента.
Почему 500 строк — это важно
Количество строк — не метрика тщеславия. Это прямая мера поверхности обслуживания, поверхности ошибок и когнитивной нагрузки, необходимой для понимания системы.
Когда в ядре NanoClaw появляется баг, он может находиться в 500 строках. Разработчик может прочитать всю кодовую базу менее чем за час и понять каждое принятое решение. Сравните с фреймворками на 50 000 строк ядра — поиск бага означает навигацию по абстракциям, понимание систем плагинов и трассировку выполнения через слои косвенности, существующие для поддержки функций, которые вы, возможно, даже не используете.
Последствия для безопасности столь же конкретны. Каждая строка кода — потенциальная уязвимость. Ядро NanoClaw в 500 строк имеет меньшую поверхность атаки, чем парсеры конфигурации большинства фреймворков. Контейнерная изоляция, передача секретов через stdin, белые списки монтирования — эти функции безопасности реализованы в коде, который достаточно мал, чтобы полностью проаудировать за один день.
А история обновлений проста. Когда Anthropic выпускает новую версию Claude Agent SDK с улучшенным использованием инструментов, более быстрым стримингом или новыми возможностями, NanoClaw получает эти улучшения обновлением одной зависимости. Нет абстрактного слоя фреймворка, который нужно обновлять для доступа к новым функциям SDK. SDK и есть фреймворк.
Философия «не строить»
Самой сложной частью архитектуры NanoClaw было не её создание — а решение о том, что не создавать. Соблазн добавить собственный движок выполнения инструментов, изощрённую систему извлечения из памяти, слой абстракции провайдеров, маркетплейс плагинов — всё это вещи, которые другие фреймворки построили, и всё это вещи, которых у NanoClaw намеренно нет.
Каждая из этих функций добавила бы тысячи строк кода, десятки потенциальных багов и недели нагрузки на обслуживание. И каждая дублировала бы функциональность, которую Claude Agent SDK уже предоставляет или которую сам Claude обрабатывает лучше любого рукописного кода.
В результате получился проект, где интересные решения — архитектурные, а не реализационные. Как изолировать контейнеры? Как передавать секреты? Как разграничить память по группам? Это вопросы, которые важны для персонального AI-ассистента, и именно на них отвечают 500 строк NanoClaw.
В следующий раз, когда будете оценивать фреймворк для AI-агентов, не считайте функции. Считайте строки. Фреймворк с наименьшим количеством строк — не самый ограниченный. Возможно, это тот, который достаточно хорошо понял задачу, чтобы позволить AI-провайдеру сделать тяжёлую работу.