繁體中文

掛鉤

在 Codex 生命週期中執行確定性指令碼

Hooks 是 Codex 的可擴充套件框架。他們允許 你可以將自己的指令碼注入智能體迴圈中,從而啟用以下功能:

  • 將聊天傳送到自定義日誌記錄/分析引擎
  • 掃描團隊的提示以阻止意外貼上 API 金鑰
  • 總結聊天記錄,自動建立持久記憶
  • 當聊天 turn 停止時執行自定義驗證檢查,執行標準
  • 自定義在某個目錄時的提示

要記住的執行時行為:

  • 來自多個檔案的匹配鉤子全部執行。
  • 同時啟動同一事件的多個匹配命令掛鉤, 所以一個鉤子不能阻止另一個匹配鉤子的啟動。
  • 非託管命令掛鉤在執行之前必須經過審查和信任。

鉤子在對話中的不同點執行:

掛鉤
在 turn 期間PreToolUsePermissionRequestPostToolUsePreCompactPostCompactUserPromptSubmitSubagentStopStop
當會話或子智能體啟動時 SessionStartSubagentStart
當主thread結束時 SessionEnd(不為子智能體執行)

Codex 在哪裡尋找鉤子

Codex 以以下任一形式發現活動設定層旁邊的鉤子:

  • hooks.json
  • config.toml 內的內聯 [hooks]

安裝的外掛還可以通過其外掛捆綁生命週期設定 清單或預設的 hooks/hooks.json 檔案。請參閱建置 外掛 外掛打包規則。

實際上,四個最有用的位置是:

  • ~/.codex/hooks.json
  • ~/.codex/config.toml
  • <repo>/.codex/hooks.json
  • <repo>/.codex/config.toml

如果存在多個鉤子源,則 Codex 載入所有匹配的鉤子。 較高優先順序的設定層不會取代較低優先順序的掛鉤。 如果單層同時包含 hooks.json 和內聯 [hooks]、Codex 合併它們並在啟動時發出警告。更喜歡每層一個表示。

Codex 還可以發現與啟用的外掛捆綁在一起的鉤子。外掛捆綁 鉤子與其他鉤子源一起載入,並使用與 其他非託管掛鉤。

僅當專案 .codex/ 層受信任時,專案本機掛鉤才會載入。在 不受信任的專案,Codex 仍然從自己的載入使用者和系統鉤子 活動設定層。

審查和信任掛鉤

Codex 在決定哪些可以執行之前列出已設定的掛鉤。之前 非託管命令掛鉤可以執行,Codex 要求你檢查並信任 準確的鉤子定義。 Codex 記錄對鉤子當前雜湊的信任,因此 新的或更改的掛鉤將被標記以供審查並跳過,直到可信為止。

使用 CLI 中的 /hooks 檢查鉤子源,檢視新的或更改的鉤子, 信任掛鉤,或停用單個非託管掛鉤。如果鉤子需要審查 啟動時,Codex 列印一條警告,告訴你開啟 /hooks

來自系統、MDM、雲或 requirements.toml 源的託管掛鉤已標記 由策略管理、信任,並且無法從使用者掛鉤瀏覽器停用。

對於已經審查 Codex 之外的源的一次性自動化,請通過 --dangerously-bypass-hook-trust 執行已啟用的掛鉤,無需 該呼叫的持久鉤子信任。

設定形狀

鉤子分為三個級別:

  • PreToolUsePostToolUsePreCompact等鉤子事件, SubagentStartStop
  • 決定事件何時匹配的匹配器組
  • 當匹配器組匹配時執行的一個或多個鉤子處理程序
{
  "description": "Optional lifecycle hooks for this workspace.",
  "hooks": {
    "SessionStart": [
      {
        "matcher": "startup|resume",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.codex/hooks/session_start.py",
            "statusMessage": "Loading session notes",
            "additionalContextLimit": 5000
          }
        ]
      }
    ],
    "SessionEnd": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.codex/hooks/session_end.py",
            "timeout": 3
          }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/pre_tool_use_policy.py\"",
            "statusMessage": "Checking Bash command"
          }
        ]
      }
    ],
    "PermissionRequest": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/permission_request.py\"",
            "statusMessage": "Checking approval request"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/post_tool_use_review.py\"",
            "statusMessage": "Reviewing Bash output"
          }
        ]
      }
    ],
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/user_prompt_submit_data_flywheel.py\""
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/stop_continue.py\"",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

