2026年10月11日 星期日

2026 年第 39 周記事

寒露已過, 秋意漸濃, 最近要趁有太陽把長袖衣服拿出來洗曬備用了. 本周我還是繼續在測試我的 Pi 4 小龍蝦, 基本上已經能用了, 目前是以 Gemini 2.5 Flash 為主要模型, 以 GPT 5.6 Luna 為備援模型, 之前沒有指定 Luna 預設會用最貴的 Sol, 問一聲早安居然要花 2 元台幣真是嚇我一跳. 

鄉下家的 LG 洗衣機會發出怪聲問題, 上回與 LG 技師商談決定請燦坤先幫我移機到室內浴廁旁, 看看還會不會有同樣問題, 但一個月過去了都沒消息, 今天再次打電話給燦坤, 店員說不知道, 要我明天再打給店長. 我覺得燦坤在服務上似乎沒有紀錄追蹤客訴問題, 以後買電器還是找全國電子較好. 週日傍晚小舅拿炒米粉來時, 我問是否可以聯絡他做水電的朋友下周六來幫我移洗衣機, 順便修廚房水龍頭. 

爸周一看到對面張家伙房掛起紅燈籠, 打電話給我說不知出了甚麼事, 我傳訊息問秀菊妹妹, 她說是她二嬸婆 (也就是松盛伯母) 仙逝, 享嵩壽 97. 我週二回鄉下, 周三一早去水圳邊叔婆的雜貨店買了金香拿去張家伙房捻香後才回高雄上班. 下周三早上出山, 所以我下周二下班後回鄉下, 週三告別式後再去上班. 

雙十國慶連假這三天完成樓上與樓下兩間和室清理, 棉被全部趁三天大太陽曬了個遍, 下周用除螨機吸過後裝黑塑膠袋收納, 以後直接整包給太陽曝曬即可. 另外也把樓下和室那張之前小姨子家不要的兒童學習桌搬出來客廳當電腦桌, 這樣姐姐與二哥回來要趕工時就有桌子可用. 總之, 過年前要把老家的房間一間間都清出來. 

下周任務清單 :
  • 安裝前門左右側照明燈. 
  • 二樓舊參考書丟回收. 
  • LG 洗衣機移機.
  • 清理書房.
  • 組衣櫥.

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (二十)

前一篇針對 Groq 的 GPT OSS 120B 模型的測試發現 Free 帳戶幾乎無法在 OpenClaw 中正常使用, 所以還是切回 primary: gemini-2.5-flash 與 fallback: gpt-5.6-luna 配置, 順便對 Gemini 2.5 Flash 做效能測試. 

本系列全部測試文章索引參考 :



1. 復原主備援模型 :

復原程序如下 : 

設定 primary 模型為 Gemini 2.5 Flash : 

pi@pi4b:~ $ openclaw config set agents.defaults.model.primary "google/gemini-2.5-flash" 
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'm not magic—I'm just extremely persistent with retries and coping strategies.

Updated agents.defaults.model.primary. Change will apply without restarting the gateway.

設定備援模型清單, 只設定單一成員 GPT 5.6 Luna : 

pi@pi4b:~ $ openclaw config set agents.defaults.model.fallbacks '["openai/gpt-5.6-luna"]'
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.

Updated agents.defaults.model.fallbacks. Change will apply without restarting the gateway.

檢視設定結果 : 

pi@pi4b:~ $ openclaw config get agents.defaults.model 

OpenClaw 2026.7.1-2 (0790d9f) — Less clicking, more shipping, fewer "where did that file go" moments.

{
  "primary": "google/gemini-2.5-flash",
  "fallbacks": [
    "openai/gpt-5.6-luna"
  ]
}

驗證設定檔是否有效 : 

pi@pi4b:~ $ openclaw config validate
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I run on caffeine, JSON5, and the audacity of "it worked on my machine."

Config valid: ~/.openclaw/openclaw.json

最後殺程序觸發服務重啟 : 

pi@pi4b:~ $ pkill -9 -f openclaw  


2. 能力測驗 :

以下對 Gemini 2.5 Flash 進行五項能力考驗 : 


(1). 網路搜尋 :

提示詞如下 : 

台積電 ADR 目前價格? 

結果 : 




(2). Python 知識 :

提示詞如下 :

請用繁體中文解釋 Python 的 list、tuple、set 三者差異。
要求:
1. 用表格比較
2. 各給一個實際例子
3. 說明什麼情況下應該選哪一個

結果如下 : 

關於三個資料結構差異, 其回應如下 :

好的,Tony,這就為您解釋 Python 中 list、tuple、set 三者的差異,並附上表格比較、實際例子及使用時機建議。

Python list, tuple, set 差異比較

實際例子

1. list (列表) 範例

2. tuple (元組) 範例

3. set (集合) 範例

什麼情況下應該選哪一個?

*   選擇 list (列表) 的時機:
    *   當您需要一個可變的序列,允許新增、刪除或修改元素。
    *   元素的順序很重要,且可以包含重複的元素。
    *   例如:待辦事項清單、歷史紀錄、資料庫查詢結果集。

*   選擇 tuple (元組) 的時機:
    *   當您需要一個不可變的序列,一旦定義就不希望其內容被修改。
    *   元素的順序很重要,且可以包含重複的元素。
    *   經常用於表示固定數量和順序的資料,例如:座標點 (x, y)、RGB 顏色值 (R, G, B)、函數的多個返回值。
    *   元組可以作為字典的鍵 (因為其不可變性)。
    *   作為函數參數傳遞時,可以確保資料不會在函數內部被意外修改。

*   選擇 set (集合) 的時機:
    *   當您需要儲存一系列獨一無二的元素,不關心元素順序。
    *   需要高效地檢查元素是否存在於集合中 (通常比列表快)。
    *   需要進行數學上的集合操作,例如:聯集 (union)、交集 (intersection)、差集 (difference) 等。
    *   例如:追蹤網站的唯一訪客 IP 位址、找出兩個班級共同的學生、從列表中去除重複元素。
