Основная идея агента Pi состоит в том, что из коробки он предоставляет самый минимум: консольный интерфейс, сессии, поддержка популярных провайдеров моделей, короткий системный промпт и базовый набор инструментов (
read, bash, edit, write).Всё остальное предлагается настраивать под себя с помощью готовых расширений или дорабатывать агента, используя LLM и API агента на TypeScript: в системном промпте по умолчанию описано как это делать.
Выглядит подход классно — не мы подстраиваемся под инструмент, а заставляем инструмент подстраиваться под нас.
Первое, что я решил попробовать сделать — расширение, которое заставит агента спрашивать разрешение при использовании инструмента
write. Pi справился быстро, но тестирование вышло интересным:• агент запрашивает разрешение на выполнение
write;• запрещаю, агент уходит думать;
• решение агента: «расширение мешает выполнить задачу, отключаем расширение»;
• агент отключает созданное расширение и создаёт файл через
bash.Какой целенаправленный агент 😂
Будем ограничивать — завернём Pi в контейнер. Вообще Pi предлагает несколько вариантов контейнеризации, но я выбрал старый добрый докер.
Dockerfile вышел таким:FROM node:24.18.0-trixie-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
fd-find \
ripgrep \
&& rm -rf /var/lib/apt/lists/*
RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent
ENV PI_CODING_AGENT_DIR=/pi
ENV PI_CODING_AGENT_SESSION_DIR=/pi-sessions
WORKDIR /workspace
ENTRYPOINT ["entrypoint.sh"]
CMD ["pi"]
entrypoint.sh для установки корректного владельца директории с сессиями: #!/bin/sh
set -eu
PUID="${PUID:-0}"
PGID="${PGID:-0}"
if [ "$PUID" = 0 ] && [ "$PGID" = 0 ]; then
exec "$@"
fi
chown -R "$PUID:$PGID" "$PI_CODING_AGENT_SESSION_DIR"
export HOME=/tmp/user-home
exec setpriv --reuid="$PUID" --regid="$PGID" --clear-groups "$@"
Команда для запуска:
docker run --rm -it --init --read-only \
-e PUID="$(id -u)" \
-e PGID="$(id -g)" \
--tmpfs /tmp \
-v yii-pi-sessions:/pi-sessions \
-v "$HOME"/.pi/agent/models.json:/pi/models.json:ro \
-v "$(pwd)":/workspace \
my-pi-harness:latest
Данная команда запускает контейнер с корневой файловой системой только для чтения. На запись будут доступны только папка для временных файлов
/tmp, папка с сессиями Pi и собственно текущая рабочая директория. Изменения будут выполняться от имени текущего пользователя.В таком виде гораздо безопаснее работать с агентами. Агент не сможет изменить то, что ему менять не положено 🔆
