跳到正文

TROUBLESHOOTING · 按症狀縮小範圍

Pi 故障排查手冊 ​

這不是錯誤程式碼百科,也不從“工作階段(Session)、上下文(Context)、擴充功能(Extension)”這些知識分類開始。先找到你眼前看到的現象,再按同一條路線處理:保留現場 → 檢查最小條件 → 建立乾淨基線 → 每次只恢復一個變數 → 到達停止條件就停。

涉及命令和當前行為的內容核驗於 2026 年 9 月 11 日,本機版本為 Pi 0.80.10。實際輸出不一致時,先以你本機的 pi --help 和 Pi 最新官方文件 為準。

先不要做的事

不要一上來重灌、清空 ~/.pi/agent/、刪除工作階段、執行 pi update --all,或同時停用一批自己記不清的外掛程式。這些動作會改變現場,讓原來的問題更難定位;認證目錄還可能包含私人工作階段與憑據。

先用一分鐘判斷問題在哪一層 ​

看到的現象先進入
普通終端機提示 command not found,或 Pi 介面根本打不開啟動不了
Pi 能開啟,但模型清單為空、缺少目標模型或請求報認證錯誤模型不出來
啟動時出現 .ts、import、工具或命令註冊錯誤擴充功能載入失敗
技能(Skill)能看到卻不執行,或 /skill:name 不存在技能沒觸發
pi -c、pi -r 找不到原來的任務工作階段找不到
介面已經開啟,但傳送後長期沒有新內容突然不響應
上下文接近上限、壓縮失敗或壓縮後忘了關鍵要求上下文爆了
單獨啟用都正常,一起啟用就報錯或行為改變外掛程式互相衝突
Pi 讀錯目錄、修改越界,或“說完成”但檔案不對檔案和工具結果異常

建立最小基線 ​

很多問題都需要先回答一個問題:不用任何專案資源和自動發現資源時,Pi 能不能正常啟動?

在普通終端機執行:

bash
pi --no-approve --no-extensions --no-skills --no-context-files \
  --no-prompt-templates --no-themes --verbose

這條命令只用於排查。它臨時忽略專案資源、擴充功能、技能、上下文檔案、提示模板和主題,但不是沙箱,也不會修復任何東西。

  • 基線也失敗:優先查安裝、Node、終端機、認證或模型服務商(Provider)。
  • 基線正常:問題更可能來自專案目錄、工作階段或某個附加資源。
  • 恢復一個資源後才失敗:已經把範圍縮小到這個資源或它與當前環境的組合。

1. 為什麼啟動不了? ​

你看到的現象

  • 普通終端機顯示 pi: command not found。
  • pi 有輸出,但在進入互動介面前退出。
  • 介面卡在啟動階段,錯誤中出現 Node、模組、設定或資源路徑。

先檢查什麼

先區分“系統找不到命令”和“Pi 已經啟動但初始化失敗”。不要把 Pi 編輯區當作普通終端機,也不要根據舊教學隨機改 PATH。

bash
pwd
command -v node
node --version
command -v pi
pi --version
pi --help

Windows 使用者在本書約定的 Git Bash 中執行這些命令。如果 command -v pi 沒有結果,問題還沒進入 Pi 內部;回到安裝並啟動 Pi核對安裝方式和當前官方要求。

怎樣縮小範圍

如果 pi --version 正常,但互動介面打不開,先執行本頁的最小基線。如果仍卡在啟動網路階段,再試一次:

bash
pi --offline --no-approve --no-extensions --no-skills \
  --no-context-files --no-prompt-templates --no-themes --verbose

--offline 只用於判斷啟動網路操作是否相關。離線能開啟不代表模型服務商呼叫一定正常,也不應直接得出“網路就是唯一原因”。

什麼時候停止

  • 錯誤要求提升系統權限、修改系統目錄或執行陌生安裝指令碼。
  • 你準備刪除整個設定目錄,只為了“試試看”。
  • Node 或 Pi 的來源無法確認,且錯誤涉及被替換的可執行檔案。

保留版本、完整錯誤、終端機型別和 command -v 的路徑,再求助。

2. 為什麼模型不出來? ​

你看到的現象

  • /model 清單為空,或沒有教學裡提到的型號。
  • 能選模型,但傳送後出現未登入、無權限、額度不足或模型不可用。
  • 模型服務商已經發布新模型,本地目錄還沒出現。

先檢查什麼

先把三個問題分開:目錄裡有沒有這個模型、當前有沒有憑據、使用者帳戶是否真有該模型的呼叫權限。安裝 Pi 本身不會自動獲得模型或額度。

bash
pi --list-models
pi --list-models 關鍵詞
pi update --models