筆記:

  • descriptionhooks.json 檔案的可選頂級後設資料。它 不會改變執行的鉤子。
  • timeout 以秒為單位。
  • 如果省略 timeout,則 Codex 對大多數掛鉤使用 600 秒。
    • SessionEnd 預設使用 1 秒,最多支援 3 秒。
  • statusMessage 是可選的。
  • additionalContextLimit 設定命令鉤子可以多少 additionalContext 在 Codex 將全文儲存到磁碟並傳送較短的文本之前傳送到模型 而是預覽。請參閱大鉤子輸出
  • commandWindows 是可選的僅 Windows 命令覆蓋。在 TOML 中,使用 command_windowscommandWindows
  • 解析 async 選項,但不支援非同步命令掛鉤 然而。
  • 今天僅執行 type: "command" 處理程序。 promptagent 處理程序是 已解析但被跳過。
  • 命令以會話 cwd 作為工作目錄執行。
  • 對於 repo-local 掛鉤,更喜歡從 git root 解析,而不是使用 相對路徑,例如 .codex/hooks/...。 Codex 可以從 子目錄,基於 git-root 的路徑使鉤子位置保持穩定。

config.toml 中的等效內聯 TOML:

[[hooks.SessionStart]]
matcher = "^compact$"

[[hooks.SessionStart.hooks]]
type = "command"
command = '/usr/bin/python3 "$(git rev-parse --show-toplevel)/.codex/hooks/session_start.py"'
additionalContextLimit = 5000

[[hooks.PreToolUse]]
matcher = "^Bash$"

[[hooks.PreToolUse.hooks]]
type = "command"
command = '/usr/bin/python3 "$(git rev-parse --show-toplevel)/.codex/hooks/pre_tool_use_policy.py"'
timeout = 30
statusMessage = "Checking Bash command"

[[hooks.PostToolUse]]
matcher = "^Bash$"

[[hooks.PostToolUse.hooks]]
type = "command"
command = '/usr/bin/python3 "$(git rev-parse --show-toplevel)/.codex/hooks/post_tool_use_review.py"'
timeout = 30
statusMessage = "Reviewing Bash output"

關閉掛鉤

預設情況下啟用掛鉤。要在 config.toml 中關閉 turn,請設定:

[features]
hooks = false

使用 hooks 作為規範功能金鑰。 codex_hooks 仍然可以作為 已棄用的別名。管理員可以用同樣的方式強制掛鉤 requirements.toml[features].hooks = false

來自 requirements.toml 的託管掛鉤

企業管理的需求還可以在 [hooks] 下定義內聯掛鉤。 當管理員想要強制執行掛鉤設定時,這非常有用 通過 MDM 或其他裝置管理系統交付實際指令碼。 要強制執行託管掛鉤,甚至對於本機停用掛鉤的使用者,請固定 [features].hooks = true[hooks] 一起位於 requirements.toml 中。忽略 使用者、專案、會話和外掛掛鉤,同時仍允許管理員 託管掛鉤,設定 allow_managed_hooks_only = true

allow_managed_hooks_only = true

[features]
hooks = true

[hooks]
managed_dir = "/enterprise/hooks"
windows_managed_dir = 'C:\enterprise\hooks'

[[hooks.PreToolUse]]
matcher = "^Bash$"

[[hooks.PreToolUse.hooks]]
type = "command"
command = "python3 /enterprise/hooks/pre_tool_use_policy.py"
command_windows = 'py -3 C:\enterprise\hooks\pre_tool_use_policy.py'
timeout = 30
statusMessage = "Checking managed Bash command"

託管鉤子的注意事項:

  • managed_dir 用於 macOS 和 Linux。
  • windows_managed_dir 用於 Windows 上。
  • Codex不分發managed_dir中的指令碼;你的企業 工具必須單獨安裝和更新。
  • 託管掛鉤命令應使用設定下的絕對指令碼路徑 託管目錄。
  • allow_managed_hooks_only = true 跳過使用者、專案、會話和 外掛源,但仍然從 requirements.toml 載入託管掛鉤 其他託管設定層。