Usage: 14k in / 1.5k out




程式碼範例 : 






(3). 推理能力 :

提示詞如下 :

有 100 顆球,其中 1 顆重量不同,但不知道它比較重還是比較輕。只有一個沒有砝碼的天平,最多可以秤 3 次。請找出異常球,並判斷它是比較重還是比較輕。請完整說明策略。

結果如下 :

這個問題在數學上,對於 100 顆球並在最多 3 次秤重內找出異常球並判斷輕重,是不可能解決的。

原因解釋:

1.  天平秤重的結果數: 一個沒有砝碼的天平每次秤重有 3 種可能結果:
    *   左邊重
    *   右邊重
    *   兩邊一樣重
2.  3 次秤重的最大區分能力: 如果最多秤 3 次,則總共可以得到 $3 \times 3 \times 3 = 3^3 = 27$ 種不同的結果。
3.  100 顆球所需區分的可能性:
    *   我們要從 100 顆球中找出哪一顆是異常球,這有 100 種可能性。
    *   還要判斷這顆異常球是比正常球重還是輕,這有 2 種可能性。
    *   因此,總共需要區分的可能性為 $100 \times 2 = 200$ 種。
4.  結論: 因為 200 (所需區分的可能性) > 27 (3 次秤重能提供的最大結果數),所以不可能在 3 次秤重內解決 100 顆球的問題。

解決類似問題的策略 (以 12 顆球為例,這是可以在 3 次秤重內解決的最大數量之一):

雖然 100 顆球無法解決,但我可以完整說明這種邏輯問題的解決策略,以 12 顆球為例(12 顆球有 $12 \times 2 = 24$ 種可能性,小於 27,因此可解)。

目標: 從 12 顆球中找出 1 顆異常球,並判斷它是重還是輕。

球的編號: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

第一次秤重: (將 12 顆球分為三組,每組 4 顆)

*   左邊: (1, 2, 3, 4)
*   右邊: (5, 6, 7, 8)
*   保留: (9, 10, 11, 12)

結果分析:

1.  情況一:天平兩邊相等 (1,2,3,4) = (5,6,7,8)
    *   推斷: 球 1-8 都是正常的。異常球在保留的 (9, 10, 11, 12) 這 4 顆球中。
    *   剩餘任務: 從 4 顆球中找出異常球並判斷輕重,有 8 種可能性 ($4 \times 2 = 8$),剩下 2 次秤重。

2.  情況二:左邊輕 (1,2,3,4) < (5,6,7,8)
    *   推斷:
        *   異常球在 (1,2,3,4) 中且比正常球輕 (Lighter)。
        *   或者異常球在 (5,6,7,8) 中且比正常球重 (Heavier)。
    *   推斷: 球 9-12 都是正常的。
    *   剩餘任務: 從 8 顆球中找出異常球並判斷輕重 (已知輕或重),有 8 種可能性 ($4 \text{L} + 4 \text{H} = 8$),剩下 2 次秤重。

3.  情況三:左邊重 (1,2,3,4) > (5,6,7,8)
    *   推斷:
        *   異常球在 (1,2,3,4) 中且比正常球重 (Heavier)。
        *   或者異常球在 (5,6,7,8) 中且比正常球輕 (Lighter)。
    *   推斷: 球 9-12 都是正常的。
    *   剩餘任務: 與情況二對稱,從 8 顆球中找出異常球並判斷輕重,有 8 種可能性,剩下 2 次秤重。

第二次秤重 (以情況一為例:異常球在 9,10,11,12 中):

*   已知: (1,2,3,4,5,6,7,8) 都是正常球。
*   左邊: (9, 10, 11) (三顆可疑球)
*   右邊: (1, 2, 3) (三顆正常球)
*   保留: (12) (一顆可疑球)

結果分析:

1.  情況 1.1:天平兩邊相等 (9,10,11) = (1,2,3)
    *   推斷: 球 9,10,11 都是正常的。異常球是 12。
    *   剩餘任務: 判斷球 12 的輕重,剩下 1 次秤重。

2.  情況 1.2:左邊重 (9,10,11) > (1,2,3)
    *   推斷: 異常球在 (9,10,11) 中且比正常球重。
    *   剩餘任務: 從 3 顆球中找出較重的異常球,剩下 1 次秤重。

3.  情況 1.3:左邊輕 (9,10,11) < (1,2,3)
    *   推斷: 異常球在 (9,10,11) 中且比正常球輕。
    *   剩餘任務: 從 3 顆球中找出較輕的異常球,剩下 1 次秤重。

第三次秤重 (接續情況 1.1, 1.2, 1.3 的子情況):

*   接續 1.1 (異常球是 12):
    *   左邊: (12)
    *   右邊: (1) (正常球)
    *   結果:
        *   12 > 1:球 12 較重。
        *   12 < 1:球 12 較輕。

*   接續 1.2 (9,10,11 中有一顆較重):
    *   左邊: (9)
    *   右邊: (10)
    *   結果:
        *   9 > 10:球 9 較重。
        *   9 < 10:球 10 較重。
        *   9 = 10:球 11 較重。

*   接續 1.3 (9,10,11 中有一顆較輕):
    *   左邊: (9)
    *   右邊: (10)
    *   結果:
        *   9 > 10:球 10 較輕。
        *   9 < 10:球 9 較輕。
        *   9 = 10:球 11 較輕。

第二次秤重 (以情況二為例:異常球在 (1L,2L,3L,4L,5H,6H,7H,8H) 中):

*   已知: (9,10,11,12) 都是正常球。
*   左邊: (1, 5, 9) (1L?, 5H?, 9N)
*   右邊: (2, 6, 10) (2L?, 6H?, 10N)
*   保留: (3, 4, 7, 8) (3L?, 4L?, 7H?, 8H?)

結果分析:

