命令列工具
earendil-works/pi avatar
earendil-works/pi

Pi agent harness:用於 LLM 代理的 TypeScript monorepo

Pi 在 TypeScript 工具包中結合了提供者中立的 LLM API、代理循環、終端介面和編碼 CLI。

105,572 個 Star13,273 個 ForkTypeScriptMIT
GitHub

秒懂

它是什麼?
README 描述了三個套件:統一 LLM API、代理執行環境和編碼代理 CLI,外加一個 TUI 程式庫,並附有容器化指導和供應鏈加固說明。
適合誰用?
Pi 是一個 MIT 授權的 TypeScript monorepo,其 README 重點介紹套件結構、容器化選項、建置步驟和供應鏈控制。API 細節、受支援的平台以及沙箱模式的安全屬性在 README 中未涉及,需要對照 pi.dev 上的文件進行核實。
可以商用嗎?
可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫在最近一天內有新的提交。
用什麼語言寫的?
主要是 TypeScript(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

組成 Pi 的各個套件

README 將該儲存庫描述為 Pi agent harness 專案的主目錄,核心是一個可自我擴充的編碼代理。它列出了三個已發佈的套件:@earendil-works/pi-ai,一個統一的多供應商 LLM API,涵蓋 OpenAI、Anthropic、Google 等;@earendil-works/pi-agent-core,負責工具呼叫和狀態管理的代理執行環境;以及 @earendil-works/pi-coding-agent,互動式編碼代理 CLI。第四個套件 @earendil-works/pi-tui 提供了具備差異渲染的終端 UI 程式庫。README 沒有給出這些套件的 API 細節或用法範例,因此需要對照 pi.dev/docs/latest 上的文件或套件原始碼進行核實。

在 earendil-works/pi 的第 1 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

權限留給宿主系統

README 明確說明了 Pi 不做什麼:它沒有內建的權限系統來限制檔案系統、程序、網路或憑證存取。預設情況下,代理以啟動它的使用者和程序的權限執行。如需更強的邊界,專案指向容器化或沙箱化,並記錄了三種模式:Gondolin 擴充,將 pi 和供應商認證保留在宿主機上,同時把內建工具路由到本機 Linux 微虛擬機器;普通 Docker,將整個 pi 程序放在本機容器中實現簡單隔離;以及 OpenShell,在策略控制的沙箱中執行整個 pi 程序。README 沒有聲稱這些模式具備何種安全屬性。

在 earendil-works/pi 的第 2 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

開發腳本

在 monorepo 中開發時,首先執行 npm install --ignore-scripts 以跳過生命週期指令碼,然後執行 npm run build,它會重新整理模型資料並建置所有套件。npm run build:offline 使用現有模型資料在無網路的情況下重新建置。npm run check 執行 lint、格式化和型別檢查。測試透過 ./test.sh 執行,在沒有 API 金鑰時會跳過依賴 LLM 的測試;./pi-test.sh 可從任意目錄從原始碼執行 pi。README 未說明具體使用的測試框架,也未詳細描述目錄結構。

在 earendil-works/pi 的第 3 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

從發佈原始碼建置獨立二進制

GitHub 發佈包含一個帶版本號的原始碼歸檔,由該發佈的 SHA256SUMS 檔案覆蓋。README 記錄了建置獨立二進制的步驟:解壓歸檔並執行 ./scripts/build-binaries.sh --offline-model-data --platform linux-x64 --out "$PWD/out"。--offline-model-data 旗標使用原始碼歸檔中自帶的產生供應商模型資料建置,而不是從線上供應商目錄重新整理。該指令碼會安裝依賴、建置 monorepo、編譯 Bun 可執行檔並暫存執行時期資產。自行提供依賴的套件維護者可傳 --skip-install --skip-deps。README 未列出其他受支援的平台,也未說明暫存資產的具體內容。

在 earendil-works/pi 的第 4 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

供應鏈加固措施

專案將 npm 依賴變更視為需要審查的程式碼變更。直接外部依賴被固定到精確版本,內部工作區套件保持版本範圍。.npmrc 設定了 save-exact=true 和 min-release-age=2,以避免在 npm 解析時遇到當天發佈的依賴。package-lock.json 是依賴的真實來源,預先提交鉤子會阻止意外提交鎖檔案,除非設定 PI_ALLOW_LOCKFILE_CHANGE=1。npm run check 驗證固定的直接依賴、原生 TypeScript 匯入相容性以及產生的 coding-agent shrinkwrap。已發佈的 CLI 套件包含 npm-shrinkwrap.json,用於為 npm 使用者固定傳遞依賴。CI 使用 npm ci --ignore-scripts 安裝,一個排定工作流程執行 npm audit --omit=dev 和 npm audit signatures --omit=dev。shrinkwrap 產生對依賴生命週期指令碼有明確的允許清單。README 未說明稽核工作流程的執行頻率。

在 earendil-works/pi 的第 5 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

貢獻流程與工作階段分享

來自新貢獻者的新 issue 和拉取請求預設會自動關閉,維護者每日審查自動關閉的 issue。貢獻指南位於 CONTRIBUTING.md,AGENTS.md 包含面向人類和代理的專案專屬規則。長期計劃透過 rfc.earendil.com/keyword/pi/ 上的 RFC 追蹤。README 還要求使用者分享其開源編碼代理工作階段;發佈工作階段的工具是 badlogic/pi-share-hf,需要 Hugging Face 帳戶、Hugging Face CLI 和 pi-share-hf 本身。README 連結了範例發佈工作階段,但沒有描述工作階段資料格式。

在 earendil-works/pi 的第 6 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

授權

Pi 採用 MIT 授權,版權歸 Mario Zechner,2025 年。該授權授予使用、複製、修改、合併、發佈、分發、再授權和出售軟體副本的權利,條件是所有副本或實質部分必須包含版權聲明和授權聲明。軟體按原樣提供,不作任何形式的擔保,授權文字對支援、安全保證或維護承諾隻字未提。README 也未說明 pi.dev 上的文件是否適用同一授權。

在 earendil-works/pi 的第 7 個檢查面向,應把專案名稱、README 提到的具體入口與可觀察結果放在一起理解。先確認目前分支 main 的檔案位置,再依文件中的命令或範例執行;若輸入格式、作業系統、編譯器、供應商服務或憑證條件不同,結果就不能直接互相比較。記錄成功輸出、錯誤訊息和程序是否正常結束,才能分辨是功能限制、環境差異還是文件未涵蓋的情況。這個步驟針對 pi 本身,不代表 README 對未描述的使用場景作出保證。還要把實際使用的版本、設定值和輸入樣本留下,否則之後無法說明同一個命令為何得到不同輸出。對照輸入與輸出時,應特別查看專案列出的檔案名稱、參數名稱、佇列或資料欄位,並把可重現的差異寫下來。若 README 沒有描述錯誤處理、併發順序或平台支援,就只能記錄觀察結果,不能補成保證。

編輯結論

Pi 是一個 MIT 授權的 TypeScript monorepo,其 README 重點介紹套件結構、容器化選項、建置步驟和供應鏈控制。API 細節、受支援的平台以及沙箱模式的安全屬性在 README 中未涉及,需要對照 pi.dev 上的文件進行核實。 採用前請先依照 README 中的具體命令與檔案驗證,並把未說明的部分視為未知。

官方來源

  1. Official README
  2. Project repository
  3. Release notes
社群筆記

社群筆記