前兩條只檢視當前目錄;第三條重新整理模型目錄,不升級 Pi 本體。然後啟動 Pi,在編輯區使用 /login 核對模型服務商、用 /model 重新選擇。

怎樣縮小範圍

常見結果更可能的方向
--list-models 完全沒有目標模型服務商模型目錄或自定義模型服務商設定
清單有模型,但 /model 裡不可用當前模型服務商、範圍過濾或認證狀態
請求返回 401 / 403憑據、訂閱或使用者帳戶權限;以模型服務商的原始錯誤為準
請求返回 429額度、速率限制或併發限制;不要立即反覆重試
請求返回 404 / model not found模型 ID、區域、模型服務商或目錄過期
請求超時或 5xx網路、代理或模型服務商服務狀態

不同模型服務商的狀態碼含義可能不同,這張表只是定位方向。測試付費模型前先確認費用;不要把 API Key 貼到聊天、截圖、專案檔案或命令引數中。

什麼時候停止

  • 登入頁、回撥網域或模型服務商來源不可信。
  • 重試正在持續計費,或 429 尚未恢復。
  • 需要複製 auth.json、完整 Token 或 API Key 才能繼續求助。

3. 為什麼擴充功能載入失敗? ​

你看到的現象

  • 啟動資訊顯示某個 .ts / .js 檔案載入失敗。
  • 擴充功能註冊的命令或工具沒有出現。
  • 載入後 Pi 能啟動,但呼叫自定義工具時報錯。

先檢查什麼

先保留錯誤中的完整檔案路徑和第一條異常。擴充功能在 Pi 程序中執行程式碼,問題可能來自發現路徑、專案信賴(Project Trust)、import、依賴、版本或執行時邏輯。

bash
pi --no-extensions --verbose
pi --no-extensions -e ./path/to/extension.ts --verbose

第一條確認“沒有擴充功能時能否啟動”;第二條關閉自動發現後只顯式載入目標檔案。

怎樣縮小範圍

  • 不帶擴充功能正常,顯式載入失敗:問題已經縮小到該檔案、依賴或當前 Pi 相容性。
  • 顯式載入正常,自動發現失敗:檢查全域與專案發現位置、設定、包(Package)和專案信賴。
  • 啟動正常,只有工具執行失敗:保留該次 Tool Call 輸入與錯誤,問題在執行路徑,不是“沒載入”。
  • 只有 /reload 後失敗:重新啟動做一次冷載入,區分過載狀態和檔案本身。

用 pi list 檢視登記的包,用 pi config 檢視其中哪些擴充功能被啟用。不要為了排查先執行 pi update --all,更新多個包會同時引入更多變數。

什麼時候停止

  • 擴充功能來源不明,或要求憑據、系統權限、刪除檔案與對外傳送。
  • 錯誤指向依賴安裝,但你還沒有審查 package.json 和安裝指令碼。
  • 關閉擴充功能後問題消失,但重新啟用會重複產生越界寫入或危險命令。

4. 為什麼技能沒觸發? ​

你看到的現象

  • 你認為任務應該匹配某個技能,但 Pi 沒有讀取它。
  • /skill:name 不存在。
  • 技能被讀取了,結果卻沒有按說明執行。

先檢查什麼

先區分“沒有發現”“發現但沒有自動選擇”和“已經載入但執行偏離”。確認真正的入口是 SKILL.md,frontmatter 至少有有效的 name 與非空 description。

bash
test -f ./path/to/skill/SKILL.md
sed -n '1,40p' ./path/to/skill/SKILL.md
pi --no-skills --skill ./path/to/skill/SKILL.md --verbose

--no-skills 關閉自動發現,但顯式 --skill 仍然會載入指定路徑。進入 Pi 後使用 /skill:name 可以強制讀取該技能;自動匹配不能保證每次都觸發。

怎樣縮小範圍

  • /skill:name 不存在:檢查路徑、frontmatter、名稱規則和啟動警告。
  • 命令存在,自動任務沒觸發:description 可能沒有準確描述使用場景,或模型沒有選擇讀取;先用顯式命令驗證,不要直接把描述改成“適用於所有任務”。
  • 技能已讀取但找不到指令碼:檢查相對路徑是否以技能目錄為基準、配套檔案是否齊全。
  • 出現同名警告:Pi 會保留先發現的同名技能;先確認實際載入來源,再處理碰撞。

什麼時候停止

  • 技能引導執行未審查的指令碼、安裝依賴、讀取憑據或存取任務外目錄。
  • 為了提高觸發率準備寫一個覆蓋所有任務的寬泛描述。
  • 你無法確認當前載入的是哪一個同名技能。

5. 為什麼工作階段找不到? ​

你看到的現象

  • pi -c 開啟的不是剛才的任務。
  • pi -r 或 /resume 清單裡沒有熟悉的工作階段名。
  • 專案移動、重新命名或換電腦後,原工作階段不再出現。

先檢查什麼

Pi 的工作階段預設按工作目錄組織。pi -c 是繼續當前專案最近的工作階段,不是全域最近聊天。

bash
pwd
pi -r

在選擇器中可用 Ctrl+P 顯示路徑、Ctrl+N 只看命名工作階段。進入候選工作階段後用 /session 核對檔案、ID、訊息數、Token 和成本;發現選錯就退出,不要繼續寫入。

怎樣縮小範圍

  • 回到建立工作階段時的原目錄,再執行 pi -r。
  • 如果知道工作階段檔案或 ID,使用 pi --session <路徑或ID> 精確開啟。
  • 如果當時用了 --no-session,這次對話本來就不會儲存。
  • 如果當時用了 --session-dir,必須回到相同目錄設定或提供具體工作階段路徑。
  • 倉庫被移動或重新命名時,舊工作階段仍可能存在,只是不會自動歸到新路徑下。

什麼時候停止

  • 準備直接編輯 JSONL 來“修復”工作階段樹。
  • 工作階段包含私人提示、憑據或客戶資料,卻準備整份公開上傳。
  • 還沒確認路徑和名稱,就要在選擇器裡批次刪除舊工作階段。

6. 為什麼突然不響應? ​

你看到的現象

  • 傳送後長期沒有文字,但狀態列仍顯示工作中。
  • 卡在一次工具呼叫、網路請求或壓縮(Compaction)。
  • 介面能操作,只有當前工作階段不再向前。

先檢查什麼

先等當前工具的合理完成時間,再按一次 Esc 停止這一輪。Esc 能中止尚未完成的工作,但不能撤銷已經發生的檔案寫入、命令、釋出或對外傳送。

停止後立即記錄:當前模型、最後一個 Tool Call、最後一條可見錯誤、是否已經有檔案變化,以及這次請求是否可能計費。

怎樣縮小範圍

啟動一個不儲存、沒有工具和附加資源的最小測試:

bash
pi --no-session --no-tools --no-extensions --no-skills \
  --no-context-files --verbose

只傳送一句短文字,不讓它讀檔案或執行命令。

  • 最小請求也不返回:優先檢查認證、網路、代理、模型服務商狀態和額度。
  • 最小請求正常,原工作階段不正常:檢查上下文、工作階段歷史或特定模型。
  • 沒有工具時正常,一啟用工具就卡:定位最後一個 Tool Call 和外部程序。
  • 沒有擴充功能時正常:轉到擴充功能排查或衝突排查。

什麼時候停止

  • 相同請求可能計費,卻已經連續重試。
  • 最後一個動作涉及部署、刪除、付款或對外傳送,結果狀態未知。
  • 外部命令仍可能在後台執行,而你準備重複啟動同一任務。

先獨立檢查真實系統狀態,不要把“介面沒回復”直接等同於“動作沒發生”。

7. 為什麼上下文爆了? ​

你看到的現象

  • 狀態列的上下文佔用接近上限。
  • Pi 自動開始壓縮,或 /compact 失敗。
  • 壓縮後還能繼續,但漏掉早期約束、錯誤原文或檔案狀態。

先檢查什麼

先把不能丟的事實寫入專案內的檢查點:目標、禁止事項、已完成、真實檔案變化、失敗原文和唯一下一步。不要把關鍵狀態只留在準備被壓縮的聊天裡。

在 Pi 中用 /session 檢視當前工作階段資訊;需要壓縮時使用:

text
/compact

壓縮需要模型生成摘要。它會用摘要和近期訊息重建後續上下文,不會撤銷磁碟修改,也不保證逐字保留全部舊細節。

怎樣縮小範圍

  • 壓縮前就混入多個無關任務:新增命名工作階段,重新讀取檢查點,通常比連續壓縮更清楚。
  • 單次工具輸出特別大:以後改為讀取必要片段,把長日誌儲存到檔案並提取關鍵行。
  • /compact 本身失敗:保留錯誤;檢查當前模型是否可用、請求是否仍能呼叫模型服務商。
  • 壓縮後漏約束:讓 Pi 重新讀取原需求和檢查點,並逐項複述;不要用新的長解釋繼續覆蓋問題。

什麼時候停止

  • 摘要已經丟失安全邊界或禁止動作,而下一步具有副作用。
  • 連續壓縮仍無法容納單個超大輸入或工具結果。
  • 你無法說明磁碟檔案、工作階段歷史和當前上下文哪一個才是可信來源。

