Hook'lar
Hook'lar
Codex yaşam döngüsü sırasında deterministik betikler çalıştırın
Hook'lar, Codex için bir genişletilebilirlik çerçevesidir. Ajan döngüsü sırasında betikler veya MCP araçları çalıştırmanıza olanak tanıyarak aşağıdaki gibi özellikleri mümkün kılar:
- Sohbeti özel bir günlük kaydı/analiz motoruna gönderme
- API anahtarlarının yanlışlıkla yapıştırılmasını engellemek için ekibinizin istemlerini tarama
- Kalıcı anıları otomatik olarak oluşturmak için sohbetleri özetleme
- Bir sohbet turu durduğunda standartları zorunlu kılan özel bir doğrulama denetimi çalıştırma
- Belirli bir dizindeyken istemleri özelleştirme
Göz önünde bulundurulması gereken çalışma zamanı davranışları:
- Birden fazla dosyadaki eşleşen hook'ların tümü çalışır.
- Aynı olay için eşleşen birden fazla komut hook'u eşzamanlı olarak başlatılır; dolayısıyla bir hook, eşleşen başka bir hook'un başlamasını engelleyemez.
- Yönetilmeyen hook'lar çalıştırılmadan önce incelenmeli ve güvenilir olarak işaretlenmelidir.
Hook'lar bir konuşmanın farklı noktalarında çalışır:
| Ne zaman | Hook'lar |
|---|---|
| Bir tur sırasında | PreToolUse, PermissionRequest, PostToolUse, PreCompact, PostCompact, UserPromptSubmit, SubagentStop, Stop |
| Etkin bir turu kestiğinizde | Interrupt (alt ajanlar için çalışmaz) |
| Bir oturum veya alt ajan başladığında | SessionStart, SubagentStart |
| Ana iş parçacığı sona erdiğinde | SessionEnd (alt ajanlar için çalışmaz) |
Codex hook'ları nerede arar?
Codex, etkin yapılandırma katmanlarının yanında bulunan şu iki biçimdeki hook'ları keşfeder:
hooks.jsonconfig.tomliçindeki satır içi[hooks]tabloları
Yüklü eklentiler de yaşam döngüsü yapılandırmasını kendi eklenti
manifestleri veya varsayılan bir hooks/hooks.json dosyası aracılığıyla paketleyebilir. Eklenti
paketleme kuralları için Eklenti oluşturma bölümüne
bakın.
Uygulamada en kullanışlı dört konum şunlardır:
~/.codex/hooks.json~/.codex/config.toml<repo>/.codex/hooks.json<repo>/.codex/config.toml
Birden fazla hook kaynağı varsa Codex, eşleşen hook'ların tümünü yükler.
Daha yüksek öncelikli yapılandırma katmanları, daha düşük öncelikli hook'ların yerini almaz.
Tek bir katman hem hooks.json hem de satır içi [hooks] içeriyorsa Codex
bunları birleştirir ve başlangıçta uyarı verir. Her katmanda tek bir gösterim biçimini tercih edin.
Codex, etkin eklentilerle paketlenmiş hook'ları da keşfedebilir. Eklentiyle paketlenmiş hook'lar diğer hook kaynaklarıyla birlikte yüklenir ve yönetilmeyen diğer hook'larla aynı güven inceleme akışını kullanır.
Projeye yerel hook'lar yalnızca projenin .codex/ katmanına güvenildiğinde yüklenir. Güvenilmeyen
projelerde Codex, kullanıcı ve sistem hook'larını kendi etkin
yapılandırma katmanlarından yüklemeye devam eder.
Hook'ları inceleme ve güvenilir olarak işaretleme
Codex, hangilerinin çalışabileceğine karar vermeden önce yapılandırılmış hook'ları listeler. Bir yönetilmeyen hook çalışmadan önce Codex, tam hook tanımını inceleyip güvenilir olarak işaretlemenizi gerektirir. Codex güven kaydını hook'un geçerli karmasıyla ilişkilendirir; bu nedenle yeni veya değiştirilmiş hook'lar, güvenilir olarak işaretlenene kadar incelenecek olarak işaretlenir ve atlanır.
Hook kaynaklarını incelemek, yeni ya da değiştirilmiş hook'ları gözden geçirmek,
hook'ları güvenilir olarak işaretlemek veya yönetilmeyen hook'ları tek tek devre dışı bırakmak için CLI'da /hooks kullanın. Hook'ların başlangıçta incelenmesi gerekiyorsa
Codex, /hooks açmanızı söyleyen bir uyarı yazdırır.
Sistem, MDM, bulut veya requirements.toml kaynaklarından gelen yönetilen hook'lar
yönetilen olarak işaretlenir, ilke gereği güvenilir kabul edilir ve kullanıcı hook tarayıcısından devre dışı bırakılamaz.
Hook kaynaklarını Codex dışında zaten doğrulayan tek seferlik otomasyonlarda, kalıcı
hook güveni gerektirmeden etkin hook'ları çalıştırmak için
--dangerously-bypass-hook-trust iletin.
Yapılandırma biçimi
Hook'lar üç düzeyde düzenlenir:
PreToolUse,PostToolUse,PreCompact,SubagentStartveyaStopgibi bir hook olayı- Olayın ne zaman eşleşeceğine karar veren bir eşleştirici grubu
- Eşleştirici grubu eşleştiğinde çalışan bir veya daha fazla hook işleyicisi
{
"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
}
]
}
]
}
}Notlar:
description, birhooks.jsondosyası için isteğe bağlı üst düzey meta verilerdir. Hangi hook'ların çalışacağını değiştirmez.timeoutsaniye cinsindendir.timeoutbelirtilmezse Codex çoğu hook için600saniye kullanır.SessionEndveInterruptvarsayılan olarak1saniye kullanır ve3saniyeye kadar destekler.
statusMessageisteğe bağlıdır.additionalContextLimit, Codex tam metni diske kaydedip bunun yerine daha kısa bir önizleme göndermeden önce bir komut hook'unun modele ne kadaradditionalContextgönderebileceğini belirler. Büyük hook çıktısı bölümüne bakın.commandWindowsyalnızca Windows'a özgü, isteğe bağlı bir komut geçersiz kılma ayarıdır. TOML'dacommand_windowsveyacommandWindowskullanın.- Bir komut hook'unu arka planda çalıştırmak için
asyncdeğerinitrueolarak ayarlayın. commandvemcp_toolişleyicileri desteklenir.promptveagentişleyicileri ayrıştırılır ancak atlanır.- Komutlar, çalışma dizini olarak oturumun
cwddeğerini kullanır. - Depoya yerel hook'larda
.codex/hooks/...gibi göreli bir yol kullanmak yerine yolu git kökünden çözümlemeyi tercih edin. Codex bir alt dizinden başlatılabilir; git kökünü temel alan bir yol, hook konumunu sabit tutar.
config.toml içindeki eşdeğer satır içi 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"MCP aracı hook'ları
Bir MCP aracı hook'u, bir yaşam döngüsü olayının zaten bağlı olan bir MCP sunucusundaki aracı çağırmasına olanak tanır. Yapılandırılmış argümanları doğrudan araca gönderir ve bir komut hook'uyla aynı güven incelemesini ve çıktı sözleşmesini kullanır.
Bir MCP aracı hook'unu yapılandırma
Bu hook, Codex dosyaları yazdıktan veya düzenledikten sonra her yamayı taramasını scanner MCP
sunucusundan ister:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "mcp_tool",
"server": "scanner",
"tool": "scan_patch",
"input": { "patch": "${tool_input.command}" },
"timeout": 30,
"statusMessage": "Scanning edited files"
}
]
}
]
}
}| Alan | Anlamı |
|---|---|
type |
mcp_tool olmalıdır. |
server |
Zaten bağlı olan bir MCP sunucusunun zorunlu adı. |
tool |
Bu sunucunun sunduğu bir aracın zorunlu adı. |
input |
İsteğe bağlı JSON argüman şablonları nesnesi. Varsayılanı {} değeridir. |
timeout |
Saniye cinsinden isteğe bağlı etkin yürütme zaman aşımı. Varsayılanı 600 değeridir. |
statusMessage |
Hook çalışırken gösterilen isteğe bağlı mesaj. |
Hook olayından argümanları genişletme
Hook olayından noktalı bir alanı okumak için ${field.nested} kullanın. Bir değerin
tamamını dolduran yer tutucu, JSON türünü korur. Daha büyük bir dizenin içindeki
yer tutucu metin olarak işlenir. Codex nesneleri ve dizileri özyinelemeli olarak genişletir.
{"tool_input":{"file_path":"src/main.rs","count":3}} içeren bir olay için şu argüman şablonu:
{
"path": "${tool_input.file_path}",
"count": "${tool_input.count}",
"message": "Scanning ${tool_input.file_path}"
}şuna dönüşür:
{
"path": "src/main.rs",
"count": 3,
"message": "Scanning src/main.rs"
}Yürütme ve yaşam döngüsü
- Hook'lar mevcut bir MCP bağlantısını kullanır. Sunucuları başlatmaz veya yeniden bağlamazlar.
- Araç engelleme kararı döndürdüğünde bir hook işlemi engelleyebilir. Hatalar, eksik sunucular ve kullanılamayan araçlar işlemi engellemez.
- MCP aracı hook'ları eşzamanlı çalışır. Araç onayı istemez veya başka hook'ları tetiklemezler.
- Hook ya da sunucu zaman aşımlarından daha kısa olanı uygulanır. MCP bilgi isteme yanıtını bekleyerek geçirilen süre, zaman aşımından sayılmaz.
SessionStarthook'ları bir MCP sunucusu hazır olmadan önce çalışabilir. Böyle bir durumda oturumu engellemezler.SessionEnd, MCP aracı hook'larını desteklemez.
Hook'ları kapatma
Hook'lar varsayılan olarak etkindir. Bunları config.toml içinde kapatmak için şu ayarı yapın:
[features]
hooks = falseStandart özellik anahtarı olarak hooks kullanın. codex_hooks, kullanımdan kaldırılmış bir
takma ad olarak çalışmaya devam eder. Yöneticiler, requirements.toml içinde [features].hooks = false kullanarak
hook'ları aynı şekilde zorunlu olarak kapatabilir.
requirements.toml kaynaklı yönetilen hook'lar
Kuruluş tarafından yönetilen gereksinimler, hook'ları [hooks] altında satır içinde de tanımlayabilir.
Bu, yöneticiler hook yapılandırmasını zorunlu kılarken gerçek betikleri
MDM veya başka bir cihaz yönetim sistemi üzerinden sağlamak istediğinde kullanışlıdır.
Hook'ları yerel olarak devre dışı bırakmış kullanıcılar için bile yönetilen hook'ları zorunlu kılmak üzere
[features].hooks = true değerini requirements.toml içinde [hooks] ile birlikte sabitleyin. Yönetici tarafından
yönetilen hook'lara izin vermeyi sürdürürken kullanıcı, proje, oturum ve eklenti hook'larını
yok saymak için allow_managed_hooks_only = true değerini ayarlayın.
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"Yönetilen hook'lara ilişkin notlar:
- macOS ve Linux'ta
managed_dirkullanılır. - Windows'ta
windows_managed_dirkullanılır. - Codex,
managed_diriçindeki betikleri dağıtmaz; kuruluş araçlarınız bunları ayrı olarak yüklemeli ve güncellemelidir. - Yönetilen hook komutları, yapılandırılmış yönetilen dizinin altındaki mutlak betik yollarını kullanmalıdır.
allow_managed_hooks_only = true; kullanıcı, proje, oturum ve eklenti kaynaklarından gelen hook'ları atlar ancakrequirements.tomlile diğer yönetilen yapılandırma katmanlarından gelen yönetilen hook'ları yüklemeyi sürdürür.
Eklentiyle paketlenmiş hook'lar
Bir eklenti etkinleştirildiğinde Codex, bu eklentideki yaşam döngüsü hook'larını kullanıcı, proje ve yönetilen hook'larla birlikte yükleyebilir.
Codex varsayılan olarak eklenti kökünün içinde hooks/hooks.json arar. Bir eklenti
manifesti, .codex-plugin/plugin.json içindeki bir hooks girdisiyle bu varsayılanı geçersiz kılabilir.
Manifest girdisi; ./ ön ekli bir yol, ./ ön ekli yollar dizisi, satır içi bir hook nesnesi veya satır içi
hook nesneleri dizisi olabilir.
{
"name": "repo-policy",
"hooks": "./hooks/hooks.json"
}Manifest hook yolları eklenti köküne göre çözümlenir ve bu kökün
içinde kalmalıdır. Bir manifest hooks tanımlıyorsa Codex, varsayılan hooks/hooks.json yerine bu manifest
girdilerini kullanır.
Eklenti hook komutları şu ortam değişkenlerini alır:
PLUGIN_ROOT, yüklü eklenti kökünü gösteren Codex'e özgü bir uzantıdır.PLUGIN_DATA, eklentinin yazılabilir veri dizinini gösteren Codex'e özgü bir uzantıdır.- Codex, mevcut eklenti hook'larıyla uyumluluk için
CLAUDE_PLUGIN_ROOTveCLAUDE_PLUGIN_DATAdeğerlerini de ayarlar.
Eklenti hook'ları diğer hook'larla aynı olay şemasını kullanır. Bir eklentiyi yüklemek veya etkinleştirmek, hook'larını otomatik olarak güvenilir kılmaz; Codex, geçerli hook tanımını inceleyip güvenilir olarak işaretleyene kadar eklentiyle paketlenmiş hook'ları atlar.
Eşleştirici kalıpları
matcher alanı, hook'ların ne zaman tetikleneceğini filtreleyen bir regex dizesidir. Desteklenen bir
olayın her oluşumuyla eşleşmek için "*", "" kullanın veya matcher değerini tamamen belirtmeyin.
Yalnızca bazı mevcut Codex olayları matcher değerini dikkate alır:
| Olay | matcher neyi filtreler? |
Notlar |
|---|---|---|
PermissionRequest |
araç adı | Destek kapsamına Bash, apply_patch* ve MCP araç adları dahildir |
PostToolUse |
araç adı | Araç kapsamı bölümüne bakın |
PostCompact |
sıkıştırma tetikleyicisi | Değerler manual veya auto şeklindedir |
PreCompact |
sıkıştırma tetikleyicisi | Değerler manual veya auto şeklindedir |
PreToolUse |
araç adı | Araç kapsamı bölümüne bakın |
SessionEnd |
bitiş nedeni | Şu anda yalnızca other |
SessionStart |
başlangıç kaynağı | Değerler startup, resume, clear ve compact şeklindedir |
SubagentStart |
alt ajan türü | Değerler, başlayan alt ajana bağlıdır |
SubagentStop |
alt ajan türü | Değerler, duran alt ajana bağlıdır |
UserPromptSubmit |
desteklenmez | Yapılandırılmış tüm matcher değerleri bu olay için yok sayılır |
Stop |
desteklenmez | Yapılandırılmış tüm matcher değerleri bu olay için yok sayılır |
Interrupt |
desteklenmez | Yapılandırılmış tüm matcher değerleri bu olay için yok sayılır |
*apply_patch için matcher değerleri Edit veya Write da kullanabilir.
Örnekler:
Bash^apply_patch$Edit|Writemcp__filesystem__read_filemcp__filesystem__.*startup|resume|clear|compactmanual|auto
Araç kapsamı
PreToolUse ve PostToolUse yalnızca kabuk ve MCP çağrılarını değil, daha fazlasını gözlemleyebilir. Çoğu
yerel işlev aracı aynı hook yolunu kullanır; böylece araç adlarıyla eşleştirme yapabilir,
JSON argümanlarını inceleyebilir ve PreToolUse için çağrıyı engelleyebilir veya yeniden yazabilirsiniz.
| Araç yolu | PreToolUse |
PostToolUse |
Notlar |
|---|---|---|---|
| Kabuk komutları | Evet | Evet | Bash olarak eşleştirin. |
Birleşik exec (exec_command) |
Evet | Evet | Bash olarak eşleştirin. Daha sonraki bir write_stdin yoklaması, komut tamamlandığında özgün komutun PostToolUse değerini iletebilir. |
apply_patch |
Evet | Evet | apply_patch, Edit veya Write olarak eşleştirin. |
| MCP araçları | Evet | Evet | mcp__filesystem__read_file gibi MCP araç adıyla eşleştirin. |
| Diğer yerel işlev araçları | Evet | Evet | update_plan gibi işlev aracı adıyla eşleştirin. spawn_agent, Agent ile de eşleşir. |
WebSearch gibi barındırılan araçlar |
Hayır | Hayır | Bunlar yerel işlev aracı hook yolunu kullanmaz. |
write_stdin, mevcut bir birleşik exec oturumunun aktarım mekanizmasıdır. Girdi gönderirken veya
PreToolUse aşamasından zaten geçmiş bir komutu yoklarken PreToolUse işlemini yeniden çalıştırmaz.
Bazı özel araç yolları varsayılan hook yolunun dışında kalmayı seçebilir. Araç hook'larını eksiksiz bir yaptırım sınırı olarak değil, yararlı bir koruma önlemi olarak değerlendirin.
Ortak girdi alanları
Her komut hook'u stdin üzerinden tek bir JSON nesnesi alır.
Genellikle kullanacağınız ortak alanlar şunlardır:
| Alan | Tür | Anlamı |
|---|---|---|
session_id |
string |
Geçerli Codex oturum kimliği. Alt ajan hook'ları üst oturum kimliğini kullanır. |
transcript_path |
string | null |
Varsa oturum dökümü dosyasının yolu |
cwd |
string |
Oturumun çalışma dizini |
hook_event_name |
string |
Geçerli hook olayının adı |
model |
string |
Codex'e özgü uzantı. Etkin model tanımlayıcısı |
Tur kapsamındaki hook'lar, olaya özgü tablolarında turn_id değerini Codex'e özgü bir uzantı olarak
listeler.
SessionStart, PreToolUse, PermissionRequest, PostToolUse,
UserPromptSubmit, SubagentStart, SubagentStop, Stop ve Interrupt ayrıca
geçerli izin modunu default, acceptEdits, plan,
dontAsk veya bypassPermissions olarak açıklayan permission_mode değerini içerir.
transcript_path kolaylık sağlamak amacıyla bir sohbet dökümünü gösterir, ancak
döküm biçimi hook'lar için kararlı bir arayüz değildir ve zaman içinde değişebilir.
Tam aktarım biçimine ihtiyacınız varsa Şemalar bölümüne bakın.
Ortak çıktı alanları
SessionStart, PreCompact, PostCompact, UserPromptSubmit,
SubagentStop ve Stop şu ortak JSON alanlarını destekler. SubagentStart,
systemMessage ve hook'a özgü bağlam için aynı biçimi kabul eder; ancak
continue: false alt ajanı durdurmaz:
{
"continue": true,
"stopReason": "optional",
"systemMessage": "optional",
"suppressOutput": false
}| Alan | Etki |
|---|---|
continue |
false ise bu hook çalıştırmasını durduruldu olarak işaretler |
stopReason |
Durdurma nedeni olarak kaydedilir |
systemMessage |
UI veya olay akışında uyarı olarak gösterilir |
suppressOutput |
Şu anda ayrıştırılır ancak henüz uygulanmamıştır |
Çıktı olmadan 0 ile çıkılması başarılı kabul edilir ve Codex devam eder.
PreToolUse ve PermissionRequest, systemMessage değerini destekler; ancak continue,
stopReason ve suppressOutput şu anda bu olaylar için desteklenmez.
Bir PreToolUse hook'u bu desteklenmeyen alanlardan birini döndürürse Codex, söz konusu
hook çalıştırmasını başarısız olarak işaretler, hatayı bildirir ve araç çağrısını sürdürür.
PostToolUse; systemMessage, continue: false ve stopReason değerlerini destekler.
suppressOutput ayrıştırılır ancak şu anda bu olay için desteklenmez.
Büyük hook çıktısı
Codex varsayılan olarak modelin görebildiği her hook çıktı mesajını yaklaşık
2.500 token ile sınırlar. Bir hook daha fazlasını döndürürse Codex tam metni
<temp_dir>/hook_outputs/<session_id>/<uuid>.txt altına kaydeder ve modele,
kaydedilen dosyanın yoluyla birlikte baş ve son kısımları içeren bir önizleme sunar. Bu davranışa
taşırma denir: Codex, aşırı büyük çıktıyı diskte depolar ve bunun yerine modelin görebildiği
daha kısa bir önizleme koyar. Dosya yazılamazsa model yine de kısaltılmış bir önizleme alır.
additionalContext döndüren herhangi bir komut hook'unda yaklaşık token
eşiğini özelleştirmek için işleyicide additionalContextLimit değerini ayarlayın:
{
"type": "command",
"command": "python3 ~/.codex/hooks/session_start.py",
"additionalContextLimit": 5000
}Varsayılan 2500 token eşiğini kullanmak için additionalContextLimit değerini belirtmeyin. Farklı bir eşik
seçmek için pozitif bir tam sayı, işleyicinin ek bağlamının tamamını doğrudan modele iletmek içinse
0 kullanın. Codex, eşleşen her işleyiciyi bağımsız olarak
değerlendirir. Ek bağlam üretemeyen olaylarda Codex, additionalContextLimit değerini yok sayar ve bir yapılandırma
uyarısı bildirir.
Ayar yalnızca additionalContext için geçerlidir. Araç geri bildirimi ve devam
istemleri varsayılan sınırı korur.
Aşırı büyük çıktılar diske yazılabileceğinden hook çıktısında gizli bilgiler veya başka hassas veriler döndürmekten kaçının.
Hook'ları arka planda çalıştırma
Codex varsayılan olarak, hook'u tetikleyen işleme devam etmeden önce bir komut hook'unun
tamamlanmasını bekler. Codex devam ederken komut hook'unu arka planda çalıştırmak için
async değerini true olarak ayarlayın.
Arka plan hook'unu yapılandırma
hooks.json içindeki bir komut işleyicisine "async": true ekleyin:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 ~/.codex/hooks/post_tool_use.py",
"async": true,
"timeout": 120
}
]
}
]
}
}config.toml içindeki satır içi bir hook için async = true değerini ayarlayın:
[[hooks.PostToolUse]]
matcher = "Bash"
[[hooks.PostToolUse.hooks]]
type = "command"
command = "python3 ~/.codex/hooks/post_tool_use.py"
async = true
timeout = 120Arka plan hook'ları, eşzamanlı komut hook'larıyla aynı girdiyi, eşleştiriciyi, güven incelemesini, zaman aşımını ve
büyük çıktı işleme yöntemini kullanır. Diğer komut hook'larında olduğu gibi
timeout saniye cinsinden ölçülür ve varsayılanı 600 değeridir. Interrupt hook'ları,
arka planda çalıştıklarında da bir saniyelik varsayılan ve üç saniyelik azami süre kullanır.
Arka plan hook'ları nasıl çalışır?
Bir arka plan hook'u tamamlandığında Codex, desteklenen bilgilendirici çıktıyı konuşmadaki bir sonraki güvenli noktada iletir:
- Bir tur etkinse Codex, mevcut model isteğinin ve araç çağrılarının tamamlanmasını bekler; ardından çıktıyı o turdaki bir sonraki model isteğine sunar.
- Etkin bir tur yoksa Codex bir sonraki kullanıcı turunu bekler. Bir arka plan hook'unun tamamlanması yeni bir tur başlatmaz.
Eşzamanlı hook ile aynı olaya özgü JSON çıktısını kullanın. Codex, modelin bağlamına
additionalContext ekler ve systemMessage değerini uyarı olarak gösterir.
Sınırlamalar
- Codex, oturum başına en fazla sekiz arka plan hook'unu eşzamanlı çalıştırır. Ek hook'lar, çalışmakta olan bir hook tamamlanana kadar bekler.
- Eşleşen her çağrı bağımsız olarak çalışır ve arka plan hook'ları başladıklarından farklı bir sırada tamamlanabilir.
- Oturum sona erdiğinde Codex tamamlanmamış arka plan hook'larını iptal eder ve henüz iletilmemiş çıktıyı atar.
SessionEndhook'ları her zaman eşzamanlı çalışır.
Hook'lar
SessionStart
Bu olay için matcher, source değerine uygulanır.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
source |
string |
Oturumun nasıl başladığı: startup, resume, clear veya compact |
stdout üzerindeki düz metin, ek geliştirici bağlamı olarak eklenir.
stdout üzerindeki JSON, Ortak çıktı alanlarını ve şu
hook'a özgü biçimi destekler:
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "Load the workspace conventions before editing."
}
}Bu additionalContext metni ek geliştirici bağlamı olarak eklenir.
Codex bir kök oturumu sıkıştırdıktan sonra source: "compact" ile eşleşen
SessionStart hook'ları bir sonraki model isteğinden önce çalışır. Bu, bir turun ortasında
otomatik sıkıştırma gerçekleştiğinde de geçerlidir: Codex, hook'un ek bağlamını daha sonraki bir
kullanıcı turunu beklemek yerine doğrudan devam isteğine iletir. Hook continue: false döndürürse Codex,
başka bir model isteği göndermeden turu sonlandırır.
SessionEnd
SessionEnd, bir oturum sona erdiğinde son notları kaydetmek veya dosyaları temizlemek gibi amaçlarla
bir komut çalıştırmanıza olanak tanır. Hâlâ açık bir konuşmayı arşivlediğinizde veya
sildiğinizde, Codex normal biçimde kapandığında ya da bir konuşma 30 dakika boyunca boşta kaldığında
ve hiçbir bağlı istemcide açık olmadığında ana iş parçacığı için çalışır. Alt ajanlar için çalışmaz.
Bir konuşmadan başka bir konuşmaya geçmek veya thread/unsubscribe çağırmak oturumu
hemen sonlandırmaz; dolayısıyla SessionEnd hemen çalışmaz. Hook'unuz çalışırken
oturum dökümünü okumaya devam edebilir.
Bu olay için matcher, reason değerini filtreler. Şimdilik reason her zaman other değeridir.
Her SessionEnd olayında çalıştırmak için matcher değerini belirtmeyebilir veya other kullanabilirsiniz.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
reason |
string |
Oturumun sona erme nedeni: other |
Örneğin bir SessionEnd komutu şunu alır:
{
"session_id": "thr_123",
"transcript_path": "/workspace/.codex/rollout.jsonl",
"cwd": "/workspace",
"hook_event_name": "SessionEnd",
"reason": "other"
}SessionEnd hook'ları, async değeri true olsa bile her zaman eşzamanlı çalışır.
Bunlar danışma amaçlıdır; dolayısıyla çıktıları Codex'i yönlendirmez veya iş parçacığını açık tutmaz. Bir
komut zaman aşımına uğrarsa veya hatayla çıkarsa Codex bunu hook hatası olarak bildirir.
SubagentStart
Bu olay için matcher, agent_type değerine uygulanır.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
agent_id |
string |
Alt ajanın tanımlayıcısı |
agent_type |
string |
Alt ajan türü veya profili |
permission_mode |
string |
Geçerli izin modu |
stdout üzerindeki düz metin, alt ajan için ek geliştirici bağlamı olarak eklenir.
stdout üzerindeki JSON, systemMessage değerini ve şu hook'a özgü biçimi destekler:
{
"hookSpecificOutput": {
"hookEventName": "SubagentStart",
"additionalContext": "Review the repository test conventions first."
}
}Bu additionalContext metni, alt ajan için ek geliştirici bağlamı olarak eklenir.
continue: false uyumluluk amacıyla ayrıştırılır ancak alt ajanın başlamasını engellemez.
PreToolUse
PreToolUse; Bash'i, apply_patch üzerinden gerçekleştirilen dosya düzenlemelerini,
MCP araç çağrılarını ve diğer yerel işlev araçlarını yakalayabilir. Desteklenen yollar ve istisnalar için Araç
kapsamı bölümüne bakın.
matcher, tool_name değerine ve eşleştirici takma adlarına uygulanır. apply_patch üzerinden yapılan dosya düzenlemelerinde
matcher değerleri apply_patch, Edit veya Write kullanabilir; hook girdisi
yine de tool_name: "apply_patch" bildirir.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
tool_name |
string |
Bash, apply_patch veya mcp__fs__read gibi bir MCP adı örneğindeki standart hook araç adı |
tool_use_id |
string |
Bu çağrıya ait araç çağrısı kimliği |
tool_input |
JSON value |
Araca özgü girdi. Bash ve apply_patch, tool_input.command kullanır. MCP ve diğer yerel işlev araçları kendi argümanlarını gönderir. |
stdout üzerindeki düz metin yok sayılır.
stdout üzerindeki JSON, systemMessage kullanabilir. Desteklenen bir araç çağrısını reddetmek için
şu hook'a özgü biçimi döndürün:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Destructive command blocked by hook."
}
}Codex şu eski engelleme biçimini de kabul eder:
{
"decision": "block",
"reason": "Destructive command blocked by hook."
}Ayrıca 2 çıkış kodunu kullanabilir ve engelleme nedenini stderr üzerine yazabilirsiniz.
Engellemeden modelin görebildiği bağlam eklemek için
hookSpecificOutput.additionalContext döndürün:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"additionalContext": "The pending command touches generated files."
}
}Desteklenen bir araç çağrısını engellemeden yeniden yazmak için
updatedInput ile birlikte permissionDecision: "allow" döndürün:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"updatedInput": {
"command": "echo rewritten"
}
}
}Bash komutları ve apply_patch için updatedInput, dize türünde bir
command alanı içermelidir. MCP ve diğer yerel işlev araçlarında updatedInput,
yerine geçen argüman nesnesidir. updatedInput değerini yalnızca
permissionDecision: "allow" ile birlikte döndürün; diğer updatedInput biçimleri hata olarak
bildirilir.
permissionDecision: "ask", eski decision: "approve", continue: false,
stopReason ve suppressOutput ayrıştırılır ancak henüz desteklenmez. Codex,
hook çalıştırmasını başarısız olarak işaretler, hatayı bildirir ve araç çağrısını sürdürür.
PermissionRequest
PermissionRequest, Codex bir kabuk yetki yükseltmesi veya yönetilen ağ onayı gibi bir işlem için
onay istemek üzereyken çalışır. İsteğe izin verebilir, isteği reddedebilir veya karar vermeyerek
normal onay isteminin devam etmesini sağlayabilir. Onay gerektirmeyen komutlar için çalışmaz.
matcher, tool_name değerine ve eşleştirici takma adlarına uygulanır. Geçerli standart
değerler arasında Bash, apply_patch ve mcp__server__tool gibi MCP araç adları bulunur;
apply_patch ayrıca Edit ve Write ile eşleşir.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
tool_name |
string |
Bash, apply_patch veya mcp__fs__read gibi bir MCP adı örneğindeki standart hook araç adı |
tool_input |
JSON value |
Araca özgü girdi. Bash ve apply_patch, tool_input.command kullanırken MCP araçları tüm argümanları gönderir. |
tool_input.description |
string | null |
Codex'te mevcutsa insan tarafından okunabilir onay nedeni |
stdout üzerindeki düz metin yok sayılır.
Bazı araç girdileri insan tarafından okunabilir bir açıklama içerebilir; ancak her araçta
tool_input.description alanının bulunacağına güvenmeyin.
İsteği onaylamak için şunu döndürün:
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "allow"
}
}
}İsteği reddetmek için şunu döndürün:
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "deny",
"message": "Blocked by repository policy."
}
}
}Birden fazla eşleşen hook karar döndürürse herhangi bir deny kararı önceliklidir. Aksi takdirde
bir allow, onay istemini göstermeden isteğin ilerlemesini sağlar. Eşleşen
hiçbir hook karar vermezse Codex normal onay akışını kullanır.
PermissionRequest için updatedInput, updatedPermissions veya interrupt döndürmeyin;
bu alanlar gelecekteki davranışlar için ayrılmıştır ve şu anda güvenli biçimde başarısız olur.
PostToolUse
PostToolUse; Bash, apply_patch, MCP araç çağrıları ve diğer yerel işlev araçları dâhil olmak üzere
desteklenen araçlar çıktı ürettikten sonra çalışır. Bash için sıfır olmayan durum koduyla çıkan komutlardan
sonra da çalışır. Daha önce çalışmış bir aracın yan etkilerini geri alamaz. Desteklenen yollar ve istisnalar için
Araç kapsamı bölümüne bakın.
matcher, tool_name değerine ve eşleştirici takma adlarına uygulanır. apply_patch üzerinden yapılan dosya düzenlemelerinde
matcher değerleri apply_patch, Edit veya Write kullanabilir; hook girdisi
yine de tool_name: "apply_patch" bildirir.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
tool_name |
string |
Bash, apply_patch veya mcp__fs__read gibi bir MCP adı örneğindeki standart hook araç adı |
tool_use_id |
string |
Bu çağrıya ait araç çağrısı kimliği |
tool_input |
JSON value |
Araca özgü girdi. Bash ve apply_patch, tool_input.command kullanır. MCP ve diğer yerel işlev araçları kendi argümanlarını gönderir. |
tool_response |
JSON value |
Araca özgü çıktı. MCP araçları MCP çağrı sonucunu gönderir. Diğer yerel işlev araçları normalde modelin görebildiği çıktıyı gönderir. |
stdout üzerindeki düz metin yok sayılır.
stdout üzerindeki JSON, systemMessage değerini ve şu hook'a özgü biçimi kullanabilir:
{
"decision": "block",
"reason": "The Bash output needs review before continuing.",
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "The command updated generated files."
}
}Bu additionalContext metni ek geliştirici bağlamı olarak eklenir.
Bu olayda decision: "block", tamamlanmış Bash komutunu geri almaz.
Bunun yerine Codex geri bildirimi kaydeder, araç sonucunu bu
geri bildirimle değiştirir ve modeli hook tarafından sağlanan mesajdan devam ettirir.
Ayrıca 2 çıkış kodunu kullanabilir ve geri bildirim nedenini stderr üzerine yazabilirsiniz.
Komut zaten çalıştıktan sonra özgün araç sonucunun normal işlenmesini
durdurmak için continue: false döndürün. Codex, araç sonucunu geri bildiriminiz veya
durdurma metninizle değiştirip buradan devam eder.
updatedMCPToolOutput ve suppressOutput ayrıştırılır ancak henüz desteklenmez.
Codex, hook çalıştırmasını başarısız olarak işaretler, hatayı bildirir ve araç sonucunu
normal şekilde işlemeyi sürdürür.
Kod modundaki araç çağrıları
Bir model kod modunu kullanarak JavaScript'ten araç çağırdığında hook kararları
bu iç içe çağrıya uygulanır. PreToolUse, aracı çalışmadan önce durdurabilir veya girdisini yeniden yazabilir.
Engelleyen bir PostToolUse, aracın yan etkilerini geri alamaz ancak özgün
sonucun çalışan betiğe ulaşmasını engelleyebilir.
| Hook sonucu | Kod modunun gördüğü |
|---|---|
PreToolUse engeller |
Araç çalışmadan önce araç promise'ı reddedilir. |
PreToolUse, updatedInput döndürür |
Araç yeniden yazılan girdiyle çalışır ve promise bu sonuçla çözümlenir. |
PostToolUse, decision: "block" döndürür veya 2 koduyla çıkar |
Araç çalışır, ardından promise hook nedeniyle reddedilir. |
PostToolUse, continue: false döndürür |
Codex modelin görebildiği sonuç için hook geri bildirimini kullanır ancak iç içe araç promise'ını reddetmez. |
PreCompact
PreCompact, Codex sohbeti sıkıştırmadan önce çalışır. matcher,
değerleri manual ve auto olan trigger değerine uygulanır.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
trigger |
string |
Sıkıştırmayı neyin tetiklediği: manual veya auto |
stdout üzerindeki düz metin yok sayılır.
stdout üzerindeki JSON, Ortak çıktı alanlarını destekler. Eşleşen bir
PreCompact hook'u continue: false döndürürse Codex sıkıştırmadan önce durur.
PostCompact
PostCompact, Codex sohbeti sıkıştırdıktan sonra çalışır. matcher,
değerleri manual ve auto olan trigger değerine uygulanır.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
trigger |
string |
Sıkıştırmayı neyin tetiklediği: manual veya auto |
stdout üzerindeki düz metin yok sayılır.
stdout üzerindeki JSON, Ortak çıktı alanlarını destekler. Eşleşen bir
PostCompact hook'u continue: false döndürürse Codex sıkıştırmadan sonra durur.
UserPromptSubmit
matcher şu anda bu olay için kullanılmaz.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex tur kimliği |
prompt |
string |
Gönderilmek üzere olan kullanıcı istemi |
stdout üzerindeki düz metin, ek geliştirici bağlamı olarak eklenir.
stdout üzerindeki JSON, Ortak çıktı alanlarını ve
şu hook'a özgü biçimi destekler:
{
"hookSpecificOutput": {
"hookEventName": "UserPromptSubmit",
"additionalContext": "Ask for a clearer reproduction before editing files."
}
}Bu additionalContext metni ek geliştirici bağlamı olarak eklenir.
İstemi engellemek için şunu döndürün:
{
"decision": "block",
"reason": "Ask for confirmation before doing that."
}Ayrıca 2 çıkış kodunu kullanabilir ve engelleme nedenini stderr üzerine yazabilirsiniz.
SubagentStop
Bu olay için matcher, agent_type değerine uygulanır.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex turunun kimliği |
agent_id |
string |
Alt ajanın tanımlayıcısı |
agent_type |
string |
Alt ajan türü veya profili |
agent_transcript_path |
string | null |
Varsa alt ajan transkript dosyasının yolu |
stop_hook_active |
boolean |
Bu alt ajanın daha önce sürdürülüp sürdürülmediği |
last_assistant_message |
string | null |
Varsa alt ajanın en son asistan mesajı |
SubagentStop, 0 ile çıktığında stdout üzerinde JSON bekler. Düz metin çıktısı
bu olay için geçersizdir.
stdout üzerindeki JSON, Ortak çıktı alanlarını destekler. Codex'ten
alt ajan akışını sürdürmesini istemek için şunu döndürün:
{
"decision": "block",
"reason": "Run one more focused pass inside the subagent."
}Ayrıca 2 çıkış kodunu kullanabilir ve sürdürme nedenini stderr üzerine yazabilirsiniz.
Eşleşen herhangi bir SubagentStop kancası continue: false döndürürse bu, eşleşen diğer SubagentStop
kancalarının sürdürme kararlarından öncelikli olur.
Durdurma
matcher şu anda bu olay için kullanılmaz.
Ortak girdi alanlarına ek alanlar:
| Alan | Tür | Anlamı |
|---|---|---|
turn_id |
string |
Codex'e özgü uzantı. Etkin Codex turunun kimliği |
stop_hook_active |
boolean |
Bu turun daha önce Stop tarafından sürdürülüp sürdürülmediği |
last_assistant_message |
string | null |
Varsa en son asistan mesajının metni |
Stop, 0 ile çıktığında stdout üzerinde JSON bekler. Düz metin çıktısı bu
olay için geçersizdir.
stdout üzerindeki JSON, Ortak çıktı alanlarını destekler. Codex'in
çalışmayı sürdürmesi için şunu döndürün:
{
"decision": "block",
"reason": "Run one more pass over the failing tests."
}Ayrıca 2 çıkış kodunu kullanabilir ve sürdürme nedenini stderr üzerine yazabilirsiniz.
Bu olayda decision: "block" turu reddetmez. Bunun yerine Codex'e
çalışmayı sürdürmesini bildirir ve reason değerinizi istem metni olarak kullanan,
yeni bir kullanıcı istemi işlevi gören yeni bir sürdürme istemini otomatik olarak oluşturur.
Eşleşen herhangi bir Stop kancası continue: false döndürürse bu, eşleşen diğer Stop kancalarının
sürdürme kararlarından öncelikli olur.
Kesintiye uğratma
Interrupt, ana iş parçacığındaki etkin bir turu kesintiye uğrattığınızda çalışır. Bunu
kesintiyi kaydetmek veya bir kancanın başlattığı çalışmayı temizlemek için kullanın. Boştaki
iş parçacıkları ya da alt ajanlar için çalışmaz ve yapılandırılmış matcher yok sayılır.
Ortak girdi alanlarına ek olarak olay,
kesintiye uğratılan turun kimliği olan turn_id ile permission_mode alanlarını içerir.
Komut kancalarının varsayılan zaman aşımı bir saniyedir. Yapılandırılan zaman aşımları
bir ile üç saniye arasında sınırlandırılır. Kanca çıktısı kesintiyi engelleyemez
veya turu yeniden başlatamaz. Çıktı vermeden 0 ile çıkın ya da bir uyarı göstermek
için isteğe bağlı bir systemMessage içeren JSON döndürün. Düz metin çıktısı bu olay için geçersizdir.
{ "systemMessage": "Saved the interrupted turn to the local audit log." }Şemalar
Geçerli kablo biçiminin tam hâline ihtiyacınız varsa Codex GitHub deposundaki oluşturulmuş şemalara bakın.
Düz metin diğer adları
- string | null