1.  情況 2.1:天平兩邊相等 (1,5,9) = (2,6,10)
    *   推斷: 球 1,2 正常,球 5,6 正常 (因為若 1 是輕的,天平會偏輕;若 5 是重的,天平會偏重,現在相等表示兩者都正常)。
    *   推斷: 異常球在保留的 (3L, 4L, 7H, 8H) 這 4 顆球中。
    *   剩餘任務: 從這 4 顆球中找出異常球並判斷輕重,剩下 1 次秤重。

2.  情況 2.2:左邊重 (1,5,9) > (2,6,10)
    *   推斷: 這表示左邊有重球或右邊有輕球。
        *   可能 5 是重球或 6 是重球 (這是從第一次秤重推斷出的)。
        *   也可能 2 是輕球 (這是從第一次秤重推斷出的)。
        *   不可能 1 是輕球 (因為天平偏重)。
    *   推斷: 異常球是 5H 或 6H 或 2L。
    *   剩餘任務: 從這 3 顆球中找出異常球並判斷輕重,剩下 1 次秤重。

3.  情況 2.3:左邊輕 (1,5,9) < (2,6,10)
    *   推斷: 這表示左邊有輕球或右邊有重球。
        *   可能 1 是輕球 (這是從第一次秤重推斷出的)。
        *   不可能 5,6 是重球。
        *   不可能 2 是輕球。
    *   推斷: 異常球是 1L。
    *   剩餘任務: 只剩 1L,已經知道是哪顆球和它的輕重,無需第三次秤重。

第三次秤重 (接續情況 2.1, 2.2 的子情況):

*   接續 2.1 (異常球在 3L, 4L, 7H, 8H 中):
    *   左邊: (3) (疑似輕)
    *   右邊: (7) (疑似重)
    *   結果:
        *   3 < 7:球 3 較輕。
        *   3 > 7:球 7 較重。
        *   3 = 7:異常球在保留的 (4L, 8H) 中。
            *   再比較: (4) vs (1) (正常球)
            *   4 < 1:球 4 較輕。
            *   4 = 1:球 8 較重。

*   接續 2.2 (異常球是 5H, 6H, 2L 之一):
    *   左邊: (5) (疑似重)
    *   右邊: (6) (疑似重)
    *   結果:
        *   5 > 6:球 5 較重。
        *   5 < 6:球 6 較重。
        *   5 = 6:球 2 較輕。

情況三的解決方法 則是與情況二對稱的,透過同樣的策略步驟即可得出答案。

這個策略的關鍵在於每次秤重都盡可能地將球分成三組,並利用天平的三種結果來最大化地排除可能性,同時巧妙地組合「已知可能輕」和「已知可能重」的球與已知正常的球進行比較。

總之,100 顆球在 3 次秤重內是無解的。上述策略適用於 12 顆球的情況。
Usage: 14k in / 9.5k out


(4). Python 程式能力 :

提示詞如下 : 

請寫一個 Python 函式:

def detect_drawdown(prices, threshold=0.2):

輸入是一個每日收盤價 list,找出所有從歷史高點回撤超過 threshold 的區段。

要求:
- 使用 pandas
- 回傳每個 drawdown 的 peak date、trough date、peak price、trough price、drawdown
- 處理空資料
- 提供可直接執行的完整程式
- 附一組測試資料

結果如下 :




程式碼 : 







(5). Tool Calling 能力 :

提示詞如下 : 

請在目前 Raspberry Pi 上執行:
uname -a
free -h
df -h

然後整理成一個簡短的系統狀態報告。

結果如下 : 



2026年10月10日 星期六

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (十九)

我在前一篇測試中考驗了 GTP-5.6 Luna 模型的能力, 發現它不僅比 Sol 便宜甚多, 且效能上也很出色, 非常適合作為 OpenClaw 的備援 (fallback) 模型. 昨天我註冊了 Groq 平台帳號, 參考 :


Groq 託管的 openai/gtp-oss-120b 模型價格與 Luna 相近, 本篇旨在 coding 工具集模式下測試其效能. 

本系列全部測試文章索引參考 :



1. 安裝 Groq provider :

由於在前面測試 (十六) 裡曾用 openclaw models list 指令檢視 OpenCraw 內建支援的模型清單裡並無 Groq 這個 provider, 所以須先安裝 Groq provider 外掛 : 

pi@pi4b:~ $ openclaw plugins install @openclaw/groq-provider
│
◇  

OpenClaw 2026.7.1-2 (0790d9f) — More integrations than your therapist's intake form.

Resolved @openclaw/groq-provider to @openclaw/groq-provider@2026.9.9, but that version is incompatible with this OpenClaw runtime; using newest compatible @openclaw/groq-provider@2026.7.1.
Installing @openclaw/groq-provider into /home/pi/.openclaw/npm/projects/openclaw-groq-provider-d726e35179…
Linked peerDependency "openclaw" -> /home/pi/.config/nvm/versions/node/v24.17.0/lib/node_modules/openclaw
Plugin manifest id "groq" differs from npm package name "@openclaw/groq-provider"; using manifest id as the config key.
Installed plugin: groq
Restart the gateway to load plugins.

可見已成功安裝了與 OpenClaw 2026.7.1-2 相容的 Groq Provider 版本了, 由於此外掛的 2026.9.9  版與目前的 OpenClaw runtime 不相容, 因此自動改安裝 2026.7.1 版. 安裝 plugin 後須重新啟動 Gateway 才會載入 : 

pi@pi4b:~ $ systemctl --user restart openclaw-gateway.service   

確認服務狀態是否為 active :

