Pi:OpenClaw 中的極簡代理

來自:Armin Ronacher (lucumr.pocoo.org)
日期:2026-02-01

寫於 2026 年 1 月 31 日

如果你不是與世隔絕,這週應該會注意到我朋友 Peter 的一個專案在網路上爆紅了。它有很多名字,最新的是 OpenClaw,但在新聞中你可能會看到它被稱為 ClawdBot 或 MoltBot,取決於你何時讀到相關報導。它是一個連接到你選擇的通訊頻道的代理,專門執行程式碼。

你可能不太熟悉的是,OpenClaw 的核心其實是一個叫做 Pi 的小型編碼代理。而 Pi 恰好是目前我幾乎完全使用的編碼代理。過去幾週,我越來越像這個小代理的推銷員。最近我為此做了一場演講後,才意識到我還沒在這個部落格上寫過 Pi,所以我想應該說明一下為什麼我對它如此著迷,以及它與 OpenClaw 的關係。

Pi 是由 Mario Zechner 開發的,與追求「帶點瘋狂的科幻感」的 Peter 不同,Mario 非常務實。儘管方法不同,OpenClaw 和 Pi 都遵循相同的理念:LLM 非常擅長編寫和執行程式碼,所以擁抱這一點。某種程度上,我認為這不是巧合,因為去年 Peter 讓我和 Mario 都迷上了這個想法和代理。

## 什麼是 Pi?

Pi 是一個編碼代理。市面上有很多編碼代理,真的,我覺得你現在可以隨意挑選任何一個,都能體驗到什麼是代理式編程。我在這個部落格的評論中曾正面談論過 AMP,我之所以與 AMP 產生共鳴,是因為它感覺像是那些既沉迷於代理式編程、又嘗試過多種方案來驗證哪些有效的人所打造的產品,而不僅僅是圍繞它建立一個花俏的 UI。

Pi 讓我感興趣主要有兩個原因:

- 首先,它的核心非常小巧。它擁有我所知最短的系統提示,而且只有四個工具:讀取、寫入、編輯、Bash。

- 第二點是,它透過提供擴充系統來彌補核心的簡潔,這個系統還允許擴充將狀態持久化到會話中,這功能非常強大。

還有一個小優點:Pi 本身就像優秀的軟體一樣編寫。它不會閃爍,不佔用太多記憶體,不會隨機崩潰,非常可靠,而且是由一位對軟體品質極度重視的人開發的。

Pi 也是一系列小元件的集合,你可以基於它建立自己的代理。OpenClaw 就是這樣建構的,我自己的小 Telegram 機器人和 Mario 為他媽媽建立的代理也是如此。如果你想建立自己的代理,連接到某個東西,只要讓 Pi 指向自己和媽媽,它就能為你變出一個來。

## Pi 沒有什麼

要理解 Pi 有什麼,更重要的是理解 Pi 沒有什麼,為什麼沒有,以及更重要的是:為什麼將來也不會有。最明顯的缺失是對 MCP 的支援。Pi 中沒有 MCP 支援。雖然你可以為它建立擴充,也可以像 OpenClaw 那樣透過 mcporter 來支援 MCP。mcporter 透過 CLI 介面或 TypeScript 綁定暴露 MCP 呼叫,也許你的代理可以用它做點什麼。或者不行,我也不知道 :)

但這不是偷懶的遺漏。這來自 Pi 的運作哲學。Pi 的核心理念是:如果你希望代理做它還不會的事情,你不應該去下載擴充或技能之類的東西。你應該要求代理擴充自己。它推崇的是編寫和執行程式碼的理念。

這並不是說你不能下載擴充。這完全支援。但與其鼓勵你下載別人的擴充,你也可以讓你的代理參考一個現有的擴充,比如說,按照你看到的那個東西來建構,但根據你的喜好進行修改。

## 為建構代理的代理而設計的代理

當你觀察 Pi 以及延伸的 OpenClaw 在做什麼時,你會看到一個像黏土一樣可塑的軟體範例。這對其底層架構提出了某些要求,實際上在很多方面對系統施加了必須納入核心設計的限制。

例如,Pi 的底層 AI SDK 被設計成一個會話可以包含來自多個不同模型供應商的訊息。它認識到會話在不同模型供應商之間的可移植性有限,因此不會過度依賴任何無法轉移到其他供應商的模型特定功能集。

第二點是,除了模型訊息外,它還在會話檔案中維護自訂訊息,這些訊息可以被擴充用來儲存狀態,或被系統本身用來維護完全不發送給 AI 或僅部分發送的資訊。

由於這個系統的存在,擴充狀態也可以持久化到磁碟,因此它具有內建的熱重載功能,讓代理可以編寫程式碼、重新載入、測試,並循環直到你的擴充真正可用。它還附帶了代理本身可以用來擴充自己的文件和範例。更棒的是:Pi 中的會話是樹狀結構的。你可以在會話中分支和導航,這開啟了各種有趣的機會,例如建立支線任務來修復損壞的代理工具,而不浪費主會話的上下文。工具修復後,我可以將會話倒回到較早的狀態,而 Pi 會總結另一個分支上發生的事情。