外掛捆綁鉤子

啟用外掛後,Codex 可以從該外掛載入生命週期鉤子 與使用者、專案和託管掛鉤一起。

預設情況下,Codex 在外掛根目錄中查詢 hooks/hooks.json。一個外掛 清單可以使用 hooks 條目覆蓋該預設值 .codex-plugin/plugin.json。清單條目可以是 ./ 字首的路徑、 ./ 字首路徑陣列、內聯鉤子物件或內聯陣列 鉤住物體。

{
  "name": "repo-policy",
  "hooks": "./hooks/hooks.json"
}

清單掛鉤路徑是相對於外掛根解析的,並且必須保留 在那根裡面。如果清單定義了 hooks,則 Codex 使用這些清單 條目而不是預設的 hooks/hooks.json

外掛掛鉤命令接收這些環境變數:

  • PLUGIN_ROOT 是 Codex 特定的擴充套件,指向已安裝的 外掛根。
  • PLUGIN_DATA 是 Codex 特定的擴充套件,指向外掛的 可寫資料目錄。
  • Codex 還設定 CLAUDE_PLUGIN_ROOTCLAUDE_PLUGIN_DATA 與現有外掛掛鉤的相容性。

外掛掛鉤使用與其他掛鉤相同的事件模式。安裝或啟用 外掛不會自動信任它的鉤子; Codex 跳過外掛捆綁的鉤子 直到你檢視並信任當前的鉤子定義。

匹配器模式

matcher 欄位是一個正規表示式字串,用於在鉤子觸發時進行過濾。使用"*""",或完全省略 matcher 以匹配受支援的每次出現 事件。

目前只有一些 Codex 事件支援 matcher

活動 matcher 過濾什麼 筆記
PermissionRequest 工具名稱 支援包括 Bashapply_patch* 和 MCP 工具名稱
PostToolUse 工具名稱 請參閱工具覆蓋率
PostCompact 壓實觸發器 值為 manualauto
PreCompact 壓實觸發器 值為 manualauto
PreToolUse 工具名稱 請參閱工具覆蓋率
SessionEnd 結束原因 目前只有other
SessionStart 啟動原始碼 值為 startupresumeclearcompact
SubagentStart 子智能體類型 值取決於啟動的子智能體
SubagentStop 子智能體類型 值取決於停止的子智能體
UserPromptSubmit 不支援 此事件將忽略任何已設定的 matcher
Stop 不支援 此事件將忽略任何已設定的 matcher

*對於apply_patchmatcher值也可以使用EditWrite

範例:

  • Bash
  • ^apply_patch$
  • Edit|Write
  • mcp__filesystem__read_file
  • mcp__filesystem__.*
  • startup|resume|clear|compact
  • manual|auto

工具覆蓋範圍

PreToolUsePostToolUse可以觀察到比shell和MCP更多的呼叫。最多 本機函式工具使用相同的鉤子路徑,因此你可以匹配它們的工具名稱, 檢查它們的 JSON 參數,對於 PreToolUse,阻止或重寫呼叫。

