最近在使用 Pi Coding Agent,顺便记录一下自己的配置,方便后续迁移和参考。

Pi 是一个运行在终端中的 AI Coding Agent,可以直接读取和修改代码、执行命令、分析报错,并支持自定义模型、Provider 和 Extensions。

我比较喜欢它的几点:

  • CLI 优先,适合 SSH / 服务器环境
  • 支持多种模型和第三方 API
  • 配置灵活,方便自定义
  • 支持 Extensions,扩展能力强
  • 配置文件方便备份和迁移

下面直接分享我的实际配置。

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
"defaultProvider": "openai",
"lastChangelogVersion": "1.1.0",
"theme": "dark",
"hideThinkingBlock": false,
"transport": "websocket",
"packages": [
"npm:pi-cometix-footer",
{
"source": "npm:pi-hashline-edit-pro",
"extensions": [],
"skills": [],
"prompts": [],
"themes": []
},
"npm:@ff-labs/pi-fff",
"npm:@narumitw/pi-lsp",
"npm:pi-workspace-history",
"npm:pi-add-dir",
"npm:@narumitw/pi-plan-mode",
"npm:@juicesharp/rpiv-ask-user-question",
"npm:@juicesharp/rpiv-todo",
"npm:pi-mcp-adapter",
"npm:@gotgenes/pi-permission-system",
"npm:@tmustier/pi-raw-paste",
{
"source": "npm:@tintinweb/pi-subagents",
"extensions": [],
"skills": [],
"prompts": [],
"themes": []
},
"npm:pi-web-access",
"npm:pi-sync-webdav",
"npm:@narumitw/pi-btw",
"npm:pi-rtk-optimizer",
{
"source": "npm:pi-background-tasks",
"extensions": [
"-dist/extensions/anthropic-attribution.js"
]
}
],
"defaultModel": "gpt-6.1-sol",
"defaultThinkingLevel": "xhigh",
"enabledModels": [
"deepseek/deepseek-flash",
"openai/gpt-5.6-sol",
"openai/gpt-6-sol",
"openai/gpt-5.6-luna",
"openai/gpt-6-luna",
"openai/gpt-6-astra",
"zai/glm-5.3-flash",
"anthropic/claude-haiku-4-5-20251001",
"anthropic/claude-haiku-4-5",
"anthropic/claude-sonnet-4-5",
"anthropic/claude-opus-5-5",
"openai/gpt-6.1-sol"
],
"extensions": [
"-builtin:mcp"
]
}

其中npm:@tintinweb/pi-subagents和npm:pi-hashline-edit-pro是禁用的

可直接替换packages中的内容,使用和我同款插件
可选插件 npm:pi-sync-webdav , 通过webdav同步配置

权限管理

基于插件npm:@gotgenes/pi-permission-system实现

下面是配置文件,可照抄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{
"$schema": "https://raw.githubusercontent.com/gotgenes/pi-packages/refs/heads/main/packages/pi-permission-system/schemas/permissions.schema.json",
"yoloMode": true,
"permission": {
"*": "allow",
"path": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow",
"*/*secret*": "deny",
"*/*secrets*": "deny",
"*/*credential*": "deny",
"*/*credentials*": "deny",
"*/*token*": "deny",
"~/.ssh/*": "deny",
"~/.aws/*": "deny",
"~/.config/gcloud/*": "deny",
"~/.kube/*": "deny",
"~/.docker/config.json": "deny",
"~/.npmrc": "deny",
"~/.git-credentials": "deny",
"~/.netrc": "deny"
},
"bash": {
"*": "ask",
"git status *": "allow",
"git diff *": "allow",
"git log *": "allow",
"grep *": "allow",
"find *": "allow",
"rg *": "allow",
"head *": "allow",
"fd *": "allow",

"git push *": "deny",
"rm *": "deny",
"sudo *": "deny",
"su *": "deny",
"chmod *": "deny",
"chown *": "deny",
"mkfs*": "deny",
"diskutil erase*": "deny",
"dd if=*": "deny",
"curl *|*sh*": "deny",
"wget *|*sh*": "deny",
":(){*": "deny"
},
"external_directory": "ask"
}
}

pi-web

提供了web访问pi进行远程vibe coding的能力,其自带pi内核,和pi cli共享目录

启动

1
npx @agegr/pi-web@latest

Docker部署

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
FROM debian:13-slim

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Singapore

