生活分享

Hooks:在指定事件執行檢查

Hooks(事件掛鉤)讓 Gemini CLI 在特定事件發生時執行你寫的程式。本篇用一個小型檢查器示範:在 CLI 準備呼叫 shell 工具前先回傳阻擋原因,讓練習階段保持唯讀。學完後,你會知道事件、設定與程式輸出如何接起來,以及如何分開驗證每一層。

更新日期: 閱讀時間約 5 分鐘

Hook 事件資料的方向的原創插畫,以文件、裝置與流程等物件呼應在指定事件執行檢查;非產品介面。
圖片:Mokaair (© Mokaair)
本篇目錄
  1. 開始前:先理解事件與執行位置
  2. 資料流:標準輸入進來,JSON 結果出去
  3. 實作:建立檢查器並接上設定
  4. 判斷失敗:程式、設定與模型分開看
  5. 常見問題與停用方式
  6. 完成後的檢核

Hooks(事件掛鉤)讓 Gemini CLI 在特定事件發生時執行你寫的程式。本篇用一個小型檢查器示範:在 CLI 準備呼叫 shell 工具前先回傳阻擋原因,讓練習階段保持唯讀。學完後,你會知道事件、設定與程式輸出如何接起來,以及如何分開驗證每一層。

事件輸入:由 stdin 接收 JSON;處理檢查:判斷允許或拒絕;協定輸出:stdout 回傳 JSON
Hook 事件資料的方向。此為原創教學圖解,並非產品畫面或實測輸出。 · 圖片:Mokaair (© Mokaair)

開始前:先理解事件與執行位置

準備 Gemini CLI 0.59.0、Python 與獨立練習資料夾,先讀和。本文設定依官方 Hooks 檔案整理,Python 範例可先在終端機獨立測試;完整觸發還需要自己的 CLI 登入與工具呼叫環境。

Hook 是會在電腦上執行的程式,與不同。它不需要模型逐次重新理解檢查邏輯,但程式錯誤、事件選錯或設定未載入,仍會影響結果。測試時先使用假資料,將範圍縮小到單一工具,避免第一次就把複雜處理放進所有事件。

BeforeTool 發生在工具執行前,可用來判斷是否允許這次操作;AfterTool 發生在工具執行後,適合觀察結果,但不能倒轉已發生的寫入。這個時間差是選事件最重要的依據。需要阻止動作時,不能只在事後輸出一段警告。

資料流:標準輸入進來,JSON 結果出去

CLI 會把事件資料以 JSON 送到程式的標準輸入 stdin。BeforeTool 資料包含工具名稱與引數;程式透過標準輸出 stdout 回傳 JSON。除最後的 JSON 外,不要在 stdout 印出「開始檢查」等文字;診斷訊息應寫到 stderr,避免破壞解析。

本例只檢查 tool_name 是否為 run_shell_command,不試圖分析每一種 shell 語法。若符合就回傳 decision 為 deny 與原因,否則回傳 allow。這個簡單規則容易驗證,也清楚表達限制:它只處理被指定的工具,不是所有檔案操作的完整防護,仍需搭配。

實作:建立檢查器並接上設定

  1. 在練習專案建立 .gemini/hooks/block-shell.py,貼上下面的 Python 程式。
  2. 先用兩份虛構事件測試程式,一份是 shell、一份是讀檔,核對 deny 與 allow。
  3. 把 hooks 物件合併到既有 .gemini/settings.json,不要覆蓋其他模型或記憶設定。
  4. 重新啟動 CLI,檢視 /hooks 的清單與狀態,確認設定來源及名稱。
  5. 請 CLI 嘗試用 shell 顯示目前資料夾,觀察掛鉤是否回傳教學設定的拒絕原因。
.gemini/hooks/block-shell.py · python
import json
import sys

event = json.load(sys.stdin)
if event.get("tool_name") == "run_shell_command":
    result = {"decision": "deny", "reason": "本次練習禁止 shell,請改用讀檔工具。"}
else:
    result = {"decision": "allow"}
json.dump(result, sys.stdout, ensure_ascii=False)
sys.stdout.write("\n")
.gemini/settings.json · json
{
  "hooks": {
    "BeforeTool": [
      {
        "matcher": "^run_shell_command$",
        "hooks": [
          {
            "name": "lesson-block-shell",
            "type": "command",
            "command": "python .gemini/hooks/block-shell.py",
            "timeout": 5000
          }
        ]
      }
    ]
  }
}
PowerShell:獨立測試 · powershell
'{"tool_name":"run_shell_command","tool_input":{}}' | python .gemini/hooks/block-shell.py
'{"tool_name":"read_file","tool_input":{}}' | python .gemini/hooks/block-shell.py

