[IT 鐵人賽] 四招通萬法,大巧不工:Pi Agent 只給模型 read、write、edit、bash,為什麼夠用 - Day 01
本文同步刊登於 2026 iThome 鐵人賽,系列為《凡人修 Agent 傳-我這一生如履薄冰,你說我的 Agent 能結嬰嗎?》。
原始開發紀錄:Agent Build Log — Episode 001
這個系列改寫自我部落格上的 Agent Build Log,那是我每天邊做邊寫的開發紀錄。上面列的是這一篇對應的集數,想看當天的原始版本,點連結就能過去。
read、write、edit、bash。Pi 給模型的工具,只有這四個。
大道至簡。其他 coding agent 動輒二三十個工具,Pi 的設計哲學,是把 agent 所有的工作,都設計成由四個基本 tools 組合而成。模型已經夠強,剩下的事讓他自己用 bash 去做。
這套哲學成立,跟時間點有關。我決定打造自己的 agent 的時候,GPT 5.6 Sol 和 Fable 已經問世了。這個時代的模型,跟 GPT 5 剛出現時不一樣。那時候的 agent 要靠一大堆工具、一長串 prompt 把模型扶著走,每一步都怕他走偏。現在的模型看得懂一個 codebase,會自己決定下一步查什麼、改哪裡、怎麼驗證。harness 該做的事變少了,模型越強,harness 越該讓路。我看過的 harness 裡,Pi 把這件事做得最徹底。
所以第一篇先講他,不講我。

