Lección 5 de 7 · intermedio · 12 min
Hooks: audita y bloquea lo que hace el agente
Usa PreToolUse y PostToolUse para registrar cada acción y denegar escrituras cuando el agente solo debe revisar código.
Revisión de un addon sin riesgo de cambios
Un caso típico: quieres que el agente revise un addon de Odoo (permisos, record rules, uso de sudo(), SQL crudo) y que no pueda modificar nada.
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, HookMatcher
async def deny_writes(input_data, tool_use_id, context):
return {"hookSpecificOutput": {
"hookEventName": input_data["hook_event_name"],
"permissionDecision": "deny",
"permissionDecisionReason": "Revisión de solo lectura",
}}
async def audit(input_data, tool_use_id, context):
print("AUDIT", input_data["tool_name"], tool_use_id)
return {}
opts = ClaudeAgentOptions(
cwd="./addons/mi_modulo",
permission_mode="plan",
allowed_tools=["Read", "Glob", "Grep"],
hooks={
"PreToolUse": [HookMatcher(matcher="Write|Edit|Bash", hooks=[deny_writes])],
"PostToolUse": [HookMatcher(hooks=[audit])],
},
)
async def review():
async with ClaudeSDKClient(options=opts) as client:
await client.query("Revisa el addon: ACL, record rules, sudo() y SQL crudo. Lista hallazgos por severidad.")
async for msg in client.receive_response():
print(msg)
Eventos disponibles en Python
PreToolUse, PostToolUse, PostToolUseFailure, UserPromptSubmit, Stop, SubagentStart, SubagentStop, PreCompact, Notification y PermissionRequest. Según la documentación de hooks, SessionStart y SessionEnd no están disponibles como callbacks en Python.
← Anterior
Controla el loop: turnos, presupuesto, effort y permisos
Siguiente →
Caso práctico: un agente que genera y testea un módulo Odoo
Practica con 5 casos reales
Descarga la guía gratuita con agentes Python para Odoo, de Junior a Senior.
Quiero la guía →