預期第一行回傳 deny 與原因,第二行回傳 allow。這證明檢查器邏輯與 JSON 輸出可用;還不能單憑這兩行就宣稱 CLI 已載入掛鉤。完整驗證要看到 CLI 的掛鉤狀態,並確認 shell 沒有實際執行。若 CLI 選了其他工具,表示此次沒有觸發 matcher,應重新設計測試提示詞。

判斷失敗:程式、設定與模型分開看

假如程式獨立測試成功,但 CLI 沒有顯示掛鉤,優先查設定層級與信任狀態。假如掛鉤存在卻報找不到 Python,檢查 CLI 啟動時繼承的 PATH;必要時把 command 的 Python 換成實際執行檔路徑,含空格的路徑需正確引號。不要先修改模型提示詞來修正作業系統找不到程式的問題。

官方文件定義退出碼零表示成功解析輸出,二可阻擋動作,其他非零值通常形成警告。本文採成功退出並回傳明確的 JSON 決策,較容易做測試。若要把例外視為阻擋,應刻意寫出錯誤處理並驗證;不能假設任何程式崩潰都會安全停止後續工作。

常見問題與停用方式

「加了掛鉤後每次都卡住」檢視程式是否等待第二段輸入、呼叫無法結束的外部工具,或把網路等待放進事件內。本例只讀一次 JSON 並立即輸出,適合用來比較。先縮短工作內容,再決定合理逾時;延長逾時不是修復無限等待的方法。

「回傳了 deny 還看到模型回答」拒絕的是那次工具動作,主對話仍可能繼續,模型可以解釋原因或改用其他方法。要驗證的是工具有沒有執行,而不是回答有沒有停止。需要停止整個代理迴圈時,應依對應事件的 continue 行為另行設計。

「如何恢復一般操作」先保留設定備份,從這個專案的 BeforeTool 清單移除本例,重新啟動並檢視 /hooks。再次執行相同無害測試,確認不再被此規則阻擋。別把其他人建立的檢查一起刪除,尤其是專案已有多個 Hook 的情況。

當你要把掛鉤用於正式流程,儲存事件樣本、預期輸出與錯誤測試,並記錄 CLI 版本。搭配時,還需確認沒有互動視窗能回答問題的情況下會如何結束,避免排程只留下空白結果卻被當作成功。

完成後的檢核

完成實作後逐項確認。
檢查項目通過條件
操作能依正文重做一次,說明每一步使用的輸入。
結果能用原始資料或可重現測試核對輸出,而非只看語氣。
延伸知道下一篇教學解決的問題,以及什麼時候需要它。

接著可以閱讀 、,把本篇的操作接到下一個工作流程。

  • 生活分享

    完整實作:文件摘要與資料擷取工具

    這篇把前面學過的提示詞、API 呼叫與 JSON 驗證串成一個可執行的檔案工具。輸入一份 UTF-8 活動公告,程式產生摘要、五個固定欄位、原文引用與待確認問題,再存成待審 JSON。你會練習把模型當作資料處理的一個步驟,讓驗證與儲存仍由程式明確控制。

  • 生活分享

    API 額度與錯誤:費用、重試與成本控制

    Gemini API 的費用取決於模型、輸入輸出、服務模式及使用的工具;速率限制則決定你的專案在一段時間內能送出多少工作。本篇教你找到真正對應的用量頁面、估算一次檔案處理成本、分類錯誤,並設計有限重試與停止條件,避免把每個失敗都當成多按一次就能解決。

  • 生活分享

    API 檔案與 JSON:結構化輸出及驗證

    Gemini API 可以讀取 PDF,再把結果整理成指定的 JSON 結構。本篇用虛構活動公告示範檔案輸入、欄位設計與本地驗證。學完後,你會知道「收到合法 JSON」與「內容確實來自檔案」是兩件需要分別檢查的事,並能保留缺漏資訊而不讓模型自行補齊。

  • 生活分享

    AI Studio 與第一個 Gemini API 呼叫

    Google AI Studio 是試用模型與建立 Gemini API 金鑰的開發入口。本篇從一個簡單提示詞開始,帶你建立獨立專案環境,分別用 Python 與 JavaScript 呼叫 API。完成後,你會知道網頁試跑、程式執行與帳號用量各自在哪裡確認,不再把消費者版 Gemini 的操作直接套程式式。

最新旅遊情報攻略

資料來源

生活分享