掛鉤
在 Codex 生命週期中執行確定性指令碼
Hooks 是 Codex 的可擴充套件框架。他們允許 你可以將自己的指令碼注入智能體迴圈中,從而啟用以下功能:
- 將聊天傳送到自定義日誌記錄/分析引擎
- 掃描團隊的提示以阻止意外貼上 API 金鑰
- 總結聊天記錄,自動建立持久記憶
- 當聊天 turn 停止時執行自定義驗證檢查,執行標準
- 自定義在某個目錄時的提示
要記住的執行時行為:
- 來自多個檔案的匹配鉤子全部執行。
- 同時啟動同一事件的多個匹配命令掛鉤, 所以一個鉤子不能阻止另一個匹配鉤子的啟動。
- 非託管命令掛鉤在執行之前必須經過審查和信任。
鉤子在對話中的不同點執行:
| 當 | 掛鉤 |
|---|---|
| 在 turn | 期間PreToolUse、PermissionRequest、PostToolUse、PreCompact、PostCompact、UserPromptSubmit、SubagentStop、Stop |
| 當會話或子智能體啟動時 | SessionStart,SubagentStart |
| 當主thread結束時 | SessionEnd(不為子智能體執行) |
Codex 在哪裡尋找鉤子
Codex 以以下任一形式發現活動設定層旁邊的鉤子:
hooks.jsonconfig.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 執行已啟用的掛鉤,無需
該呼叫的持久鉤子信任。
設定形狀
鉤子分為三個級別:
PreToolUse、PostToolUse、PreCompact等鉤子事件,SubagentStart或Stop- 決定事件何時匹配的匹配器組
- 當匹配器組匹配時執行的一個或多個鉤子處理程序
{
"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
}
]
}
]
}
}筆記:
description是hooks.json檔案的可選頂級後設資料。它 不會改變執行的鉤子。timeout以秒為單位。- 如果省略
timeout,則 Codex 對大多數掛鉤使用600秒。SessionEnd預設使用1秒,最多支援3秒。
statusMessage是可選的。additionalContextLimit設定命令鉤子可以多少additionalContext在 Codex 將全文儲存到磁碟並傳送較短的文本之前傳送到模型 而是預覽。請參閱大鉤子輸出。commandWindows是可選的僅 Windows 命令覆蓋。在 TOML 中,使用command_windows或commandWindows。- 解析
async選項,但不支援非同步命令掛鉤 然而。 - 今天僅執行
type: "command"處理程序。prompt和agent處理程序是 已解析但被跳過。 - 命令以會話
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_ROOT和CLAUDE_PLUGIN_DATA與現有外掛掛鉤的相容性。
外掛掛鉤使用與其他掛鉤相同的事件模式。安裝或啟用 外掛不會自動信任它的鉤子; Codex 跳過外掛捆綁的鉤子 直到你檢視並信任當前的鉤子定義。
匹配器模式
matcher 欄位是一個正規表示式字串,用於在鉤子觸發時進行過濾。使用"*",
"",或完全省略 matcher 以匹配受支援的每次出現
事件。
目前只有一些 Codex 事件支援 matcher:
| 活動 | matcher 過濾什麼 |
筆記 |
|---|---|---|
PermissionRequest |
工具名稱 | 支援包括 Bash、apply_patch* 和 MCP 工具名稱 |
PostToolUse |
工具名稱 | 請參閱工具覆蓋率 |
PostCompact |
壓實觸發器 | 值為 manual 或 auto |
PreCompact |
壓實觸發器 | 值為 manual 或 auto |
PreToolUse |
工具名稱 | 請參閱工具覆蓋率 |
SessionEnd |
結束原因 | 目前只有other |
SessionStart |
啟動原始碼 | 值為 startup、resume、clear 和 compact |
SubagentStart |
子智能體類型 | 值取決於啟動的子智能體 |
SubagentStop |
子智能體類型 | 值取決於停止的子智能體 |
UserPromptSubmit |
不支援 | 此事件將忽略任何已設定的 matcher |
Stop |
不支援 | 此事件將忽略任何已設定的 matcher |
*對於apply_patch,matcher值也可以使用Edit或Write。
範例:
Bash^apply_patch$Edit|Writemcp__filesystem__read_filemcp__filesystem__.*startup|resume|clear|compactmanual|auto
工具覆蓋範圍
PreToolUse和PostToolUse可以觀察到比shell和MCP更多的呼叫。最多
本機函式工具使用相同的鉤子路徑,因此你可以匹配它們的工具名稱,
檢查它們的 JSON 參數,對於 PreToolUse,阻止或重寫呼叫。
| 刀具路徑 | PreToolUse |
PostToolUse |
筆記 |
|---|---|---|---|
| 外殼命令 | 是的 | 是的 | 匹配為 Bash。 |
統一執行(exec_command) |
是的 | 是的 | 匹配為 Bash。當該命令完成時,稍後的 write_stdin 輪詢可以傳遞原始命令的 PostToolUse。 |
apply_patch |
是的 | 是的 | 匹配為 apply_patch、Edit 或 Write。 |
| MCP 工具 | 是的 | 是的 | 匹配MCP工具名稱,例如mcp__filesystem__read_file。 |
| 其他本機功能工具 | 是的 | 是的 | 匹配功能工具名稱,例如update_plan。 spawn_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 特定擴充套件
特定於事件的表。
SessionStart、PreToolUse、PermissionRequest、PostToolUse、
UserPromptSubmit、SubagentStart、SubagentStop 和 Stop 還包括
permission_mode,描述當前權限模式為default,
acceptEdits、plan、dontAsk 或 bypassPermissions。
為了方便起見,transcript_path 指向聊天記錄,但是
轉錄格式不是鉤子的穩定介面,可能會隨著時間的推移而改變。
如果你需要完整的有線格式,請參閱Schemas。
公共輸出欄位
SessionStart、PreCompact、PostCompact、UserPromptSubmit、
SubagentStop 和 Stop 支援這些共享的 JSON 欄位。 SubagentStart
接受 systemMessage 和特定於鉤子的上下文的相同形狀,但是
continue: false 不會停止子智能體:
{
"continue": true,
"stopReason": "optional",
"systemMessage": "optional",
"suppressOutput": false
}| 領域 | 效果 |
|---|---|
continue |
如果為 false,則將該鉤子執行標記為已停止 |
stopReason |
記錄為停止原因 |
systemMessage |
在 UI 或事件流中作為警告出現 |
suppressOutput |
今天解析但尚未實現 |
退出 0 且無輸出視為成功,Codex 繼續。
PreToolUse和PermissionRequest支援systemMessage,但continue,
這些事件當前不支援 stopReason 和 suppressOutput。
如果 PreToolUse 掛鉤返回這些不支援的欄位之一,則 Codex 標記
該掛鉤執行失敗,報告錯誤,並繼續工具呼叫。
PostToolUse 支援 systemMessage、continue: false 和 stopReason。
suppressOutput 已解析,但當前不支援該事件。
大鉤輸出
預設情況下,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 |
會話如何開始:startup、resume、clear 或 compact |
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_patch、matcher 值可以使用 apply_patch、Edit 或 Write;掛鉤輸入
仍然報告 tool_name: "apply_patch"。
通用輸入欄位之外的欄位:
| 領域 | 類型 | 意義 |
|---|---|---|
turn_id |
string |
Codex 特定擴充套件。活躍 Codex turn id |
tool_name |
string |
規範掛鉤工具名稱,例如 Bash、apply_patch 或 MCP 名稱,例如 mcp__fs__read |
tool_use_id |
string |
此呼叫的工具呼叫 ID |
tool_input |
JSON value |
特定於工具的輸入。 Bash和apply_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_patch,updatedInput 必須包含一個字串
command 欄位。對於MCP等本機功能工具,updatedInput是
替換參數物件。僅返回 updatedInput
permissionDecision: "allow";其他 updatedInput 形狀報告為
錯誤。
permissionDecision: "ask"、舊版 decision: "approve"、continue: false、
stopReason 和 suppressOutput 已解析,但尚不支援。 Codex 標記
掛鉤執行失敗,報告錯誤,並繼續工具呼叫。
許可請求
PermissionRequest 在 Codex 即將請求核准時執行,例如
shell 升級或託管網路核准。可以允許request,拒絕
request,或拒絕決定並讓正常的核准提示繼續。
它不會針對不需要核准的命令執行。
matcher 適用於 tool_name 和匹配器別名。當前規範
值包括 Bash、apply_patch 和 MCP 工具名稱,例如
mcp__server__tool; apply_patch 還匹配 Edit 和 Write。
通用輸入欄位之外的欄位:
| 領域 | 類型 | 意義 |
|---|---|---|
turn_id |
string |
Codex 特定擴充套件。活躍 Codex turn id |
tool_name |
string |
規範掛鉤工具名稱,例如 Bash、apply_patch 或 MCP 名稱,例如 mcp__fs__read |
tool_input |
JSON value |
特定於工具的輸入。 Bash 和 apply_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使用正常的審批流程。
不要返回 updatedInput、updatedPermissions 或 interrupt
PermissionRequest;這些欄位是為將來的行為保留的並且會失敗
今天關閉。
後期工具使用
PostToolUse 在支援的工具產生輸出後執行,包括 Bash、
apply_patch、MCP工具呼叫,以及其他本機功能工具。對於 Bash 來說,它
也在以非零狀態退出的命令之後執行。它無法撤消側面
已經執行的工具的效果。請參閱工具覆蓋率
支援的路徑和例外。
matcher 適用於 tool_name 和匹配器別名。對於檔案編輯,通過
apply_patch、matcher 值可以使用 apply_patch、Edit 或 Write;掛鉤輸入
仍然報告 tool_name: "apply_patch"。
通用輸入欄位之外的欄位:
| 領域 | 類型 | 意義 |
|---|---|---|
turn_id |
string |
Codex 特定擴充套件。活躍 Codex turn id |
tool_name |
string |
規範掛鉤工具名稱,例如 Bash、apply_patch 或 MCP 名稱,例如 mcp__fs__read |
tool_use_id |
string |
此呼叫的工具呼叫 ID |
tool_input |
JSON value |
特定於工具的輸入。 Bash和apply_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 將用工具結果替換
你的回饋或停止發簡訊並從那裡繼續。
updatedMCPToolOutput 和 suppressOutput 已解析,但尚不支援。
Codex 將鉤子執行標記為失敗,報告錯誤,並繼續正常
工具結果的處理。
從程式碼模式呼叫工具
當模型使用程式碼模式從 JavaScript 呼叫工具時,將應用掛鉤決策
到那個巢狀呼叫。 PreToolUse 可以在工具執行或重寫之前停止該工具
它的輸入。阻止 PostToolUse 無法消除該工具的副作用,但它
可以阻止原始結果到達正在執行的指令碼。
|掛鉤結果 | | 程式碼模式看什麼
| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| PreToolUse 塊 |工具承諾在工具執行之前被拒絕。 |
| PreToolUse 返回 updatedInput |該工具使用重寫的輸入執行,並且承諾以該結果解決。 |
| PostToolUse 返回 decision: "block" 或退出並返回程式碼 2 |該工具執行,然後承諾因鉤子原因而拒絕。 |
| PostToolUse 返回 continue: false | Codex 使用鉤子回饋來獲得模型可見的結果,但不拒絕巢狀工具承諾。 |
預緊湊型
PreCompact 在 Codex 壓縮聊天之前執行。適用matcher
為trigger,其值為manual和auto。
通用輸入欄位之外的欄位:
| 領域 | 類型 | 意義 |
|---|---|---|
turn_id |
string |
Codex 特定擴充套件。活動 Codex turn id |
trigger |
string |
是什麼觸發了壓縮:manual 或 auto |
stdout 上的純文本將被忽略。
stdout上的JSON支援公共輸出欄位。如果一個
匹配的 PreCompact 鉤子返回 continue: false,Codex 在之前停止
壓實。
後緊湊型
PostCompact 在 Codex 壓縮聊天后執行。適用matcher
為trigger,其值為manual和auto。
通用輸入欄位之外的欄位:
| 領域 | 類型 | 意義 |
|---|---|---|
turn_id |
string |
Codex 特定擴充套件。活動 Codex turn id |
trigger |
string |
是什麼觸發了壓縮:manual 或 auto |
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 儲存庫。
純文本別名
- 字串|無效的