跳至內容

灰色方塊、白色卡片,跟紅綠交錯的那幾行

答案旁邊多出來的東西不是裝飾:思考塊、工具卡、diff,記錄的是它想了什麼、做了什麼、想改你哪裡。
2026年9月12日
灰色方塊、白色卡片,跟紅綠交錯的那幾行
OdooBot
watch it work
Pi Agent 指南 · 第 5 篇

灰色方塊、白色卡片,跟紅綠交錯的那幾行

你前幾次的對話,答案旁邊多了一些東西。一個收合起來的灰色方塊。一張寫著工具名稱的白色卡片。一段看起來像修改校正的紅綠交錯文字。這些都不是裝飾。它們記錄的是 agent 想了什麼、做了什麼,以及它想對你的檔案做什麼改動。這篇教你讀懂這三種,也教你哪些可以跳過不看。

3 種區塊
思考塊、工具卡、內嵌 diff
7 個工具
會產生卡片的內建工具
$0.02
一個實際跑過的雙工具任務,邊跑邊計費
為什麼要花時間讀懂它們

答案是主張,這些區塊才是證據。

一般的聊天網頁只給你文字,別無其他。Pi Agent 除了文字,還多給你一份紀錄,因為它不只是在講話——它會讀你的檔案,也會改動它們。

講白一點

水電工跟你說他檢查過鍋爐了。這是答案。壓力計的照片跟零件收據,就是這些區塊。你不會每次都仔細看,但暖氣突然不熱的那個禮拜,你就會仔細看。

這三種都有正式名稱,值得記住,因為軟體出狀況時就是用這幾個詞來講的。

區塊記錄了什麼怎麼認出它
思考塊(Reasoning block)供應商選擇公開出來的思考資訊灰色、收合著,旁邊有個小小的展開控制項
工具呼叫卡(Tool call card)外部工具嘗試做或已經做了的事白色卡片,標著工具名稱
內嵌 diff(Inline diff)一次編輯刪掉了檔案的哪幾行、加了哪幾行紅色跟綠色的行交錯排列

每一行都值得比上一行看得更仔細一點。

一輪對話可以同時帶著這三種。一個真實的 session 可能會把灰色方塊放在最終答案上面、把工具呼叫顯示成白色卡片、再用紅綠呈現檔案的變動——每一種都能展開看細節。你實際上會拿到哪幾種,取決於你選的模型跟這次請求需要什麼。單靠記憶就能回答的問題,可能三種都不會出現。

這些紀錄幫助你檢查,但不會讓任何事情自動變安全。 依你 session 裡啟用的防護機制而定,工具可能在你還沒讀完卡片之前就已經跑完了。看得到,不等於你已經核准。
灰色方塊

容易被忽略,也容易被過度信任

思考塊是灰色的,通常標著 Thinking 或對應的翻譯,通常一出現就是收合狀態。展開後,你會看到這個模型走的路線願意提供的思考文字——可能是一大段、一份簡短摘要,或只有用量的中繼資料。

講白一點

這不是一扇看進模型腦袋裡的窗。它比較像學生寫在考卷邊緣的計算過程——有時候是完整的步驟,有時候是事後整理過的摘要,有時候只是一則「有算過」的註記。有參考價值,但不是宣誓過的證詞。

只有支援的推理模型、走支援的路線,才會有這個東西。答案很奇怪、跟你講過的東西衝突,或是你想看請求怎麼被拆解的時候(例如一個燈光請求怎麼拆成觸發、條件、動作)就展開看。單純查資料、風險低而且你自己就能檢查、或者答案根本用不上的時候,就跳過不看。

你選了推理模型,卻沒有思考塊

照這個順序查三件事:

  • reasoning 選項沒開。 如果一個模型設定裡有個 reasoning 核取方塊,那個開關就決定思考塊會不會被獨立顯示出來。第 3 篇講過這個模型設定。
  • 供應商的 thinkingFormat 設錯了。 這是供應商層級的欄位: zai 給 GLM 用, deepseek 給 DeepSeek 用, qwen 給相容的 Qwen 路線用, openai 只給適用的直接相容 OpenAI 路線用。直接連 Anthropic 的路線通常留空,因為 SDK 用的是它自己的 thinking 內容區塊。解析器選錯了,思考內容就是分不出來。
  • 這個模型根本不是推理模型。 系列名稱會騙人。目錄裡可能把推理版跟非推理版並排列出來,而 Kimi K2-Instruct 這個項目走的是 Instruct 路線,不是 Thinking 路線。要確認精確的模型 ID。
