会话钩子
使用hooks 可以在 Copilot 会话的各个生命周期节点插入处理。
你可以在不修改核心实现的前提下,添加工具执行控制、审计日志、prompt 增强、错误处理等。
这与自定义代理定义中的声明式 hooks 以及基于文件的钩子加载是不同的功能。按代理的配置请参考自定义代理。
基于文件的钩子发现
在hookDirectories 中,可以指定用于发现基于文件的钩子的显式根目录。
这仅用于发现,不会授予代理一般性的文件访问权限。
即使 enableConfigDiscovery 或 enableFileHooks 被禁用,显式根目录依然可用。
相对路径会以指定时生效的 workingDirectory 为基准,仅解析一次。
- 省略或
null:不改变其他发现来源 []:仅清除显式指定的 SDK 根目录
enableFileHooks 控制来自仓库的文件钩子(.github/hooks/ 以及受信任仓库设置中的根目录)。
它不会禁用显式的 hookDirectories 或 PHP 回调的 hooks。
钩子流程
基本使用方式
可用的钩子
返回
null 时会继续默认行为。
单独的会话在完成对 prompt 的响应后不会结束。onSessionEnd 不是在每个 prompt 后执行,而是在会话断开连接或被销毁时执行。
阻止 prompt
onUserPromptSubmitted 可以返回 decision: 'block' 来拒绝 prompt。
被拒绝时,不会开始模型轮次,也不会记录用户消息。
如果指定了 reason,其内容会包含在 warningType: "policy_blocked" 的临时 session.warning 事件中。
典型用例
1) Permission control(执行控制)
- 通过
onPreToolUse用 allow-list 方式限制允许的工具 - 破坏性操作用
permissionDecision: 'ask'请求人工确认 - 通过
permissionDecisionReason明确拒绝理由 toolName的候选值请参考 Tools 的列表(例如view、glob、bash)
2) Auditing / compliance(审计)
- 组合生命周期钩子收集审计事件
- 按 session ID 单位持久化收集的数据
3) Prompt enrichment(输入增强)
- 在
onSessionStart中把项目信息(语言、框架、约定)加入additionalContext - 在
onUserPromptSubmitted中展开快捷方式(/fix、/test)
4) Result filtering(结果整形)
- 在
onPostToolUse中对 API key / token / password 等进行脱敏 - 对过长的结果进行摘要,仅在需要时返回详细内容
5) Error recovery(故障恢复)
- 在
onErrorOccurred中仅在model_call且recoverable=true时retry - 无法恢复的错误通过
userNotification向用户简明通知
6) Session metrics(度量)
- 在
onSessionStart中记录开始时间 - 在
onPreToolUse/onUserPromptSubmitted中更新计数器 - 在
onSessionEnd中输出耗时、工具调用次数、结束原因
Hook input / output 类型
共通输入(BaseHookInput)
agentId / agentType / parentAgentId 可在以子代理为参与者的钩子中使用。
根代理的钩子中不包含这些字段。
在旧版运行时中,如果没有相关信息,字段本身会被省略。
因此,它们都有可能为 null。
PreToolUseHookInput
PreToolUseHookOutput
PostToolUseHookInput
PostToolUseHookOutput
UserPromptSubmittedHookInput
UserPromptSubmittedHookOutput
SessionStartHookInput
SessionStartHookOutput
SessionEndHookInput
SessionEndHookOutput
ErrorOccurredHookInput
ErrorOccurredHookOutput
ToolResultObject
工具执行结果的标准对象。最佳实践
- 不要在钩子内直接执行过重的同步处理。如有必要请异步化。
- 不需要修改时返回
null,交给默认行为处理。 - 尽可能显式地设置
permissionDecision。 - 关键错误不要过度抑制,请保留日志 / 通知通道。
- 会话级状态请基于 session id 管理,并在
onSessionEnd时清理。
最新信息请参考 GitHub 仓库。