Pi: минимальный агент внутри OpenClaw
@ai_longreadsАрmin Ронахер рассказывает о Pi — минималистичном кодинг-агенте, на основе которого построен OpenClaw, и объясняет, почему философия «агент расширяет сам себя через код» оказывается мощнее традиционных плагинов и расширений.
Это AI-перевод статьи, сделанный каналом Про AI: Лучшие Статьи и Исследования.
Pi: минимальный агент внутри OpenClaw
Pi: The Minimal Agent Within OpenClaw Автор: Armin Ronacher Оригинальный текст:
Если вы не жили под камнем последнюю неделю, вы наверняка заметили, что проект моего друга Питера стал вирусным в интернете. У него было много названий. Самое последнее — OpenClaw, но в новостях вы могли встретить его как ClawdBot или MoltBot, в зависимости от того, когда вы о нём читали. Это агент, подключённый к любому каналу связи по вашему выбору, который просто запускает код.
Что вам, возможно, менее знакомо — под капотом OpenClaw находится маленький кодинг-агент под названием Pi. И Pi — это на данный момент тот агент для написания кода, который я использую почти исключительно. За последние несколько недель я всё больше превращался в его евангелиста. После недавнего выступления я понял, что так и не написал о Pi в блоге, так что решил дать немного контекста о том, почему я им одержим и как он связан с OpenClaw.
Pi написан Марио Цехнером, и в отличие от Питера, который стремится к «научной фантастике с долей безумия», Марио очень приземлён. Несмотря на разницу в подходах, и OpenClaw, и Pi следуют одной идее: большие языковые модели отлично пишут и запускают код — так давайте это использовать. В некотором смысле это не случайность, потому что именно Питер подсадил и меня, и Марио на эту идею и на агентов в прошлом году.
Что такое Pi?
Pi — это кодинг-агент. И кодинг-агентов сейчас множество. Думаю, вы можете взять практически любого с полки и получить представление о том, каково это — заниматься агентным программированием. В обзорах на этом блоге я положительно отзывался об AMP, и одна из причин, по которой он мне так откликнулся, — он действительно ощущался как продукт, созданный людьми, которые и подсели на агентное программирование, и при этом попробовали разные подходы, чтобы увидеть, что работает, а не просто обернули всё в красивый интерфейс.
Pi интересен мне по двум основным причинам:
И небольшой бонус: сам Pi написан как отличное программное обеспечение. Он не мерцает, не потребляет много памяти, не ломается случайным образом — он очень надёжен и написан человеком, который тщательно следит за тем, что попадает в софт.
Pi также представляет собой набор маленьких компонентов, поверх которых можно строить собственного агента. Именно так построен OpenClaw, именно так я создал своего маленького Telegram-бота, и именно так Марио создал свою mom. Если вы хотите создать собственного агента, подключённого к чему-либо, Pi, направленный на себя самого и на mom, соберёт его для вас.
Чего нет в Pi
И чтобы понять, что есть в Pi, ещё важнее понять, чего в нём нет, почему этого нет и, самое главное, почему этого не будет. Самое очевидное упущение — поддержка MCP. В нём нет поддержки MCP. Хотя вы могли бы написать для него расширение, можно сделать так, как поступает OpenClaw для поддержки MCP — использовать mcporter. mcporter предоставляет вызовы MCP через CLI-интерфейс или TypeScript-привязки, и, может быть, ваш агент сможет с этим что-то сделать. А может и нет, не знаю :)
И это не ленивое упущение. Это часть философии работы Pi. Вся идея Pi заключается в том, что если вы хотите, чтобы агент делал что-то, чего он ещё не умеет, вы не идёте скачивать расширение, скилл или что-то подобное. Вы просите агента расширить самого себя. Pi воспевает идею написания и исполнения кода.
Это не значит, что вы не можете скачивать расширения. Это вполне поддерживается. Но вместо того чтобы побуждать вас скачивать чужое расширение, можно указать агенту на уже существующее и сказать: «сделай как вон то, но с вот такими изменениями».
Агенты, созданные для агентов, создающих агентов
Когда вы смотрите на то, что делают Pi и, как следствие, OpenClaw, перед вами пример программного обеспечения, податливого как глина. Это задаёт определённые требования к лежащей в основе архитектуре, которые на самом деле во многих отношениях накладывают ограничения на систему, и они действительно должны быть заложены в базовый дизайн.
Например, базовый AI SDK в Pi написан так, что сессия может содержать сообщения от множества разных провайдеров моделей. Он учитывает, что переносимость сессий между провайдерами моделей несколько ограничена, поэтому не слишком опирается на специфические возможности какого-либо одного провайдера, которые нельзя перенести на другой.
Во-вторых, помимо сообщений модели, Pi хранит в файлах сессий пользовательские сообщения, которые могут использоваться расширениями для хранения состояния или самой системой для поддержания информации, которая либо вообще не отправляется в ИИ, либо отправляется лишь частично.
Поскольку эта система существует и состояние расширений тоже может сохраняться на диск, в Pi встроена горячая перезагрузка — агент может написать код, перезагрузить его, протестировать и зациклиться, пока расширение действительно не заработает. Pi также поставляется с документацией и примерами, которые сам агент может использовать для самостоятельного расширения. Более того: сессии в Pi — это деревья. Вы можете ветвиться и перемещаться внутри сессии, что открывает интересные возможности — например, можно уйти в сторону и починить сломанный инструмент агента, не тратя контекст в основной сессии. После того как инструмент починен, я могу перемотать сессию назад, и Pi резюмирует то, что произошло на другой ветке.
Всё это важно, потому что, например, если рассмотреть, как работает MCP, на большинстве провайдеров моделей инструменты для MCP, как и любой инструмент для большой языковой модели, должны загружаться в системный контекст или секцию инструментов при старте сессии. Это делает очень сложным или невозможным полную перезагрузку возможностей инструментов без сброса кэша или без того, чтобы запутать ИИ относительно того, как работали предыдущие вызовы.
Инструменты за пределами контекста
Расширение в Pi может зарегистрировать инструмент, доступный большой языковой модели для вызова, и время от времени я нахожу это полезным. Например, несмотря на мою критику реализации Beads, я считаю, что дать агенту доступ к списку задач — очень полезная вещь. У меня есть локальный трекер задач, специфичный для агента, который мой агент построил сам. И поскольку я хотел, чтобы агент тоже управлял задачами, в данном конкретном случае я решил дать ему инструмент, а не CLI. Это было уместно для масштаба задачи, и это единственный дополнительный инструмент, который я загружаю в контекст.
Но по большей части всё, что я добавляю в своего агента — это либо скиллы, либо TUI-расширения, чтобы работать с агентом было приятнее для меня. Помимо слеш-команд, расширения Pi могут рендерить кастомные TUI-компоненты прямо в терминале: спиннеры, прогресс-бары, интерактивные файловые пикеры, таблицы данных, панели предпросмотра. TUI достаточно гибок, и Марио доказал, что в нём можно запустить Doom. Непрактично, но если можно запустить Doom, уж точно можно собрать полезный дашборд или интерфейс для отладки.
Хочу выделить некоторые из моих расширений, чтобы дать представление о том, что возможно. Вы можете использовать их без изменений, но вся идея в том, что вы указываете агенту на одно из них и ремиксуете как душе угодно.
`/answer`
Я не использую plan mode (режим планирования). Я поощряю агента задавать вопросы, и между нами идёт продуктивный диалог. Но мне не нравятся структурированные диалоги с вопросами, которые появляются, если дать агенту инструмент для вопросов. Я предпочитаю естественную прозу агента с вкраплениями объяснений и диаграмм.
Проблема: ответы на вопросы инлайново становятся мешаниной. Поэтому /answer считывает последний ответ агента, извлекает все вопросы и переформатирует их в аккуратное поле ввода.
`/todos`
Хотя я критикую Beads за реализацию, дать агенту список задач — действительно полезно. Команда /todos показывает все элементы, хранящиеся в .pi/todos как markdown-файлы. И агент, и я можем ими манипулировать, а сессии могут забирать задачи, помечая их как «в работе».
`/review`
По мере того как всё больше кода пишется агентами, бессмысленно отдавать незавершённую работу людям, пока агент не проверил её первым. Поскольку сессии Pi — это деревья, я могу ответвиться в свежий контекст для ревью, получить замечания, а затем вернуть исправления в основную сессию.
Интерфейс сделан по образцу Codex, который предоставляет удобный просмотр коммитов, диффов, незакоммиченных изменений или удалённых PR. Промпт обращает внимание на то, что важно мне, поэтому я получаю нужные замечания (например, я прошу отмечать новые добавленные зависимости).
`/control`
Расширение, с которым я экспериментирую, но активно не использую. Оно позволяет одному агенту Pi отправлять промпты другому. Это простая мультиагентная система без сложной оркестрации, полезная для экспериментов.
`/files`
Показывает все файлы, изменённые или упомянутые в сессии. Вы можете открыть их в Finder, посмотреть дифф в VS Code, быстро просмотреть их или сослаться на них в промпте. Горячая клавиша shift+ctrl+r быстро просматривает последний упомянутый файл — удобно, когда агент создаёт PDF.
Другие тоже создают расширения: расширение Нико для субагентов и interactive-shell, которое позволяет Pi автономно запускать интерактивные CLI в наблюдаемом TUI-оверлее.
Программы, создающие программы
Всё это лишь примеры того, что можно делать с агентом. Суть в том, что ничего из этого не было написано мной — всё создано агентом по моим спецификациям. Я сказал Pi сделать расширение, и он сделал. Никакого MCP, никаких коммьюнити-скиллов, ничего. Не поймите меня неправильно — я использую массу скиллов. Но все они вручную изготовлены моим «кланкером» и ниоткуда не скачаны. Например, я полностью заменил все свои CLI и MCP-инструменты для автоматизации браузера на скилл, который просто использует CDP. Не потому что альтернативы не работают или плохи, а потому что это просто легко и естественно. Агент поддерживает собственную функциональность.
У моего агента довольно много скиллов, и что важно — я выбрасываю скиллы, если они мне не нужны. Например, я дал агенту скилл для чтения сессий Pi, которыми делятся другие инженеры — это помогает с код-ревью. Или у меня есть скилл, помогающий агенту формировать сообщения коммитов и поведение коммитов так, как я хочу, а также обновлять ченджлоги. Изначально это были слеш-команды, но сейчас я мигрирую их в скиллы, чтобы проверить, работает ли это столь же хорошо. Также у меня есть скилл, который помогает Pi использовать uv вместо pip, плюс я добавил кастомное расширение для перехвата вызовов pip и python с перенаправлением на uv.
Часть очарования работы с минималистичным агентом вроде Pi в том, что она заставляет вас жить этой идеей использования программ, которые создают другие программы. Доведённое до крайности — когда убираешь интерфейс и вывод и подключаешь агента к чату. Именно это делает OpenClaw, и учитывая его колоссальный рост, я всё больше чувствую, что это наше будущее — в той или иной форме.
Подпишитесь на канал и каждый день читайте лучшие материалы про AI переведенные на русский!
Нашли интересную статью для перевода? Пришлите нашему боту: @ailongreadsbot