# =========================================================
# Base Tools
# =========================================================

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
wget \
git \
ripgrep \
fd-find \
jq \
tree \
less \
nano \
zip \
unzip \
tzdata \
tini \
procps \
iputils-ping \
iproute2 \
net-tools \
sqlite3 \
php \
php-cli \
php-mbstring \
php-curl \
&& ln -sf "$(command -v fdfind)" /usr/local/bin/fd \
&& rm -rf /var/lib/apt/lists/*


# =========================================================
# Git
# =========================================================

RUN git config --system --add safe.directory '*'


# =========================================================
# mise
# =========================================================

RUN curl -fsSL https://mise.run | sh \
&& mv /root/.local/bin/mise /usr/local/bin/mise \
&& chmod +x /usr/local/bin/mise \
&& mise --version


# =========================================================
# RTK
#
# 只安装 RTK CLI
# 不执行:
# rtk init
#
# 不安装 Pi extension
# =========================================================

RUN curl -fsSL \
https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh \
| env RTK_INSTALL_DIR=/usr/local/bin sh \
&& rtk --version


# =========================================================
# Persistent Environment
# =========================================================

ENV MISE_DATA_DIR=/root/.local/share/mise
ENV MISE_CONFIG_DIR=/root/.config/mise
ENV MISE_CACHE_DIR=/root/.cache/mise

ENV NPM_CONFIG_PREFIX=/root/.local/share/npm

ENV PATH="/root/.local/share/npm/bin:/root/.local/share/mise/shims:/root/.local/share/mise/bin:${PATH}"


# =========================================================
# Directories
# =========================================================

RUN mkdir -p \
/root/.local/share/mise \
/root/.config/mise \
/root/.cache/mise \
/root/.local/share/npm \
/root/.npm \
/workspace \
/project


# =========================================================
# Bash
# =========================================================

RUN echo 'eval "$(mise activate bash)"' >> /root/.bashrc


# =========================================================
# Workspace
# =========================================================

WORKDIR /workspace


# =========================================================
# Startup
# =========================================================

COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh

RUN chmod +x /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["tini", "--", "/usr/local/bin/docker-entrypoint.sh"]

CMD ["/bin/bash"]

Compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
services:
pi-web:
image: pi-web:latest
build:
context: .
dockerfile: Dockerfile

container_name: pi-web
restart: unless-stopped

environment:
TZ: Asia/Singapore
PI_CODING_AGENT_DIR: /root/.pi/agent
PI_WEB_PASSWORD: ${PI_WEB_PASSWORD}
#PI_WEB_ALLOWED_HOSTS: ${PI_WEB_ALLOWED_HOSTS}
PI_WEB_SHELL: /bin/bash
SHELL: /bin/bash

volumes:
- ./agent:/root/.pi/agent

- ./workspace:/workspace:rw
- ./project:/project

# mise 安装的 Node 等运行时
- ./data/mise:/root/.local/share/mise

# mise 全局配置
- ./data/mise-config:/root/.config/mise

# mise 下载缓存
- ./data/mise-cache:/root/.cache/mise

# npm install -g 安装的 pnpm / pi
- ./data/npm-global:/root/.local/share/npm

# npx / npm 下载缓存
- ./npm-cache:/root/.npm

working_dir: /workspace

ports:
- "30141:30141"

command:
- npx
- -y
- "@agegr/pi-web@latest"
- --hostname
- "0.0.0.0"
- --port
- "30141"
- --no-open

stdin_open: true
tty: true

脚本

docker-entrypoint.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/bash
set -e

export PATH="/root/.local/share/npm/bin:/root/.local/share/mise/shims:/root/.local/share/mise/bin:${PATH}"

mkdir -p \
"$MISE_DATA_DIR" \
"$MISE_CONFIG_DIR" \
"$MISE_CACHE_DIR" \
"$NPM_CONFIG_PREFIX" \
/root/.npm

echo "========================================"
echo " Initializing development environment"
echo "========================================"

# =========================================================
# Node.js + npm
# =========================================================

if ! command -v node >/dev/null 2>&1; then
echo "[init] Installing Node.js 22..."
mise use -g node@22
else
echo "[init] Node.js already installed: $(node --version)"
fi

mise reshim >/dev/null 2>&1 || true

echo "[init] Node: $(node --version)"
echo "[init] npm: $(npm --version)"


# =========================================================
# pnpm
# =========================================================

if ! command -v pnpm >/dev/null 2>&1; then
echo "[init] Installing pnpm..."
npm install -g pnpm
else
echo "[init] pnpm already installed: $(pnpm --version)"
fi


# =========================================================
# Pi Coding Agent
# =========================================================

if ! command -v pi >/dev/null 2>&1; then
echo "[init] Installing Pi Coding Agent..."
npm install -g @earendil-works/pi-coding-agent
else
echo "[init] Pi already installed: $(pi --version)"
fi


echo "========================================"
echo " Environment ready"
echo "========================================"

exec "$@"

此镜像使用mise管理环境变量,容器启动时自动安装必要sdk,自带一些开发环境和pi-web、pi cli
便于后期更新和环境缓存,减少空间占用

总结

希望对你有所帮助