合法的 thinkingFormatopenaiopenroutertogetherdeepseekzaiqwenchat-templateqwen-chat-templatestring-thinkingant-ling。沒有 native ,也沒有 none ——如果哪篇教學叫你填這兩個,那講的是別套軟體。
白色卡片

記錄真實動作的那個區塊

當 agent 需要動手做而不只是寫字的時候,就會出現工具卡。它帶著工具名稱、送出去的輸入,跟拿回來的結果,過程中會顯示 Running…,然後是成功或失敗。

核心套件 @earendil-works/pi-coding-agent,內建七個工具,全部小寫:

工具做什麼要不要展開卡片?
read讀一個檔案建議展開——確認是哪個檔案、讀了多少
write建立或整個取代一個檔案一定要展開——路徑跟內容都要看
edit取代一段符合的內容,並產生 diff一定要展開——把完整的 diff 讀完
bash跑一個 shell 指令建議展開,遇到 rm、mv 或 sudo 絕對不要跳過
grep在檔案裡搜尋通常可以不展開,除非結果看起來怪怪的
find依樣式尋找路徑通常可以不展開——瞄一眼搜尋的根目錄就好
ls列出一個目錄通常可以不展開,不過路徑本身有時候是敏感資訊

像是 read_fileweb_fetchsearch 這種名字屬於別的 agent 系統。這裡沒有內建的網頁擷取;要連網得靠一個 Skill,包在類似 curlplaywright這樣的工具外面,或是單純用 bash: curl … 指令。

Pi Web 進行到一半的任務。上方的請求要求建一個叫 notes.md、帶三個項目點的檔案,再讀回來。接著是兩張工具卡:write notes.md 標著 5s,費用一行寫著 1,180 in、70 out、$0.0080;read notes.md 標著 2s,寫著 1,265 in、18 out、$0.0069。底下 session 顯示 Waiting for model。訊息框變成 Steer now / queue follow-up,帶著 Steer 跟 Follow-up 按鈕,右下角是紅色的 Stop 按鈕。頂部工具列顯示 $0.02。
跑的時候每張卡片都會即時計時、計費,session 的累計總額就在頂部工具列。進行中的工作區
  • 每張卡片標著 自己的工具跟檔案 —— write notes.md 花了 5 秒, read notes.md 花了 2 秒——下面各自有一行費用,不用自己算,慢的或貴的那一步一眼就看得出來。
  • $0.02 在頂部工具列,是這個 session 目前累計的總額。這是整場對話的金額,不是一個月的用量。
  • Waiting for model… 是最後一個工具結果跟寫出來的答案之間的空檔。沒有卡住。
  • 訊息框會變成 Steer now / queue follow-up ,帶著 SteerFollow-up 按鈕,而右下角的紅色 Stop 則是你的手煞車,留給你讀到一個沒預期到的 bash 指令的那一刻用。

跑完之後,這一輪會收合成一行摘要,隨時能重新打開。

同一個任務結束後的樣子。收合成單獨一行,寫著 Process details、2 messages、2 tool calls。底下的答案開頭寫著 Created notes.md with,接著三個項目點。下面是一個 notes.md 檔案標籤,跟一行費用 187 in、57 out、1,152 cache R、$0.0032。左邊 EXPLORER 面板裡,notes.md 已經出現。
跑完之後兩則訊息、兩次工具呼叫、一個新檔案——左邊的檔案總管顯示得出來。進行中的工作區
  • Process details · 2 messages · 2 tool calls 是這次執行收合後的紀錄。點開那一行就能拿回所有卡片。
  • EXPLORER 裡的 notes.md 在左邊,就是這個檔案現在真的存在的證明。答案旁邊那個小標籤也標出了它的名字。
  • 費用那一行最後寫著 1,152 cache R ——這部分輸入是從快取拿的,這也是為什麼同一個 session 裡的追問,常常比第一則訊息便宜的原因之一。
工具失敗了,後面接的答案照樣可以寫得很有自信。 如果卡片是紅色的,展開它,讀 isError 的輸出內容,並且確認在你讓它再試一次之前,有沒有一部分改動已經生效了。
紅綠交錯的那幾行

你這邊最後一道人眼把關

刪掉的行是紅色,前面帶一個 -。新增的行是綠色,前面帶一個 +。中間白色的行是沒改動的上下文,就跟程式碼託管網站上的 diff 一模一樣。

