Ваш агент — чёрный ящик
Claude Code, Codex и Gemini CLI — это agent harness, спроектированные кем-то другим, и если вы проводите рабочий день внутри одного из них, вы живёте с этим дизайнерским решением. Хотите изменить поведение, добавить инструмент, ужесточить правило разрешений? Приходится ждать, пока вендор соизволит выпустить обновление. Вы не знаете, что в system prompt, не видите цикл, что гоняет инструменты, и не можете изменить ничего из этого — хотя эти инструменты уже стали основным рабочим местом тысяч разработчиков.
Один open source проект идёт в обратную сторону: pi, тулкит, что даёт запчасти для сборки своего агента, от коннектора модели до интерфейса. За первый год он набрал 92 000 звёзд на GitHub и выпускает релиз почти каждую неделю. Эта статья о том, что pi реально кладёт в коробку, как построить своего агента с его SDK, и честный вердикт против готовых harness.
Что такое harness на самом деле
Harness — это вся машинерия вокруг языковой модели, что превращает её в работающего агента. Модель сама по себе умеет только одно: читать текст и выдавать текст. Она не читает ваши файлы, не выполняет ни одной команды, и не помнит ничего от сессии к сессии. Всё остальное — это harness: system prompt, что задаёт рамки модели, инструменты, которые ей открыты, цикл, что выполняет вызовы инструментов и возвращает результаты, и интерфейс в вашем терминале.
Harness также решает те детали, что меняют всё день за днём: как сжимается история, когда контекст переполнен, как ошибка инструмента возвращается модели, что логируется, а что нет. Claude Code — это harness. Codex тоже. Когда агент вас впечатляет, большая часть заслуги у этой машинерии, а не у модели — подключите одну и ту же модель к двум разным harness, и получите двух агентов совершенно разного уровня.
pi, сделанный Earendil Works, режет эту машинерию на переиспользуемые блоки. Можно использовать его coding agent как есть, или взять блоки по одному и собрать своё. Именно второй вариант нас интересует.
Внутри тулкита pi
pi — это монорепозиторий: один репозиторий с пятью отдельно публикуемыми пакетами, и каждый пакет покрывает один этаж harness:
| Пакет | Что делает |
|---|---|
| pi-ai | Единый API к OpenAI, Anthropic, Google и остальным: стриминг ответов, блоки рассуждений с их уровнями, динамическое обнаружение моделей каждого провайдера. Смена лаборатории — это смена одного аргумента. |
| pi-agent-core | Сам цикл агента: состояние диалога, плюс цикл, что шлёт сообщение, читает вызовы инструментов, выполняет их и возвращает результаты до завершения задачи. Запутанные случаи — падающий инструмент, обрезанный ответ, параллельные вызовы — уже обработаны. |
| pi-tui | Библиотека рендеринга терминала с дифференциальным рендерингом: перерисовывает только то, что изменилось на экране. |
| pi-coding-agent | Полный coding agent, собранный из блоков выше — доказательство, что тулкита хватает на готовый продукт. |
| pi-telemetry | Подключите свои метрики использования без зависимости от вендора. |
Цикл агента — это как раз та часть, что вы плохо напишете с нуля; написать его правильно — недели работы, а тут это достаётся одним импортом. Команда применяет тот же рецепт в другом месте: отдельный репозиторий pi-chat использует те же блоки для автоматизации диалогов.
Цифры показывают, что формула работает:
| Метрика | Значение |
|---|---|
| Звёзды на GitHub | 92 123 |
| Форки | 11 400 |
| Коммиты | 5 700+ |
| Лицензия | MIT |
| Релизы за первые две недели августа 2026 | 3 (v0.84.2 вышла 14 августа) |
Лицензия MIT означает, что вы можете использовать, менять и распространять pi без ограничений, даже в коммерческом продукте. pi — не просто ещё один фреймворк: это полный harness, доставленный по частям, и поддерживается ровным темпом.
CLI на практике
CLI pi — это уже собранный coding agent, который вы получаете до того, как тронете хоть строчку кода, и именно с него вы начнёте. Установка — одна строка, а флаг --ignore-scripts — не мелочь: он мешает вашим зависимостям выполнять свои install-скрипты, одну из самых используемых уязвимостей в npm. Запустите pi, подключите провайдера командой login, и у вас есть coding agent прямо здесь, в терминале. Строка статуса показывает текущую папку, сессию, потраченные токены и стоимость в реальном времени — вы видите цену каждого запроса в момент отправки, вместо того чтобы узнать счёт в конце месяца.
Слэш-команды покрывают рутину: model — сменить модель на ходу, compact — сжать историю, когда контекст разбух, export — вытащить диалог, settings — для остального. Один markdown-файл в папке prompts становится командой, которую вызываешь по имени.
Настоящая фишка pi — это работа с сессиями. Каждый диалог сохраняется как JSONL в домашней папке, по проектам — и история на самом деле дерево, а не линия. Вы можете вернуться в любую точку диалога и пойти другим путём командой fork, а потом ходить между ветками через tree. Неудачный промпт теперь ничего не стоит: вернитесь к прошлому узлу и попробуйте снова, не теряя другую ветку. Поскольку всё хранится локально, resume вернёт вас в любую прошлую сессию, даже через недели. Ни Claude Code, ни Codex не дают навигацию по истории в такой форме.
По умолчанию модель получает только четыре инструмента: read, write, edit и bash. Это очень мало по сравнению с агентами на рынке, и это осознанно (вернёмся к этому ниже). Конфигурация следует той же логике: глобальный файл настроек в домашней папке, файл на проект, что его перекрывает, и система доверия, что спрашивает перед применением локальных настроек папки, открытой впервые. При миграции pi автоматически подгружает ваши файлы AGENTS.md или CLAUDE.md как контекст, так что существующие инструкции работают без переписывания.
Мы собираем своего агента
Сборка агента с SDK pi начинается с одного импорта: createAgentSession, которому передают модельный рантайм и менеджер сессий, возвращает рабочего агента. Менеджер сессий — это выбор персистентности: память для одноразового скрипта, или диск, чтобы находить диалоги от запуска к запуску.
Мы попробовали на локальном проекте. Наш скрипт спрашивает, что в текущей папке; агент вызывает свой инструмент read, читает папку и отвечает. Это весь цикл, написанный нами, примерно за десять строк TypeScript. Сессии, создаваемые SDK, имеют ту же древовидную структуру, что и CLI — каждое сообщение связано с родителем — так что ветвление истории работает и в вашем собственном коде.
Кастомные инструменты — вот где становится интересно. defineTool берёт имя, описание, типизированную схему параметров и функцию execute, и ваш инструмент появляется у модели точно как read или bash. Мы написали такой, что запрашивает список видео канала, передали в customTools, и агент вызвал его сам с первого же подходящего вопроса. Это по сути тот же механизм, что и MCP-сервер, только всё живёт в вашем файле — без отдельного процесса и без протокола между. Поскольку схема параметров типизирована, редактор автодополняет аргументы, а агент получает уже провалидированные входные данные.
Вы также управляете моделью, уровнем размышления (от нуля до максимума), точным списком инструментов, видимых модели, и даже всем system prompt через resource loader, если хотите начать с чистого листа. Для отображения session.subscribe даёт каждое событие — стримящийся текст, вызовы, ошибки — которое можно направить куда угодно: терминал, бот-мессенджер, или CI-пайплайн, что комментирует ваши pull request. За один вечер вы переходите от использования агента к его написанию, и наконец понимаете, что происходит на каждом витке цикла.
Расширяем без форка
CLI pi настраивается через четыре механизма, все в обычных папках вашего проекта или домашней папки:
- Extensions — TypeScript-модули, что регистрируют инструменты, слэш-команды, горячие клавиши или элементы UI. Вы кладёте файл в папку extensions, и он грузится при старте. Вот где стоит писать защитника разрешений, например: расширение, что перехватывает bash-команды и просит подтверждения перед опасными.
- Skills — пакеты возможностей по стандарту Agent Skills, тому же, что популяризовал Anthropic, так что ваши существующие skills переиспользуются как есть.
- Prompts — переиспользуемые промпты как обычные markdown-файлы.
- Themes — подгружаются на лету, пока работает CLI.
Всё это устанавливается как обычный пакет: pi install берёт npm-пакет или git-репозиторий, и одна команда обновляет всё. Документация сводит философию к одной фразе: подстраивайте pi под свои процессы, а не наоборот, без форка или патчей внутри.
Это полная противоположность крупных harness. Там, где Claude Code встраивает суб-агентов, plan mode и права прямо в продукт, pi намеренно оставляет их снаружи — чтобы строить как расширение или ставить из сообщества. Ставка ясна: минимальное ядро, что почти не меняется, и вся кастомизация живёт на вашей стороне, в файлах, что версионируются вместе с проектом.
Настоящий предел
Прозрачность pi оплачивается работой, и эта цена состоит из трёх частей.
Сначала guardrails: по умолчанию нет встроенных запросов на разрешение, так что агент может запустить bash-команду, ничего не спрашивая. Официальная документация признаёт это и предлагает три паттерна изоляции, включая Docker — но настроить их до того, как отпустить агента на важную машину, это ваша ответственность.
Дальше зрелость: это v0.84, а не 1.0, около сотни открытых issue и несколько API всё ещё экспериментальные, как удалённый клиент сессий, добавленный последние недели. То, что работает сегодня, может сломаться в следующем релизе; это нормальная цена проекта, что движется так быстро.
И наконец, время. Каждое удобство, что Claude Code даёт из коробки — plan mode, суб-агентов или тонкие права — здесь становится проектом, который вы строите сами, или пакетом сообщества, за которым гоняетесь, надеясь на поддержку. Экосистеме расширений всего год: вы найдёте больше дыр для заполнения, чем готовых пакетов. Даже установка уже показала уровень бдительности, что нужен, через свой флаг --ignore-scripts, и этот уровень нужно держать по всей цепочке. Если цель — выпустить код сегодня вечером, pi сначала замедлит вас, прежде чем ускорить — не меняйте основной harness на этой неделе только из-за этого видео.
Для кого pi на самом деле
pi для разработчиков, что строят продукты с агентами, а не с одним агентом. Для них это, пожалуй, лучшая инвестиция в обучение прямо сейчас: установите CLI, напишите агента на двадцать строк через SDK, и дайте ему свой инструмент. Сделайте это, и вы поймёте Claude Code лучше большинства пользователей.
Если сегодня нужен просто продуктивный ассистент, оставайтесь на интегрированном harness и вернитесь, когда 1.0 добавит guardrails: ценность pi в понимании и контроле, а не в мгновенном удобстве. Между этими крайностями есть безрисковая середина — оставьте Claude Code для работы, и используйте pi как испытательный стенд, чтобы понять, что скрывает основной инструмент.
Главный вывод: harness больше не чёрный ящик. Детали лежат на столе, задокументированы, под лицензией MIT. В следующий раз, когда агент впечатлит или разозлит вас, вы точно будете знать, куда смотреть.
AIDive