刀具路徑 PreToolUse PostToolUse 筆記
外殼命令 是的 是的 匹配為 Bash
統一執行(exec_command 是的 是的 匹配為 Bash。當該命令完成時,稍後的 write_stdin 輪詢可以傳遞原始命令的 PostToolUse
apply_patch 是的 是的 匹配為 apply_patchEditWrite
MCP 工具 是的 是的 匹配MCP工具名稱,例如mcp__filesystem__read_file
其他本機功能工具 是的 是的 匹配功能工具名稱,例如update_planspawn_agent 也匹配 Agent
託管工具,如WebSearch 沒有 沒有 這些不使用本機函式工具掛鉤路徑。

write_stdin 是現有統一執行會話的傳輸。它不執行 當它傳送輸入或輪詢已經通過的命令時再次 PreToolUse PreToolUse

一些專用工具路徑可以選擇退出預設掛鉤路徑。治療工具 鉤子作為有用的護欄,而不是完整的強制邊界。

常用輸入欄位

每個命令鉤子都會在 stdin 上接收一個 JSON 物件。

這些是你通常會使用的共享欄位:

領域 類型 意義
session_id string 當前 Codex 會話 ID。子智能體掛鉤使用父會話 ID。
transcript_path string | null 會話記錄檔案的路徑(如果有)
cwd string 會話的工作目錄
hook_event_name string 當前掛鉤事件名稱
model string Codex 特定擴充套件。活動模型蛞蝓

回合範圍掛鉤將 turn_id 列為其中的 Codex 特定擴充套件 特定於事件的表。

SessionStartPreToolUsePermissionRequestPostToolUseUserPromptSubmitSubagentStartSubagentStopStop 還包括 permission_mode,描述當前權限模式為defaultacceptEditsplandontAskbypassPermissions

為了方便起見,transcript_path 指向聊天記錄,但是 轉錄格式不是鉤子的穩定介面,可能會隨著時間的推移而改變。

如果你需要完整的有線格式,請參閱Schemas

公共輸出欄位

SessionStartPreCompactPostCompactUserPromptSubmitSubagentStopStop 支援這些共享的 JSON 欄位。 SubagentStart 接受 systemMessage 和特定於鉤子的上下文的相同形狀,但是 continue: false 不會停止子智能體:

{
  "continue": true,
  "stopReason": "optional",
  "systemMessage": "optional",
  "suppressOutput": false
}
領域 效果
continue 如果為 false,則將該鉤子執行標記為已停止
stopReason 記錄為停止原因
systemMessage 在 UI 或事件流中作為警告出現
suppressOutput 今天解析但尚未實現

退出 0 且無輸出視為成功,Codex 繼續。

PreToolUsePermissionRequest支援systemMessage,但continue, 這些事件當前不支援 stopReasonsuppressOutput。 如果 PreToolUse 掛鉤返回這些不支援的欄位之一,則 Codex 標記 該掛鉤執行失敗,報告錯誤,並繼續工具呼叫。

PostToolUse 支援 systemMessagecontinue: falsestopReasonsuppressOutput 已解析,但當前不支援該事件。

大鉤輸出

預設情況下,Codex 將每個模型可見的鉤子輸出訊息大致限制為 2,500 個代幣。如果掛鉤返回更多內容,則 Codex 將全文儲存在 <temp_dir>/hook_outputs/<session_id>/<uuid>.txt 並給模型一個 帶有儲存檔案路徑的頭尾預覽。這種行為稱為 溢位:Codex 將超大輸出儲存在磁碟上並將其替換為 更短的模型可見預覽。如果檔案無法寫入,模型仍然存在 收到截斷的預覽。

對於任何返回 additionalContext 的命令掛鉤,設定 處理程序上的 additionalContextLimit 自定義近似令牌 臨界點:

{
  "type": "command",
  "command": "python3 ~/.codex/hooks/session_start.py",
  "additionalContextLimit": 5000
}

省略 additionalContextLimit 以使用預設的 2500 令牌閾值。使用一個 正整數來選擇不同的閾值,或 0 來傳遞處理程序的 直接為模型完成附加上下文。 Codex 評估每個 獨立匹配處理程序。對於無法產生額外費用的事件 上下文,Codex 忽略 additionalContextLimit 並報告設定 警告。

該設定僅適用於additionalContext。工具回饋和延續 提示保留預設限制。

由於過大的輸出可以寫入磁碟,因此避免返回機密或 鉤子輸出中的其他敏感資料。

掛鉤

會話開始

對於此事件,matcher 應用於 source

通用輸入欄位之外的欄位:

領域 類型 意義
source string 會話如何開始:startupresumeclearcompact

stdout 上的純文本被新增為額外的開發人員上下文。

stdout 上的 JSON 支援 通用輸出欄位 並且這個 鉤子具體形狀:

{
  "hookSpecificOutput": {
    "hookEventName": "SessionStart",
    "additionalContext": "Load the workspace conventions before editing."
  }
}

additionalContext 文本被新增為額外的開發人員上下文。

Codex 壓縮根會話後,SessionStart 掛鉤匹配 source: "compact" 在下一個模型 request 之前執行。這也適用於當 自動壓縮發生在 turn 的中間:Codex 傳遞鉤子的 立即繼續的附加上下文而不是等待 後來的使用者是turn。如果鉤子返回continue: false,則Codex結束turn 無需傳送另一個模型request。

會話結束

SessionEnd 允許你在會話結束時執行命令,例如儲存最終的 筆記或清理檔案。當你歸檔或 當 Codex 正常關閉時或在 對話已空閒且未在任何連線的客戶端中開啟 30 分鐘。它不會為子智能體執行。

退出對話或呼叫 thread/unsubscribe 不會結束 會話立即,因此它不會立即執行 SessionEnd。你的鉤子可以 在執行時仍然讀取會話記錄。

matcher 過濾此事件的 reason。目前,reason 始終是 other。 你可以省略 matcher 或使用 other 在每個 SessionEnd 事件上執行。

通用輸入欄位之外的欄位:

領域 類型 意義
reason string 會議為何結束:other

例如,SessionEnd 命令接收:

{
  "session_id": "thr_123",
  "transcript_path": "/workspace/.codex/rollout.jsonl",
  "cwd": "/workspace",
  "hook_event_name": "SessionEnd",
  "reason": "other"
}

SessionEnd 掛鉤是建議性的。他們的輸出不會引導 Codex 或保持 thread 開啟。如果命令超時或因錯誤退出,Codex 會將其報告為 鉤子故障。

子智能體啟動

對於此事件,matcher 應用於 agent_type

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活動 Codex turn id
agent_id string 子智能體的識別符號
agent_type string 子智能體類型或設定檔
permission_mode string 當前權限模式

stdout 上的純文本被新增為子智能體的額外開發人員上下文。

stdout 上的 JSON 支援 systemMessage 和此鉤子特定形狀:

{
  "hookSpecificOutput": {
    "hookEventName": "SubagentStart",
    "additionalContext": "Review the repository test conventions first."
  }
}

additionalContext 文本被新增為額外的開發人員上下文 子智能體。 continue: false 被解析為相容性,但它不會阻止 子智能體從一開始。

預工具使用

PreToolUse可以攔截Bash,通過apply_patch執行的檔案編輯, MCP工具呼叫,以及其他本機功能工具。請參閱工具 coverage 瞭解受支援的路徑和例外情況。

matcher 適用於 tool_name 和匹配器別名。對於檔案編輯,通過 apply_patchmatcher 值可以使用 apply_patchEditWrite;掛鉤輸入 仍然報告 tool_name: "apply_patch"

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活躍 Codex turn id
tool_name string 規範掛鉤工具名稱,例如 Bashapply_patch 或 MCP 名稱,例如 mcp__fs__read
tool_use_id string 此呼叫的工具呼叫 ID
tool_input JSON value 特定於工具的輸入。 Bashapply_patch使用tool_input.command。 MCP 和其他本機函式工具傳送它們的參數。

stdout 上的純文本將被忽略。

JSON在stdout上可以使用systemMessage。要拒絕支援的工具呼叫,請返回 此鉤子特定形狀:

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "Destructive command blocked by hook."
  }
}

Codex 也接受這種舊的塊形狀:

{
  "decision": "block",
  "reason": "Destructive command blocked by hook."
}

你還可以使用退出程式碼 2 並將阻止原因寫入 stderr

要新增模型可見上下文而不阻塞,請返回 hookSpecificOutput.additionalContext

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "additionalContext": "The pending command touches generated files."
  }
}

要重寫支援的工具呼叫而不阻塞,請返回 permissionDecision: "allow"updatedInput

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "allow",
    "updatedInput": {
      "command": "echo rewritten"
    }
  }
}

對於 Bash 命令和 apply_patchupdatedInput 必須包含一個字串 command 欄位。對於MCP等本機功能工具,updatedInput是 替換參數物件。僅返回 updatedInput permissionDecision: "allow";其他 updatedInput 形狀報告為 錯誤。

permissionDecision: "ask"、舊版 decision: "approve"continue: falsestopReasonsuppressOutput 已解析,但尚不支援。 Codex 標記 掛鉤執行失敗,報告錯誤,並繼續工具呼叫。

許可請求

PermissionRequest 在 Codex 即將請求核准時執行,例如 shell 升級或託管網路核准。可以允許request,拒絕 request,或拒絕決定並讓正常的核准提示繼續。 它不會針對不需要核准的命令執行。

matcher 適用於 tool_name 和匹配器別名。當前規範 值包括 Bashapply_patch 和 MCP 工具名稱,例如 mcp__server__toolapply_patch 還匹配 EditWrite

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活躍 Codex turn id
tool_name string 規範掛鉤工具名稱,例如 Bashapply_patch 或 MCP 名稱,例如 mcp__fs__read
tool_input JSON value 特定於工具的輸入。 Bashapply_patch 使用 tool_input.command,而 MCP 工具傳送所有參數。
tool_input.description string | null 當 Codex 有一個時,人類可讀的核准原因

stdout 上的純文本將被忽略。

一些工具輸入可能包括人類可讀的描述,但不依賴於 每個工具的 tool_input.description 欄位。

要核准 request,請返回:

{
  "hookSpecificOutput": {
    "hookEventName": "PermissionRequest",
    "decision": {
      "behavior": "allow"
    }
  }
}

要拒絕 request,請返回:

{
  "hookSpecificOutput": {
    "hookEventName": "PermissionRequest",
    "decision": {
      "behavior": "deny",
      "message": "Blocked by repository policy."
    }
  }
}

如果多個匹配的鉤子返回決策,則任何 deny 獲勝。否則,一個 allow 讓 request 繼續進行,而不顯示核准提示。如果沒有 匹配鉤子決定,Codex使用正常的審批流程。

不要返回 updatedInputupdatedPermissionsinterrupt PermissionRequest;這些欄位是為將來的行為保留的並且會失敗 今天關閉。

後期工具使用

PostToolUse 在支援的工具產生輸出後執行,包括 Bash、 apply_patch、MCP工具呼叫,以及其他本機功能工具。對於 Bash 來說,它 也在以非零狀態退出的命令之後執行。它無法撤消側面 已經執行的工具的效果。請參閱工具覆蓋率 支援的路徑和例外。

matcher 適用於 tool_name 和匹配器別名。對於檔案編輯,通過 apply_patchmatcher 值可以使用 apply_patchEditWrite;掛鉤輸入 仍然報告 tool_name: "apply_patch"

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活躍 Codex turn id
tool_name string 規範掛鉤工具名稱,例如 Bashapply_patch 或 MCP 名稱,例如 mcp__fs__read
tool_use_id string 此呼叫的工具呼叫 ID
tool_input JSON value 特定於工具的輸入。 Bashapply_patch使用tool_input.command。 MCP 和其他本機函式工具傳送它們的參數。
tool_response JSON value 特定於工具的輸出。 MCP工具傳送MCP呼叫結果。其他本機函式工具通常傳送其面向模型的輸出。

stdout 上的純文本將被忽略。

JSON在stdout上可以使用systemMessage和這個鉤子特定的形狀:

{
  "decision": "block",
  "reason": "The Bash output needs review before continuing.",
  "hookSpecificOutput": {
    "hookEventName": "PostToolUse",
    "additionalContext": "The command updated generated files."
  }
}

additionalContext 文本被新增為額外的開發人員上下文。

對於此事件,decision: "block" 不會撤消已完成的 Bash 命令。 相反,Codex 記錄回饋,並用該結果替換工具結果 回饋,並從鉤子提供的訊息繼續模型。

你還可以使用退出程式碼 2 並將回饋原因寫入 stderr

命令執行後停止對原始工具結果的正常處理 已經執行,返回continue: false。 Codex 將用工具結果替換 你的回饋或停止發簡訊並從那裡繼續。

updatedMCPToolOutputsuppressOutput 已解析,但尚不支援。 Codex 將鉤子執行標記為失敗,報告錯誤,並繼續正常 工具結果的處理。

從程式碼模式呼叫工具

當模型使用程式碼模式從 JavaScript 呼叫工具時,將應用掛鉤決策 到那個巢狀呼叫。 PreToolUse 可以在工具執行或重寫之前停止該工具 它的輸入。阻止 PostToolUse 無法消除該工具的副作用,但它 可以阻止原始結果到達正在執行的指令碼。

|掛鉤結果 | | 程式碼模式看什麼 | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | PreToolUse 塊 |工具承諾在工具執行之前被拒絕。 | | PreToolUse 返回 updatedInput |該工具使用重寫的輸入執行,並且承諾以該結果解決。 | | PostToolUse 返回 decision: "block" 或退出並返回程式碼 2 |該工具執行,然後承諾因鉤子原因而拒絕。 | | PostToolUse 返回 continue: false | Codex 使用鉤子回饋來獲得模型可見的結果,但不拒絕巢狀工具承諾。 |

預緊湊型

PreCompact 在 Codex 壓縮聊天之前執行。適用matchertrigger,其值為manualauto

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活動 Codex turn id
trigger string 是什麼觸發了壓縮:manualauto

stdout 上的純文本將被忽略。

stdout上的JSON支援公共輸出欄位。如果一個 匹配的 PreCompact 鉤子返回 continue: false,Codex 在之前停止 壓實。

後緊湊型

PostCompact 在 Codex 壓縮聊天后執行。適用matchertrigger,其值為manualauto

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活動 Codex turn id
trigger string 是什麼觸發了壓縮:manualauto

stdout 上的純文本將被忽略。

stdout上的JSON支援公共輸出欄位。如果一個 匹配的 PostCompact 鉤子返回 continue: false,Codex 之後停止 壓實。

使用者提示提交

matcher 當前未用於此事件。

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活動 Codex turn id
prompt string 即將傳送的使用者提示

stdout 上的純文本被新增為額外的開發人員上下文。

stdout 上的 JSON 支援 通用輸出欄位 和 此鉤子特定形狀:

{
  "hookSpecificOutput": {
    "hookEventName": "UserPromptSubmit",
    "additionalContext": "Ask for a clearer reproduction before editing files."
  }
}

additionalContext 文本被新增為額外的開發人員上下文。

要阻止提示,請返回:

{
  "decision": "block",
  "reason": "Ask for confirmation before doing that."
}

你還可以使用退出程式碼 2 並將阻止原因寫入 stderr

子智能體停止

對於此事件,matcher 應用於 agent_type

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。 Active Codex turn id
agent_id string 子智能體的識別符號
agent_type string 子智能體類型或設定檔
agent_transcript_path string | null 子智能體轉錄檔案的路徑(如果有)
stop_hook_active boolean 該子智能體是否已繼續
last_assistant_message string | null 最新的子智能體助理訊息(如果有)

SubagentStop 退出 0 時,stdout 上期望 JSON。純文本輸出是 對於本次活動無效。

stdout上的JSON支援公共輸出欄位。去問 Codex 繼續子智能體流程,返回:

{
  "decision": "block",
  "reason": "Run one more focused pass inside the subagent."
}

你還可以使用退出程式碼 2 並將繼續原因寫入 stderr

如果任何匹配的 SubagentStop 鉤子返回 continue: false,則需要 優先於其他匹配 SubagentStop 的繼續決策 鉤子。

停止

matcher 當前未用於此事件。

通用輸入欄位之外的欄位:

領域 類型 意義
turn_id string Codex 特定擴充套件。活動 Codex turn id
stop_hook_active boolean 這個turn是否已經被Stop繼續了
last_assistant_message string | null 最新的助理訊息文本(如果有)

Stop 退出 0 時,stdout 上期望 JSON。純文本輸出無效 為了這次活動。

stdout上的JSON支援公共輸出欄位。為了保留 Codex 前進,返回:

{
  "decision": "block",
  "reason": "Run one more pass over the failing tests."
}

你還可以使用退出程式碼 2 並將繼續原因寫入 stderr

對於該事件,decision: "block" 不會拒絕 turn。相反,它告訴 Codex 繼續並自動建立一個新的繼續提示符 作為新使用者提示,使用 reason 作為提示文本。

如果任何匹配的 Stop 掛鉤返回 continue: false,則優先 超過其他匹配的 Stop 鉤子的繼續決策。

模式

如果你需要確切的當前線路格式,請參閱中生成的模式 Codex GitHub 儲存庫

純文本別名

  • 字串|無效的