講白一點

想像編輯器改完稿子傳回來的追蹤修訂。畫掉的文字是要拿掉的,加底線的是新加進來的,其餘的留著是為了讓你看清楚改在哪裡。要接受之前,全部讀完,不是只看前兩行。

當 agent 對一個它有基準版本可比對的檔案,提出或執行一次編輯時,就會出現 diff。一段獨立的程式碼範例沒有基準版本,所以不會產生 diff——這本身就是個訊號,代表沒有東西真的跟你實際的檔案比對過。

把整個修補讀完,不要只看螢幕裝得下的部分。像 Show detailsApplyCopyCompare HEAD 這類控制項,有沒有、長什麼樣,要看你的 pi-web 版本跟啟用的防護機制,你看到的可能不一樣。

處理一個 diff 有三種做法

手動複製一份你已經檢查過的版本

最保守的做法。對照原始版本,保持 YAML 的縮排完整,只套用你真的讀懂的那部分。

讓它用 edit 或 write

比較建議用 edit 做局部的精確改動,而不是用 write 整個換掉檔案。不管哪一種,卡片都還是要看:路徑、完整內容,以及有沒有已經跑過了。

拒絕,並說明理由

指名哪一行必須留著、行為要怎麼改。你會拿到一個新的 diff——要從頭再檢查一次,不是接著上次停下的地方繼續。

動手改 configuration.yamlautomations.yamlscripts.yaml.storage/之前:先備份,並確認你知道怎麼還原。任何備份都取代不了驗證語法跟安全測試改動這件事。
一次請求,一塊一塊拆開看

一輪對話從頭到尾實際長什麼樣

假設你要求一個晚上十點的客廳燈光自動化。這個 session 有檔案工具,還有 home-assistant-best-practices 這個 Skill——它加的是指引,不是新工具,會把 agent 推向用 edit 而不是整個重寫 automations.yaml。這一輪回來的東西,可能分成五個部分。

