TGViewer
Сергей Предводителев Сергей Предводителев @sergei_predvoditelev · 1.2K subscribers
Post #280 1.34K
🌿 Про контейниризацию Pi

Основная идея агента 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 и собственно текущая рабочая директория. Изменения будут выполняться от имени текущего пользователя.

В таком виде гораздо безопаснее работать с агентами. Агент не сможет изменить то, что ему менять не положено 🔆
  • 👍 10
  • 😁 7
  • 👎 2
More from @sergei_predvoditelev
  1. Sep 20, 2026🌿 Про хардкорный курс асинхронного PHP Записался на курс по асинхронному PHP, который зап…
  2. Sep 17, 2026🌿 Про автоматическое ревью и слияние PR Егор Бугаенко в 101 выпуске вопросов/ответов расс…
  3. Sep 9, 2026Пыхник’26 — целая неделя PHP! С 28 сентября по 2 октября пройдёт Пыхник’26 — онлайн-конфер…
  4. Aug 31, 2026#инфопузырь ☕️ Инфопузырь #20 (Август 2026) Ещё один короткий выпуск... Думаю, в сентябре…
  5. Aug 27, 2026🌿 Про Ghostty Весной я переехал со стандартного GNOME Terminal на WezTerm. И всё меня уст…
  6. Aug 22, 2026🌿 Про nono В комментариях к посту про локальных агентов упомянули песочницу для агентов n…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →