跳转到主要内容

会话钩子

使用 hooks 可以在 Copilot 会话的各个生命周期节点插入处理。 你可以在不修改核心实现的前提下,添加工具执行控制、审计日志、prompt 增强、错误处理等。 这与自定义代理定义中的声明式 hooks 以及基于文件的钩子加载是不同的功能。按代理的配置请参考自定义代理。

基于文件的钩子发现

在 hookDirectories 中,可以指定用于发现基于文件的钩子的显式根目录。 这仅用于发现,不会授予代理一般性的文件访问权限。 即使 enableConfigDiscovery 或 enableFileHooks 被禁用,显式根目录依然可用。 相对路径会以指定时生效的 workingDirectory 为基准,仅解析一次。
  • 省略或 null:不改变其他发现来源
  • []:仅清除显式指定的 SDK 根目录
钩子来源的禁用设置和 Managed Settings 仍然适用。 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

工具执行结果的标准对象。

最佳实践

  1. 不要在钩子内直接执行过重的同步处理。如有必要请异步化。
  2. 不需要修改时返回 null,交给默认行为处理。
  3. 尽可能显式地设置 permissionDecision。
  4. 关键错误不要过度抑制,请保留日志 / 通知通道。
  5. 会话级状态请基于 session id 管理,并在 onSessionEnd 时清理。
最新信息请参考 GitHub 仓库。
最后修改于 2026年10月26日