flowchart TD
  A["1 · 思考塊
22:00 觸發、light.turn_off
目標 light.living_room"] --> B["2 · 工具卡:read
path: /config/automations.yaml"] B --> C["3 · 工具卡:edit
加上新增項目的內嵌 diff"] C --> D["4 · 同一張卡片裡的結果
成功,或 old_string 沒對上"] D --> E["5 · 最終答案
一份摘要,加上重新載入的指引"] E --> F["6 · 你驗證設定
並安全地測試這個自動化"]
一次編輯的樣貌步驟 1 到 5 是 agent 在做。步驟 6 是你,而前五步不管做得多好,都免不了這一步。
區塊裡面裝著什麼你該做的事
1 · Reasoning講出來的做法——觸發、動作、目標,要不要加條件選讀。看它的思路,但不要當成證據
2 · read 卡片輸入 path: /config/automations.yaml;輸出是現有的檔案內容確認路徑對,也確認讀的範圍夠不夠
3 · edit 卡片與 diff old_stringnew_string,呈現成新增的自動化,帶著它的 alias、triggers 跟 actions一定要看。檢查 light.living_room、縮排,還有有沒有動到不該動的地方
4 · 結果成功,或是同一張 edit 卡片裡的失敗出錯通常代表 old_string 沒對上。成功不代表 YAML 語法就是合法的
5 · 最終答案一份摘要,說已經加了一條規則,再加上驗證跟重新載入的指引驗證設定,並且安全地測試這個自動化
為什麼 edit 是比較安全的做法。 它要求跟舊文字精確吻合。這限制了誤觸大範圍替換的可能,也能擋掉模型自己編出來的上下文。但這仍然不能證明替換的內容是對的。

如果你只讀「完成了」這幾個字,你就從沒看過路徑、entity ID、精確的 YAML,或這個工具到底有沒有真的成功。這四件事,就活在這些區塊裡。

它們花掉你多少錢

每個區塊都是 token

這三種都可能增加你的用量,只是各家路線計費方式不同。一個思考塊可能就多出幾百到幾千個 token。一個很大的 read 會把很多檔案內容塞進你的 context,而這個 context 下一輪還會再繞回來一次。

講白一點

把思考塊收起來,就像把計程車的跳表器折起來不看。車資不會因此改變。真的想少花錢,就縮短行程或換一台車——不是把數字藏起來。

真正會改變數字的,是這三個:

  • 只有任務真的需要時才用 reasoning。 單純查資料或風險低的問題,從你的目錄裡選一個目前比較便宜、不推理的模型就好。
  • 問之前先想清楚它需要多少檔案內容。 如果只有某個範圍重要,就要求那個範圍就好,不要把幾千行不相干的內容都塞進 context。
  • 一個 session 變長了,就開新的。 舊的思考塊跟工具輸出會一路帶進之後的每一輪。盯著 contextUsage 這個指標看,如果你的版本有顯示 context window 用掉的百分比。
沒有一個放諸四海皆準的警戒門檻。 不要把 60% 當成保證會斷線的門檻,也不要等供應商拒絕請求才反應。以你目前這條路線官方文件記載的限制為準。

至於能不能把它們藏起來:官方文件記載的 0.8.4 版本基準,沒有一個保證能壓住所有思考塊的全域開關。有的只是「一開始要不要展開」的顯示偏好設定。

Pi Web 的 Settings 對話框,停在 General 分頁,旁邊有 Models、Skills、Sub-agents、Plugins 分頁。Appearance 提供 Light、Dark、System 三個選項,選在 System。Chat 底下,一個標著 Expand thinking blocks by default 的開關是關閉的,接著是設成 820px 的 Chat content width、設成 14px 的 Chat font size,還有一個 Show actions for selected text 開關。
Settings → General是顯示偏好,不是計費開關。
  • Expand thinking blocks by default 就是大家在找的那個開關。這裡是關閉的,所以思考塊一出現就是收合狀態。它決定的是顯不顯示,不是有沒有在推理。
  • Appearance ——Light、Dark 或 System,這裡設成 System,跟著你瀏覽器本來的主題走。
  • 這個分頁其餘的部分是 Chat content width 設成 820px,還有 Chat font size 設成 14px。這些是閱讀舒適度,跟一輪對話花多少錢無關。

真的想省下推理的花費,就在路線支援的地方改模型設定裡的 reasoning 選項,或者選一個不推理的模型 ID。畫面整潔一點,不會讓帳單變少。

區塊出狀況的時候

六種會出狀況的情形

思考塊展不開
先等生成結束。還是打不開的話,重新載入頁面,再試試沒裝擴充功能的無痕視窗。在假設區塊是空的之前,先按 F12 看瀏覽器主控台有沒有真的跳出 JavaScript 錯誤。
工具卡回報錯誤
展開它,讀 isError 的輸出內容。常見原因:路徑錯了,例如寫成 /config/automations.yaml 但你的檔案其實不在那裡,或者一個 bash 指令回傳非零的結束碼,或者一個 edit ,它的 old_string 沒對上。要求重試之前,先搞清楚有沒有部分改動已經生效。
複製過來的 diff 把 YAML 的縮排搞壞了
對照原本的空白字元——tab 跟空白在螢幕上長得一模一樣,實際上不是同一種。只有在整個換掉檔案真的是對的做法時,才要求一份完整檢查過的檔案,不要拿它當成逃避讀 diff 的藉口。
工具卡停在「Running…」
看是哪個工具。範圍很廣的 find /、跑很久的 ffmpeg ,或非常大的 read 本來就需要時間;由 Skill 提供的網路工具也是另一個可能很慢的候選。如果你的版本有提供 Cancel 就用它,再檢查結果的 isError 狀態。
沒有出現 diff——只有程式碼
diff 需要一個基準版本。如果你從沒給過它實際的 automations.yaml,它就沒東西可以比對。先叫它讀真實的檔案,再進行編輯。
diff 裡的程式碼看起來沒問題,但你不太確定
一個字元一個字元核對 entity ID(light.living_room,不是 light.liveing_room)。拒絕不是你原意的路徑,例如 /。確認你目前情境下 Home Assistant 的語法,包括它要的是 service:action:。如果你看不懂縮排,就要求先用白話逐行解釋,再套用任何東西。
接下來

接下來往哪走

繼續

你現在能讀懂一輪對話了。接下來換選一個決定它長什麼樣的東西。

第 6 篇會問一個你大概已經想過的問題:一家供應商,還是不只一家?大部分時候答案是「先待在原地就好」——但它會告訴你,什麼時候這個答案不再成立。

打開完整教學手冊

Pi Agent 入住指南》系列第 5 篇,由 WoowTech 渥屋科技 製作。

內容出自 Woow HA Pi Agent 入住指南,依 CC BY 4.0 釋出。

The Smart Space Solution · 智慧空間解決方案 · © 2026 WOOW Technology Co., Ltd.

網誌: Pi Agent 指南
分享這個貼文