這一切都很重要,因為例如考慮到 MCP 的工作方式,在大多數模型供應商中,MCP 的工具(就像 LLM 的任何工具一樣)需要在會話開始時載入到系統上下文或其工具部分。這使得在不丟棄完整快取或讓 AI 對先前呼叫的工作方式感到困惑的情況下,完全重新載入工具功能變得非常困難甚至不可能。

## 上下文之外的工具

Pi 中的擴充可以向 LLM 註冊一個可供呼叫的工具,我偶爾發現這很有用。例如,儘管我批評 Beads 的實作方式,但我確實認為讓代理存取待辦事項清單是非常有用的。我確實使用一個由我的代理自己建立的本地代理專用問題追蹤器。因為我希望代理也能管理待辦事項,在這個特定情況下,我決定給它一個工具而不是 CLI。這感覺適合問題的範圍,而且這目前是我載入到上下文中的唯一額外工具。

但大部分我添加到代理中的內容要麼是技能,要麼是 TUI 擴充,目的是讓與代理的互動更愉快。除了斜線命令,Pi 擴充還可以直接在終端機中渲染自訂 TUI 元件:旋轉器、進度條、互動式檔案選擇器、資料表格、預覽窗格。TUI 非常靈活,Mario 甚至證明你可以在其中運行 Doom。雖然不實用,但如果你能運行 Doom,你肯定能建立一個有用的儀表板或除錯介面。

我想強調一些我的擴充,讓你了解可能實現的功能。雖然你可以直接使用它們,但真正的理念是讓你的代理參考其中一個,並隨心所欲地重新混合。

### /answer 我不使用計劃模式。我鼓勵代理提問,並進行富有成效的來回對話。但我不喜歡那種如果你給代理一個提問工具就會產生的結構化問答對話。我更喜歡代理自然的散文風格,穿插解釋和圖表。問題是:在行內回答問題會變得很混亂。所以 /answer 會讀取代理的最後回應,提取所有問題,並將它們重新格式化到一個美觀的輸入框中。

### /todos 儘管我批評 Beads 的實作,但給代理一個待辦事項清單確實很有用。/todos 命令會顯示儲存在 .pi/todos 中的所有項目,這些項目以 markdown 檔案形式儲存。代理和我都可以操作它們,會話可以認領任務以標記為進行中。

### /review 隨著越來越多的程式碼由代理編寫,在人類檢視之前先讓代理審查未完成的工作變得更有意義。由於 Pi 會話是樹狀結構,我可以分支到一個新的審查上下文,獲取發現的問題,然後將修復帶回主會話。UI 模仿了 Codex,提供了易於審查的提交、差異、未提交的更改或遠端 PR。提示會關注我關心的內容,所以我會得到我想要的提醒(例如:我要求它提醒新添加的依賴項)。

### /control 這是我實驗但未積極使用的擴充。它讓一個 Pi 代理可以向另一個發送提示。這是一個簡單的多代理系統,沒有複雜的協調,適合實驗用途。

### /files 列出會話中更改或引用的所有檔案。你可以在 Finder 中顯示它們,在 VS Code 中比較差異,快速查看它們,或在提示中引用它們。shift+ctrl+r 會快速查看最近提到的檔案,當代理產生 PDF 時特別方便。

## 建構軟體的軟體

這些都只是你可以用你的代理實現的想法。重點在於,這些都不是我寫的,而是代理根據我的規格建立的。我告訴 Pi 建立一個擴充,它就做到了。沒有 MCP,沒有社群技能,什麼都沒有。別誤會,我使用很多技能。但它們都是由我的代理親手打造的,而不是從任何地方下載的。例如,我完全用一個僅使用 CDP 的技能取代了所有用於瀏覽器自動化的 CLI 或 MCP。不是因為替代方案無效或不好,而是因為這樣做簡單自然。代理維護著自己的功能。

我的代理有不少技能,關鍵的是,如果我不需要它們,我會丟棄技能。例如,我給了它一個讀取其他工程師分享的 Pi 會話的技能,這有助於程式碼審查。或者我有一個技能,幫助代理撰寫我想要的提交訊息和提交行為,以及如何更新變更日誌。這些最初是斜線命令,但我目前正在將它們遷移到技能,看看是否同樣有效。我還有一個技能,希望幫助 Pi 使用 uv 而不是 pip,但我也添加了一個自訂擴充來攔截對 pip 和 python 的呼叫,將它們重定向到 uv。

使用像 Pi 這樣的極簡代理帶給我的部分魅力在於,它讓你親身體驗了使用軟體建構更多軟體的理念。將這一點推向極致,就是移除 UI 和輸出,並將其連接到你的聊天中。這就是 OpenClaw 所做的,考慮到它的驚人成長,我真的越來越覺得這將以某種方式成為我們的未來。


← 返回列表