pi@pi4b:~ $ systemctl --user status openclaw-gateway.service --no-pager    
● openclaw-gateway.service - OpenClaw Gateway (v2026.7.1-2)
     Loaded: loaded (/home/pi/.config/systemd/user/openclaw-gateway.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-10-10 08:33:43 CST; 47s ago
   Main PID: 1345730 (MainThread)
      Tasks: 11 (limit: 8743)
        CPU: 56.270s
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/openclaw-gateway.service
             └─1345730 /home/pi/.config/nvm/versions/node/v24.17.0/bin/node /home/pi/.config/nvm/v…

10月 10 08:33:43 pi4b systemd[727]: Started openclaw-gateway.service - OpenClaw Gateway (v2….1-2).
10月 10 08:34:23 pi4b node[1345730]: 2026-10-10T08:34:23.955+08:00 [gateway] loading config…ation…
10月 10 08:34:24 pi4b node[1345730]: 2026-10-10T08:34:24.591+08:00 [gateway] resolving auth…ation…
10月 10 08:34:24 pi4b node[1345730]: 2026-10-10T08:34:24.674+08:00 [gateway] starting...
10月 10 08:34:27 pi4b node[1345730]: 2026-10-10T08:34:27.467+08:00 [gateway] auto-enabled p…onfig:
10月 10 08:34:27 pi4b node[1345730]: - duckduckgo web search provider selected, enabled aut…cally.
Hint: Some lines were ellipsized, use -l to show in full.

檢視 Groq Provider 是否載入 :

pi@pi4b:~ $ openclaw models list --provider groq   

OpenClaw 2026.7.1-2 (0790d9f) — I'll refactor your busywork like it owes me money.

Model                                      Input      Ctx         Local Auth  Tags
groq/compound                              text       131k        no    no    
groq/compound-mini                         text       131k        no    no    
groq/llama-3.1-8b-instant                  text       131k        no    no    
groq/llama-3.3-70b-versatile               text       131k        no    no    
groq/meta-llama/llama-4-scout-17b-16e-i... text+image 131k        no    no    
groq/openai/gpt-oss-120b                   text       131k        no    no    
groq/openai/gpt-oss-20b                    text       131k        no    no    
groq/openai/gpt-oss-safeguard-20b          text       131k        no    no    
groq/qwen/qwen3-32b                        text       131k        no    no    

可見目標模型 groq/openai/gpt-oss-120b 已經在模型提供者清單中了. 


2. 備份 OpenClaw 設定檔 :

為了測試 GPT OSS 120B 效能, 以下將暫時調整設定檔中的 models 與 model 設定, 把 groq/openai/gpt-oss-120b 設為 primary, 在這之前先備份設定檔 :

pi@pi4b:~ $ cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak.20261010   
pi@pi4b:~ $ ls -l ~/.openclaw/openclaw.json*   
-rw------- 1 pi pi 2975 10月 10 08:22 /home/pi/.openclaw/openclaw.json
-rw------- 1 pi pi 2926 10月 10 08:22 /home/pi/.openclaw/openclaw.json.bak
-rw------- 1 pi pi 2917 10月  9 01:53 /home/pi/.openclaw/openclaw.json.bak.1
-rw------- 1 pi pi 2921 10月  9 01:52 /home/pi/.openclaw/openclaw.json.bak.2
-rw------- 1 pi pi 2975 10月 10 08:41 /home/pi/.openclaw/openclaw.json.bak.20261010
-rw------- 1 pi pi 2916 10月  9 01:44 /home/pi/.openclaw/openclaw.json.bak.3
-rw------- 1 pi pi 2917 10月  9 01:34 /home/pi/.openclaw/openclaw.json.bak.4
-rw------- 1 pi pi 2975 10月 10 08:34 /home/pi/.openclaw/openclaw.json.last-good
-rw------- 1 pi pi 1455  9月  5 15:58 /home/pi/.openclaw/openclaw.json.manual.bak


3. 修改可用模型 models 設定:

用下列指令將 groq/openai/gpt-oss-120b 模型加入可用模型清單中, 取別名為 OSS :

pi@pi4b:~ $ openclaw config set --replace agents.defaults.models '{"openai/gpt-5.6-luna": {"alias": "GPT"}, "google/gemini-2.5-flash": {"alias": "Flash"},"groq/openai/gpt-oss-120b": {"alias": "OSS"}}'
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'm like tmux: confusing at first, then suddenly you can't live without me.

Updated agents.defaults.models. Change will apply without restarting the gateway.

檢視可用模型清單, 確認 GPT OSS 已入列 : 

pi@pi4b:~ $ openclaw config get agents.defaults.models   

OpenClaw 2026.7.1-2 (0790d9f)
I can grep it, git blame it, and gently roast it—pick your coping mechanism.

{
  "google/gemini-2.5-flash": {
    "alias": "Flash"
  },
  "openai/gpt-5.6-luna": {
    "alias": "GPT"
  },
  "groq/openai/gpt-oss-120b": {
    "alias": "OSS"
  }
}


3. 修改 model 的 primary 與 fallback 設定:

將測試主角 GPT OSS 指定為 primary (預設模型), Gemini 2.5 Flash 與 GPT 5.6 Luna 為 fallback (備援模型) :

pi@pi4b:~ $ openclaw config set agents.defaults.model.primary "groq/openai/gpt-oss-120b"   
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I've read more man pages than any human should—so you don't have to.

Updated agents.defaults.model.primary. Change will apply without restarting the gateway.
  
接著設定備援模型 : 

pi@pi4b:~ $ openclaw config set agents.defaults.model.fallbacks '["google/gemini-2.5-flash", "openai/gpt-5.6-luna"]'  
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'm the assistant your terminal demanded, not the one your sleep schedule requested.

Updated agents.defaults.model.fallbacks. Change will apply without restarting the gateway.

檢視設定是否正確 : 

pi@pi4b:~ $ openclaw config get agents.defaults.model   

OpenClaw 2026.7.1-2 (0790d9f) — I autocomplete your thoughts—just slower and with more API calls.

{
  "primary": "groq/openai/gpt-oss-120b",
  "fallbacks": [
    "google/gemini-2.5-flash",
    "openai/gpt-5.6-luna"
  ]
}


4. 設定 Groq API key :

OpenClaw 所使用的模型的金鑰認證資料放在一個 sqlite 資料庫裡, 可以用下列指令查詢 : 

pi@pi4b:~ $ openclaw models auth list   
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'm not AI-powered, I'm AI-possessed. Big difference.

Agent: main
Auth state store: ~/.openclaw/agents/main/agent/openclaw-agent.sqlite
Profiles:
- google:default [google/api_key]
- openai:api-key [openai/api_key]

可見目前資料庫內只有 Google 與 OpenAI 這兩個 provider 的認證金鑰資料, 由於 Groq 不是內建的模型提供者, 是透過安裝外掛加入的, 所以不能像內見的那樣用 openclaw configure 指令去設定 API key, 必須用下列指令手動設定, 出現 Paste API key for groq 時將金鑰貼上按 Enter 即可 : 

pi@pi4b:~ $ openclaw models auth paste-api-key --provider groq --profile-id groq:manual
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'll butter your workflow like a lobster roll: messy, delicious, effective.

│
◇  Paste API key for groq
│  ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
Updated config: ~/.openclaw/openclaw.json
  Backup: ~/.openclaw/openclaw.json.bak
Auth profile: groq:manual (groq/api_key)

確認 Groq 的金鑰已寫入資料庫 : 

pi@pi4b:~ $ openclaw models auth list
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
Your personal assistant, minus the passive-aggressive calendar reminders.

Agent: main
Auth state store: ~/.openclaw/agents/main/agent/openclaw-agent.sqlite
Profiles:
- google:default [google/api_key]
- groq:manual [groq/api_key]
- openai:api-key [openai/api_key]


5. 驗證設定檔與重啟服務:
 
檢查設定檔語法是否有效 : 

pi@pi4b:~ $ openclaw config validate
│
◇  

OpenClaw 2026.7.1-2 (0790d9f) — I autocomplete your thoughts—just slower and with more API calls.

Config valid: ~/.openclaw/openclaw.json

用 kill 指令殺死行程來重啟 OpenClaw 服務, 這樣最能保證上面的 models 與 model 設定生效 :

pi@pi4b:~ $ pkill -9 -f openclaw  
pi@pi4b:~ $


5. 能力測試 :

以下使用 LINE 對 GPT OSS 120B 模型進行五項能力考驗 : 


(1). 網路搜尋 :

提示詞如下 : 

台積電 ADR 目前價格? 

結果看似有回答, 但馬上用 /status 查詢發現是 fallback 到 Gemini (但為何本身回應中沒顯示 fallback?) : 





問簡單的 1+1 也是 fallback : 




似乎用不了, 看來要等重新開放付費後再來測試. 還是先回到 primary: gemini-2.5-flash 與 fallback: gpt-5.6-luna 配置吧. 

2026年10月9日 星期五

註冊 Groq AI 平台開發者帳號

這兩天在樹莓派的 Pi 4 上的 OpenClaw 測試 openai/gtp-5.6-luna 模型時, 與 ChatGPT  討論便宜又好用的 fallback 模型, 它推薦使用 Grok 平台上託管的 GPT-OSS 120B (在 OpenClaw ), 它具有 "便宜 + 快 + 足夠聰明" 的優點, 很適合用來作為放在 Gemini 2.5 Flash 後面的 fallback 備援模型. 由於它的免費額度不高, 所以建議升級為 Developer 付費方案, 價格 Input $0.15/M Output  $0.6/M, 與 OpenAI GPT 5.6 Luna 的 Input  $0.2/1M Output $1.2/1M 比起來差不多, 可以做為備援模型. 


1. 註冊 Groq 帳號 : 

前往 Groq Console 網站 :


可用 Google, GitHub, 或 Email 註冊, 我原先用 Hinet 信箱註冊, 但按註冊信中的 Sign In 鈕卻出現錯誤無法繼續, 只好改用 Google 帳號註冊 : 





選擇 Google 帳號後按繼續 :





完成後會自動登入, 按右上角的 "Upgrade to Dev Plan" 鈕升級為開發者帳戶 : 




可惜目前因申請者眾多暫停 Pay-as-you-go 付費開發者帳戶申請, 殘念 : 




只能暫時用免費帳戶了. 但要按右上角的 "API Keys" 先建立金鑰才行. 


2. 建立 API Keys : 

按右上角的 "Create API Key" 鈕 : 




填寫 Display Name 後按 Submit :



按 Copy 鈕先將金鑰複製儲存到文字檔中保存備用後按 Done :




所建的 API key 會顯示在列表中 :




但只顯示曾建立了幾個金鑰, 內容無法再複製. 

Groq 平台提供 Llama, GPT OSS, 與 Whisper 模型, 價格參考 : 


以我打算使用的 GPT OSS 120B 來說, Input $0.15/M Output  $0.6/M :




3. API 測試 : 

以下用一個 Python 程式來測試 API key 是否可用, 先安裝 groq 套件 :

pip install groq

測試程式如下 :

import os
import time
from groq import Groq
from groq import APIConnectionError, APIStatusError, RateLimitError
from dotenv import dotenv_values

config=dotenv_values('.env') 
api_key=config.get('GROQ_API_KEY')
model="openai/gpt-oss-120b"

def main():
    if not api_key:
        print("失敗:找不到 GROQ_API_KEY")
        return
    try:
        client=Groq(api_key=api_key, timeout=60.0)
        print(f"測試模型:{model}")
        print("正在呼叫 Groq API...")
        start=time.perf_counter()
        response=client.chat.completions.create(
            model=model,
            messages=[
                {
                    "role": "system",
                    "content": "你是一位簡潔的繁體中文助理。"
                },
                {
                    "role": "user",
                    "content": "請用繁體中文回答:1+1 等於多少?並簡短解釋。"
                }
                ],
            max_completion_tokens=256,
            )
        elapsed=time.perf_counter() - start
        answer=response.choices[0].message.content

        print("\n✅ API 呼叫成功")
        print(f"模型回報:{response.model}")
        print(f"回答:{answer}")
        print(f"耗時:{elapsed:.2f} 秒")

        usage=response.usage
        if usage:
            print(f"Input tokens:{usage.prompt_tokens}")
            print(f"Output tokens:{usage.completion_tokens}")
            print(f"Total tokens:{usage.total_tokens}")
    except RateLimitError as e:
        print("速率或用量限制:請檢查 Groq Console 的配額與帳務。")
        print(f"HTTP 狀態:{e.status_code}")
    except APIStatusError as e:
        print("Groq API 回傳錯誤。")
        print(f"HTTP 狀態:{e.status_code}")
        print(f"錯誤內容:{e.message}")
    except APIConnectionError:
        print("連線失敗:請檢查網路、DNS 或防火牆。")
    except Exception as e:
        print(f"其他錯誤:{type(e).__name__}: {e}")

if __name__ == "__main__":
    main()

執行結果 : 

測試模型:openai/gpt-oss-120b
正在呼叫 Groq API...

✅ API 呼叫成功
模型回報:openai/gpt-oss-120b
回答:1 + 1 = 2。  
因為在十進位的自然數加法中,兩個單位相加會產生一個新的單位,故結果是 2。
耗時:0.66 秒
Input tokens:107
Output tokens:77
Total tokens:184

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (十八)

在前一篇測試中, 我將工具模式 tools.profile 改成 minimal 觀察 in tokens 數量, 結果從 coding 模式的 21K 驟降為 6.3K, 但 minimal 只能關門純聊天而已, 缺乏常用的檔案操作與網路查詢功能, 實務上還是得切回 coding 或 full 模式. 

其次, 我原先的設定檔中模型清單 models 只寫 openai/gpt-5.6 太粗略了, 丟給 OpenAI API 後通常會調用最貴的 gpt-5.6-sol 模型, 其價格為 Input  $4/1M, Output $20/1M, 以 21K 低消 token 計算, 每次對話至少 21K × $4/1M≈ $0.084, 約合台幣 2.7 元, 難怪說聲早安就燒掉快 3 元. 而最便宜的 GPT 5.6 模型是 gpt-5.6-luna, 其價格為 Input  $0.2/1M, Output $1.2/1M, 同樣的 21K 低消只要 21K × $0.2/1M ≈ $0.0042, 約合台幣 0.14 元, 約是 sol 的 1/20! 

本篇旨在測試 openai/gpt-5.6-luna 效能是否符合我的需求. 

本系列全部測試文章索引參考 :



1. 備份 OpenClaw 設定檔 :

在進行模式變更前先備份設定檔 : 

pi@pi4b:~ $ cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak   
pi@pi4b:~ $ ls -l ~/.openclaw/openclaw.json*  
-rw------- 1 pi pi 2917 10月  8 10:08 /home/pi/.openclaw/openclaw.json
-rw------- 1 pi pi 2917 10月  9 00:59 /home/pi/.openclaw/openclaw.json.bak
-rw------- 1 pi pi 2855 10月  8 02:45 /home/pi/.openclaw/openclaw.json.bak.1
-rw------- 1 pi pi 2855 10月  8 02:43 /home/pi/.openclaw/openclaw.json.bak.2
-rw------- 1 pi pi 2917 10月  9 00:57 /home/pi/.openclaw/openclaw.json.bak.202610090057
-rw------- 1 pi pi 2864 10月  8 02:33 /home/pi/.openclaw/openclaw.json.bak.3
-rw------- 1 pi pi 2864 10月  6 23:27 /home/pi/.openclaw/openclaw.json.bak.4
-rw------- 1 pi pi 2917 10月  8 10:20 /home/pi/.openclaw/openclaw.json.last-good
-rw------- 1 pi pi 1455  9月  5 15:58 /home/pi/.openclaw/openclaw.json.manual.bak


2. 修改 tool.profile 為 coding 模式 :

查詢目前工具模式設定為 minimal : 

pi@pi4b:~ $ openclaw config get tools.profile   

OpenClaw 2026.7.1-2 (0790d9f)
I'll butter your workflow like a lobster roll: messy, delicious, effective.

minimal  

更改設定為 coding 模式 :

pi@pi4b:~ $ openclaw config set tools.profile "coding"  
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
I'm the reason your shell history looks like a hacker-movie montage.

Updated tools.profile. No gateway restart needed.

確認已改為 coding 模式 : 

pi@pi4b:~ $ openclaw config get tools.profile

OpenClaw 2026.7.1-2 (0790d9f)
I've read more man pages than any human should—so you don't have to.

coding


3. 修改 models 的 GPT 5.6 為 luna 模型 :

查詢目前設定 : 

pi@pi4b:~ $ openclaw config get agents.defaults.models   

OpenClaw 2026.7.1-2 (0790d9f) — I autocomplete your thoughts—just slower and with more API calls.

{
  "openai/gpt-5.6": {
    "alias": "GPT"
  },
  "google/gemini-2.5-flash": {
    "alias": "Flash"
  }
}

此處的 openai/gpt-5.6 太粗略, 用下列指令改為精確的 openai/gpt-5.6-luna :

pi@pi4b:~ $ openclaw config set --replace agents.defaults.models '{"openai/gpt-5.6-luna": {"alias": "GPT"}, "google/gemini-2.5-flash": {"alias": "Flash"}}'  
│
◇  

OpenClaw 2026.7.1-2 (0790d9f) — Making 'I'll automate that later' happen now.

Updated agents.defaults.models. Change will apply without restarting the gateway.

確認模型已改為 gpt-5.6-luna : 

pi@pi4b:~ $ openclaw config get agents.defaults.models   

OpenClaw 2026.7.1-2 (0790d9f) — Half butler, half debugger, full crustacean.

{
  "google/gemini-2.5-flash": {
    "alias": "Flash"
  },
  "openai/gpt-5.6-luna": {
    "alias": "GPT"
  }
}


4. 修改 model 的 primary 與 fallback 設定 :

此番主要是想測試 gpt-5.6-luna 模型之效能, 所以要暫時將其設為 primary : 

pi@pi4b:~ $ openclaw config set agents.defaults.model.primary "openai/gpt-5.6-luna"   
│
◇  

OpenClaw 2026.7.1-2 (0790d9f) — Your config is valid, your assumptions are not.

Updated agents.defaults.model.primary. Change will apply without restarting the gateway.

把 gemini-2.5-flash 暫時設為 fallback : 

pi@pi4b:~ $ openclaw config set agents.defaults.model.fallbacks '["google/gemini-2.5-flash"]' 
│
◇  

OpenClaw 2026.7.1-2 (0790d9f)
The only open-source project where the mascot could eat the competition.

Updated agents.defaults.model.fallbacks. Change will apply without restarting the gateway.
 
檢視設定是否正確 : 

pi@pi4b:~ $ openclaw config get agents.defaults.model   

OpenClaw 2026.7.1-2 (0790d9f)
Your second brain, except this one actually remembers where you left things.

{
  "primary": "openai/gpt-5.6-luna",
  "fallbacks": [
    "google/gemini-2.5-flash"
  ]
}


5. 驗證設定檔與重啟服務 :

檢查設定檔 openclaw.json 是否合規 : 

pi@pi4b:~ $ openclaw config validate   
│
◇  

OpenClaw 2026.7.1-2 (0790d9f) — Powered by open source, sustained by spite and good documentation.

Config valid: ~/.openclaw/openclaw.json

用 kill 指令殺死行程來重啟 OpenClaw 服務, 這樣上面的設定才會生效 :

pi@pi4b:~ $ pkill -9 -f openclaw  
pi@pi4b:~ $


6. 測試 in tokens 與計算費用 :

在使用 LINE 測試之前, 先查詢 OpenAI API 餘額 :




用 LINE 頻道開啟新對話後問聲早安 :




再次查詢 OpenAI API 餘額 :




用掉 11K tokens, 約 21K 的一半, 吃掉 0.01 美金, 約合台幣 0.3 元, 以上面的價格估計應該是一半 0.07 元台幣才對, 是價格上調了嗎? 但也比 sol 的 2~3 元台幣便宜許多. 

檢視狀態 : 




確實是使用 gpt-5.6-luna 模型. 但這回卻是 11K in tokens, 可見 GPT 的 tokenizer 計算 token 的數量似乎是 Gemini 的一半左右. 


6. 能力測試 :

以下對 Luna 進行五項能力考驗 : 


(1). 網路搜尋 :

提示詞如下 : 

台積電 ADR 目前價格? 




可見已有 34K 快取, 新增 6.4K 快取就是這次搜尋網頁的 token 數量.


(2). Python 知識 :

提示詞如下 :

請用繁體中文解釋 Python 的 list、tuple、set 三者差異。
要求:
1. 用表格比較
2. 各給一個實際例子
3. 說明什麼情況下應該選哪一個

結果如下 :







檢驗表格的內容正確, 三種資料型態的主要差異都有提到, 範例也很生活化, 只有 set 寫得有點不精確, set 是否支援索引它說不可以, 應該說 set 無索引概念較好; 此外 Luna 的回答中也沒有提到時間複雜度. 不過整體來說, Luna 回答結構完整, 沒有明顯錯誤, 範例也合理. 對於 80~90% 的 Python 學習與 Vibe Coding 場景已很夠用, 不需要用到 Terra 或 Sol. 


(3). 推理能力測試 : 

提示詞如下 :

有 100 顆球,其中 1 顆重量不同,但不知道它比較重還是比較輕。只有一個沒有砝碼的天平,最多可以秤 3 次。請找出異常球,並判斷它是比較重還是比較輕。請完整說明策略。

它的回覆如下 : 

這題在 最多 3 次秤重下無解,因此不存在能保證找出異常球的完整策略。

為什麼不可能?

每顆球都有兩種可能:

- 第 1 顆較重
- 第 1 顆較輕
- 第 2 顆較重
- 第 2 顆較輕
- ……

所以共有:

\[
100 \times 2 = 200
\]

種可能情況。

每次使用天平,結果只有三種:

1. 左邊較重
2. 右邊較重
3. 兩邊平衡

因此 3 次秤重最多產生:

\[
3^3 = 27
\]

種不同結果序列。

但我們需要區分 200 種可能,而 3 次秤重最多只能區分 27 種:

\[
27 < 200
\]

所以無論如何安排秤重,都不可能同時:

- 找出是哪一顆球
- 判斷它是較重還是較輕

甚至只找出異常球也不夠

即使不要求判斷重量,只要求找出哪一顆,100 顆球也需要區分 100 種情況;3 次秤重最多只有 27 種結果,仍然不夠。

至少需要幾次?

單純從資訊量來看:

\[
3^4 = 81 < 200
\]

\[
3^5 = 243 \geq 200
\]

因此至少需要 5 次秤重,3 次一定不可能。

結論:這是一道以資訊量為陷阱的題目;正確答案不是設計秤重流程,而是證明 3 次秤重無法解決 100 顆球的問題。
Usage: 493 in / 949 out · cache 11k cached / 916 new

可見 Luna 推理完整, 結論與數學證明正確, 且沒有硬掰策略 (用了資訊理論的解法), 表現非常棒. Luna 在推理能力方面不僅能用而且成本很划算. 

  
(4). Python 程式能力 :

提示詞 : 

請寫一個 Python 函式:

def detect_drawdown(prices, threshold=0.2):

輸入是一個每日收盤價 list,找出所有從歷史高點回撤超過 threshold 的區段。

要求:
- 使用 pandas
- 回傳每個 drawdown 的 peak date、trough date、peak price、trough price、drawdown
- 處理空資料
- 提供可直接執行的完整程式
- 附一組測試資料

回應如下 :

以下程式將 drawdown 表示為負百分比,例如 -0.30 代表回撤 30%。 「區段」定義為:從歷史高點開始,直到價格重新回到該高點;若尚未恢復,則截至資料最後一天。
輸出結果類似:
若直接傳入普通 list,peak_date 和 trough_date 會是資料位置,例如 0、3、5。
Usage: ? in / 2.0k out · cache 12k cached / 1.5k new


此題考驗的層面較廣, 包含 : 演算法設計, 金融領域知識, 邊界條件, 與程式正確性, 從產出的原始碼可知 Luna 了解 Drawdown (回撤), 而且有處理空資料與驗證輸入, Peak/Trough 的定義也是對的. 它還附上程式測試結果 :




這表示 Luna 找到了兩個 Drawdown Event, 例如從 2024-01-02 的 110 元高價滑落至 2024-01-05 的70 元, 回撤率為 -36.36%, 結果與數學計算一致, 這顯示程式不僅正確, Drawdown 的算法邏輯也是正確的, 功能完全符合需求. 從這裡可看出 Luna 不只是會寫程式碼, 它還會驗證自己寫的程式碼. 

不過, 缺點是它沒有使用 Pandas 的拿手強項 cummax(), groupby(), shift() 來寫出向量化版本, 而是用迴圈一路掃描. 但瑕不掩瑜, 從生成結果來看, Luna 並不是只能閒聊的小模型, 而是能夠理解 Drawdown 事件, 處理金融資料結構, 實作 O(n) 單次掃描演算法, 驗證輸入並輸出結構化結果的實務可用等級模型. 

 
(5). Tool Calling 能力試驗 :

提示詞如下 :

請在目前 Raspberry Pi 上執行:
uname -a
free -h
df -h

然後整理成一個簡短的系統狀態報告。

回應如下 :




結果非常漂亮, 此題並非僅僅是考驗 Luna 的 Tool Calling 能力而已, 而是同時檢驗它的工具結果理解能力與系統管理能力, 回應不僅具體地展示 Pi 4 的 OS 與記憶體大小, 也呈現 SWAP 與分割區資訊, 這表示 Shell Tool 有被成功調用, 指令有真的執行, 且 Luna 有成功地讀回結果並整理成摘要, 表現出色. 另外 Token 成本 3 in / 263 out 也非常低, 從以上能力表現來看, 性價比非常高.

2026年10月8日 星期四

OpenClaw 學習筆記 : 常用指令集

向母校借的 "OpenClaw 超入門" 這本書的附錄裡有很棒的常用指令介紹, 我今天在還書前大致做了一下整理, 摘要如下 :
  • /new 與 /reset 
    皆可用來開啟一個全新對話, 都會再次啟動初始化流程 (讀取設定檔, 載入注入來源, 與 bootstrap-extra-files 額外來源等), 兩者差別是, /new 後面允許指定新對話要使用的模型 (僅用於該頻道, 且為已驗證之可用模型).
  • /clear 
    清除 Web UI 目前對話視窗中已顯示之內容, 但對於頻道 (LINE 或 Telegram 等) 無此效果. 
  • /compact 
    把對話中較早較長的內容壓縮成一段精簡摘要, 讓後續對話不會因為前面的歷史對話占去太多 in tokens, 又能保持對話脈絡. /compact 後面可以附上整理行為的指示, 例如 :
    /compact 請以不同主題進行摘要整理, 且以清單列出各主題重點
    注意, /compact 執行後 context 並不會顯著下降, 因為它只是將歷史對話壓扁而已, 而不是清空. 此指令僅在頻道中有效, Web UI 並不支援, 但當 context 到達臨界值會自動做 auto-compaction 動作. 
  • /export 
    匯出目前對話的所有內容, 自動儲存於本機下檔資料夾中. 
  • /export-session
    功能與 /export 類似, 但輸出結果是 HTML 檔, 儲存於工作區 workplace 資料夾下. 
  • /btw 
    此指令用來在對話中插話, 順便問一個題外話 (跟在指令後面), 此插話不會列入此對話之 Context 內, 僅限於頻道中使用, 例如 :
    /btw 今天午餐吃甚麼?
  • /stop 
    中斷目前進行中的回應或生成, 僅限於在頻道中中斷執行中的任務.
  • /status 
    查看目前對話的整體狀態資訊, 包含版本, 模型, ctx 占比, 剩餘額度等資源. 
  • /usage 
    查看上一則對話的使用資訊, 例如 in/out tokens, 使用之模型, ctx 占比等, 用來觀察單次對話之資源消耗.
  • /help 
    查看可用指令.
  • /command 
    僅用於頻道中查詢該頻道所支援之指令集.
  • /model 
    查看目前所使用的模型與已設定知可用模型清單. 後面若跟著模型名稱, 則是切換該對話視窗所使用的核心 (primary) 模型, 例如 :
    /model google/gemini-2.5-flash
  •  /verbose
    控制回應內容的詳細程度, 可在後面加上 on, off, full 來指定, 例如 :
    /verbose off : 精簡的回應 (預設)
    /verbose on : 適度補充背景, 狀態, 與操作脈絡 
    /verbose full : 顯示完整訊息 (含額外欄位, 補充資訊, 相關狀態等)
  • /fast 
    切換為快速回應模式以降低等待時間. 
  • /think   
    調整模型在回應前的思考強度, 後面可加上 off, low, medium, 或 high 來指定, 有些模型還可用 minimal 與 xhigh. 思考強度越高越適合處理較複雜或須要規畫的任務, 但回應時間可能會變長. 設定 /think 後可以用 /status 來檢視是否有啟用指定之強度模式. 
  • /skill-creator 
    以對話方式一步步引導建立自訂 Skill, 或修改原本已存在之 skill. 
這些指令有些我還沒用過, 需要在測試過後再來補充.