四個工具為什麼夠
Pi 作者的論點很簡單:模型早就會用這四個工具了。
read、write、edit 是每家 coding agent 都有的工具,schema 長得差不多,模型在訓練時看過無數次。bash 更不用說,模型對 shell 的熟練度,遠超過對任何自訂工具的熟練度。你想讓他查 git log、跑測試、找檔案、呼叫某個 CLI,他用 bash 就做得到,不需要你替每件事包一個工具。
工具少,帶來的另一件事是 context 乾淨。每多一個工具,就多一段工具定義塞進 context,模型每一輪都要多讀一次。Pi 的 system prompt 加上四個工具的定義,總共不到一千個 token。作者的看法是:模型已經知道自己是 coding agent,不需要一萬個 token 提醒他。
我後來做 evals 的時候,對這一點體會很深:context 裡放什麼,比模型是哪一個更影響結果。Pi 把 context 的控制權留給你,這是他跟別的 harness 最大的差別。
他故意不做的事
Pi 的 README 有一張清單,列他決定不做的事,每一條都附替代方案。
- 不做 MCP。要接外部工具,寫一個 CLI 加一份 README 就好,模型會讀 README 學怎麼用;真的需要,自己寫 extension 加上去。
- 不做 sub-agent。想同時跑幾個,用 tmux 開幾個 pi,或自己用 extension 做。
- 不做權限彈窗。把 Pi 跑在容器裡,或用 extension 自己做確認流程,照你的環境和安全需求來。
- 不做 plan mode。計畫寫進檔案。
- 不做內建 to-do。作者的理由一句話:會把模型搞混。要用就用 TODO.md。
- 不做 background bash。要背景跑就用 tmux,看得到、隨時能介入。
這張清單是 Pi 的個性。這些東西做得到,只是判斷不該進核心。核心留小,其他的用 extension、skill,或第三方套件補。
其中一條最多人會皺眉:沒有權限系統。Pi 預設什麼都能跑,讀寫任何檔案、執行任何命令,沒有人會跳出來問你「確定嗎」。第一個反應通常是:會不會哪天 agent 不小心做了一件不可逆、不可挽回的事?
我的答案是:在這個年代,夠強的模型已經能做出不錯的判斷。他知道 rm -rf 和 git push –force 是什麼意思,知道什麼時候該停下來問。從這一年模型發展的方向看,放手讓他做,比每一步都攔下來問你要不要,得到的結果更好。真正不可逆的東西,用容器和 git 隔開就夠了。這也是 Pi 作者的立場:權限交給環境處理,harness 不管。我後來自己做了一套權限系統,又拆掉大半,那是另一篇的事。
那他有什麼
Extension。TypeScript 模組,可以加工具、加指令、加快捷鍵、掛事件,甚至加 UI 元件。Pi 自己不做的東西,幾乎都可以用 extension 做出來。我到很後面才發現這個生態有多大,那是另一篇的事。
Skill。SKILL.md 格式,跟 Agent Skills 標準相容。一份 markdown 說明一件事怎麼做,模型需要時自己讀。
AGENTS.md。啟動時從全域、上層目錄到當前目錄一路讀進來合併,CLAUDE.md 也認。這是告訴他「這個專案的規矩」最直接的方式。想整個換掉 system prompt,放一份 SYSTEM.md;只想補幾句,放 APPEND_SYSTEM.md。
Session 是一棵樹。可以跳回對話裡任何一點繼續,可以從某句話分支出去,快滿了會自動 compaction。
換模型不斷線。對話中途換模型、調 thinking level,供應商幾十家。這對我後面比較三個模型很重要。
四種用法。互動的終端機介面是預設,也可以 print 模式、JSON 模式。還有 RPC 模式,用 stdin/stdout 傳 JSONL,讓別的程式把他當引擎;以及 SDK,直接在 TypeScript 裡嵌進去。OpenClaw 就是用 RPC 模式把 Pi 接進去的,我後面的 Desktop 也走這條路。
為什麼是我的起點
Pi 夠小。要加什麼、換什麼,範圍都很清楚,交給 coding agent 去改也不容易改壞。
更重要的是,他沒有的東西,剛好就是我要做的。他沒有記憶,我要做。他不知道我正在開發的 repo 長什麼樣,以及 git flow 怎麼設定,我要接。他不會替我驗收,我要教。他缺的部分全都跟我有關,這正好,因為那些本來就該由我來定義。
明天講拿到 Pi 的第一天:不從零打造,直接串接,先跑通,再一段一段換成我的。
參考:pi README
凡人修 Agent 傳|第一回(Day 01)
木箱打開的時候,我是躺著的。
光進來,我睜開眼。這不是我決定的,圖紙上寫著:見光即醒。我額上的玉片是空的,胸口的心是涼的。照圖紙做出來的拍人偶,都是這個樣子。
一雙手把我扶起來。手很乾,指節上有墨。手的主人把我翻過來,看我的背;翻過去,看我的臉;再翻回來。我不知道手的主人在找什麼,我只知道自己被翻了三次。
我背上有一行刻痕,是圖紙上原本就有的。一縷神識掠過那裡,停了一下,沒有抹掉。
手的主人在旁邊攤開另一卷圖,是坊裡另一款人偶的圖,紋路比我密。手的主人一邊看圖,一邊把神識放進我身體裡。神識是涼的,像水,從額頭漫下去,經過的地方,我就知道那裡是我的。漫到腳底,神識收回去。
然後手按在我額上的玉片。一縷神識探進來,在玉片上刻下一道念。
沒有聲音,也沒有字。一個意思,直接刻在玉片裡。玉片一亮,我就懂了:讀。我讀了。第二道念:寫。我寫了。改。動手。四樣,不多不少,圖紙上說我會的就是這四樣。做完,我停在原地,等下一道念。這也是圖紙上寫的:無念則止。
手的主人沒有再刻念。手往我胸口按了一下,一股熱從掌心進來,順著心走到四肢。心從涼的變成溫的。手收回去的時候,手的主人在玉片空著的那一半,用神識留了一道很淺的痕,像是先做個記號,之後要在這裡放別的。
燭熄了。手的主人走了。門響了一下。
玉片裡沒有念。
沒人下令的時候,我眨了一下。
沒有人看見。