8. 為什麼外掛程式互相衝突? ​

你看到的現象

  • 兩個包單獨啟用正常,一起啟用時啟動失敗。
  • 同名命令、工具或技能指向了意外來源。
  • 載入新外掛程式後,System Prompt、模型、工具選擇或介面行為發生變化。

先檢查什麼

不要先更新全部外掛程式。先記錄“最後一次正常”的資源組合,再檢視當前登記內容:

bash
pi list
pi --no-approve --no-extensions --no-skills --no-context-files \
  --no-prompt-templates --no-themes --verbose

如果幹淨基線正常,就從零開始每次只顯式加入一個資源:

bash
pi --no-extensions -e ./one-extension.ts --no-skills --verbose
pi --no-skills --skill ./one-skill/SKILL.md --no-extensions --verbose

怎樣縮小範圍

  1. 固定同一個目錄、Pi 版本、模型和測試任務。
  2. 先測 A,再測 B,最後測 A+B。
  3. 記錄每次啟動時真實載入的資源和第一處行為差異。
  4. A、B 單獨正常而 A+B 失敗,才有“衝突”的證據。
  5. 確認來源後,可用 pi config 暫停包中的某項資源;一次只改一個開關。

同名技能會發生髮現順序與名稱碰撞;擴充功能還可能註冊同名命令、工具或事件處理器。不要只按包名猜能力,應該檢查實際載入的是擴充功能、技能、模板還是主題。

什麼時候停止

  • 無法確認兩個資源的來源、版本或實際程式碼。
  • 衝突涉及命令攔截、權限控制、憑據、部署或刪除保護。
  • 需要透過刪除整個包目錄、全域設定或所有快取來繼續試錯。

9. 為什麼讀錯檔案、改錯目錄或“完成”卻沒有結果? ​

你看到的現象

  • Pi 回答了內容,但目標檔案不存在或沒有變化。
  • 修改出現在同名的另一個專案裡。
  • Agent 說測試透過,普通終端機復跑卻失敗。
  • Esc 後以為動作已撤銷,實際檔案已經改變。

先檢查什麼

回到真實環境,不問 Agent 自己是否完成:

bash
pwd
git status --short
git diff --check
git diff

不是 Git 專案時,直接開啟目標檔案並檢查修改時間、內容和輸出路徑。再回看工作階段中真正發生的 Tool Call,不要只看最後總結。

怎樣縮小範圍

  • pwd 不對:停止當前工作階段,回到正確目錄再建立或恢復任務。
  • 狀態有範圍外檔案:先保留差異,分清已有變化與本次變化,不做批次恢復。
  • Agent 報告透過但沒有命令輸出:由人在普通終端機執行專案規定的檢查。
  • 本地檔案正確但線上不對:繼續檢查部署版本、構建目錄、快取和正式 URL;本地透過不是線上透過。

什麼時候停止

  • 發現憑據檔案、使用者目錄或任務外倉庫被讀取或修改。
  • 釋出、付款、刪除、訊息傳送的最終狀態無法確認。
  • 為了恢復準備使用覆蓋整個倉庫或使用者目錄的破壞性命令。

求助前整理一份最小證據包 ​

不要只發“壞了”或一張截掉錯誤的截圖。複製下面模板,只填寫與問題有關的部分:

text
現象:
期望結果:
作業系統與終端機:
Pi 版本(pi --version):
Node 版本(node --version):
當前目錄(pwd,可隱去私人上級路徑):
實際啟動命令(刪除 Key 和 Token):
第一條完整錯誤:
最小基線是否能啟動:
只啟用目標資源時的結果:
Provider 與模型名(不要提供憑據):
Session 名稱或 ID(不要上傳整份私人 Session):
已經發生的檔案或外部狀態變化:

一份好的證據包能讓別人判斷問題屬於安裝、模型服務商、工作階段、上下文還是附加資源,也能避免讓你重複已經失敗且可能產生副作用的動作。

全域停止條件 ​

出現以下任一情況,停止自動重試,先由人確認:

  • 憑據、付款、額度或使用者帳戶權限不清楚;
  • 刪除、覆蓋、釋出或對外傳送的最終狀態未知;
  • 擴充功能或技能來源不明,卻要求執行程式碼或安裝依賴;
  • 實際路徑離開任務目錄,或出現無法歸因的檔案變化;
  • 相同請求持續計費、持續 429,或外部服務仍在處理;
  • 修復方案要求清空認證、工作階段、整個設定目錄或整個倉庫;
  • 你沒有辦法儲存當前錯誤、差異和恢復點。

依據與繼續閱讀 ​