Skip to content

第 17 章 · 工具系统与 CLI 全解

本章目标:搞清楚 pi 的 7 个内置工具各自能做什么,掌握用命令行参数精确控制工具可用性的方法,并把整份 CLI 参数表收进你的速查手册。

17.1 内置工具清单

pi 的内置工具一共 7 个(官方 CLI 参考原文:read, bash, edit, write, grep, find, ls):

工具职责典型用途
read读文件查看源码、配置
write写文件创建新文件
edit精确编辑文件改代码、改配置
bash执行 shell 命令跑测试、git 操作、构建
grep内容搜索在代码库中查找模式
find文件名查找定位文件位置
ls列目录浏览项目结构

注意两点设计哲学:没有内置的网页抓取/终端 UI 类花哨工具——需要就靠扩展或技能补;bash 是万能后门——即使禁掉其他工具,只要 bash 可用,模型理论上仍能间接完成读写,所以"只读审查"场景必须把 bash 一并排除。

17.2 用 Tool Options 控制工具可用性

CLI 提供四个层级的开关(括号内为缩写):

bash
# 白名单模式:只允许这 4 个只读类工具 —— 官方推荐的"Read-only mode"
pi --tools read,grep,find,ls -p "Review the code"
pi -t read,grep,find,ls "..."            # 等价缩写

# 黑名单模式:仅禁用某个工具(含内置、扩展与自定义工具)
pi --exclude-tools ask_question
pi -xt bash "重构这段代码"               # 禁用 bash,逼模型用 read/write/edit

# 关闭全部内置工具,但保留扩展注册的自定义工具
pi --no-builtin-tools

# 全部工具关闭 —— 纯对话模式,模型只能用语言回答
pi --no-tools "解释一下 CAP 定理"

选择策略:

  • 代码审查 / 架构问答-t read,grep,find,ls,杜绝任何写入;
  • 只想屏蔽某个危险动作-xt bash-xt write
  • 让扩展全权接管工具集--no-builtin-tools
  • 纯文本任务--no-tools 最省心,也最安全。

工具白名单 ≠ 安全边界

官方 security 文档明确:这些选项是行为控制而非沙箱。真正的隔离要靠容器或微虚拟机(见第 19 章)。不要把 -t read,... 当成对抗恶意仓库的防线。

17.3 CLI 参数速查表

完整语法:pi [options] [@files...] [messages...]。以下按功能分组(与官方 README 的 CLI Reference 一致):

运行模式

参数说明
(默认)交互式 TUI
-p / --print输出响应后退出
--mode jsonJSON Lines 事件流输出
--mode rpcRPC 进程集成模式
--export <in> [out]把会话导出为 HTML

模型相关

参数说明
--provider <name>指定 provider(anthropic/openai/google 等)
--model <pattern>模型模式或 ID,支持 provider/id[:thinking]
--api-key <key>临时指定 API key(覆盖环境变量)
--thinking <level>思考级别:off/minimal/low/medium/high/xhigh/max
--models <patterns>Ctrl+P 循环切换的模型列表
--list-models [search]列出可用模型

会话相关

参数说明
-c / --continue继续最近一次会话
-r / --resume浏览并选择历史会话
--session <path|id>使用指定会话文件或 UUID 前缀
--fork <path|id>从既有会话分叉出新会话
--session-dir <dir>自定义会话存储目录
--no-session临时模式,不落盘
-n <name>启动时命名会话

资源加载

参数说明
-e <source>加载扩展(路径/npm/git),可重复
--skill <path>加载技能,可重复
--prompt-template <path>加载提示词模板,可重复
--theme <path>加载主题,可重复
--no-extensions / --no-skills关闭对应资源的自动发现
--no-context-files (-nc)不加载 AGENTS.md / CLAUDE.md

系统提示词

bash
# 整体替换默认系统提示词(上下文文件和技能仍会追加)
pi --system-prompt "你是一个只回答 Go 问题的助手"

# 只做追加
pi --append-system-prompt "所有回答使用中文"

17.4 组合实战示例

把上面的参数拼起来,就是各种标准工作姿势:

bash
# 1. 用便宜的小模型跑批量文档翻译(无人值守)
for f in docs/en/*.md; do
  pi --model openai/gpt-4o-mini --no-session -p "把 @$f 翻译成中文,只输出译文" \
    > "docs/zh/$(basename "$f")"
done

# 2. 高思考级别攻坚复杂 bug
pi --model sonnet:high "这个并发死锁只在周五出现,帮我排查"

# 3. 只读模式 + 禁止上下文文件,审计陌生仓库
cd /tmp/untrusted-repo
pi -t read,grep,find,ls --no-context-files -p "总结这个项目的入口和依赖"

# 4. 精确复现同事的调试现场:从会话 ID 分叉继续
pi --session 9f2c1a3b --fork

17.5 本章小结

  • 内置工具共 7 个:read/write/edit/bash/grep/find/ls,bash 是能力上限也是风险上限;
  • 四个控制层级:--tools 白名单 > --exclude-tools 黑名单 > --no-builtin-tools > --no-tools
  • 工具开关只是行为约束不是沙箱;
  • 模型可用 provider/id:thinking 简写一步到位;
  • --system-prompt 替换、--append-system-prompt 追加。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. 官方推荐的"只读审查"命令是哪种写法?

2. --no-tools 与 --no-builtin-tools 的区别是?

3. 想从当前会话的历史中某个点另开一条探索线,应该用?

4. pi --model sonnet:high 中 ":high" 的含义是?

🛠️ 动手实践

  1. 分别用 --tools--exclude-tools--no-tools 三种方式让 pi"只解释不修改"你的一个项目,对比三种方式的响应差异。
  2. --list-models 找出你可用的最便宜模型,写一个批量重命名 markdown 标题的脚本。
  3. --fork 复制一条旧会话,在新分支上尝试不同的重构方案,再用 /tree 回看两条线的分叉点。