跳转到内容

Hooks(钩子)

Hooks 让你能够在智能体(Agent)会话(Agent Session)的关键生命周期节点执行自定义 Shell 命令。使用 Hooks 来自动化工作流、强制执行安全策略、验证操作以及与外部工具集成。

注意 智能体(Agent) Hooks 目前处于预览阶段。配置格式和行为可能在未来版本中更改。

提示 使用智能体(Agent)自定义编辑器(预览版)在一个地方发现、创建和管理所有智能体(Agent)自定义内容。通过命令面板运行 Chat: Open Customizations 命令。

Hooks 设计用于跨智能体(Agent)类型工作,包括本地智能体(Local Agent)、后台智能体(Agent)和云端智能体(Cloud Agent)。每个 Hook 接收结构化的 JSON 输入,并可以返回 JSON 输出来影响智能体(Agent)行为。

Hooks 提供确定性的、代码驱动的自动化。与指导智能体(Agent)行为的说明或自定义提示词(Prompt)不同,Hooks 在特定生命周期节点以有保证的结果执行你的代码:

  • 强制执行安全策略:在命令执行之前阻止危险命令(如 rm -rfDROP TABLE),无论智能体(Agent)如何被提示。
  • 自动化代码质量:在文件修改后自动运行格式化程序、Linter 或测试。
  • 创建审计跟踪:记录每次工具调用(Tool Call)、命令执行或文件变更,用于合规性和调试。
  • 注入上下文:添加项目特定信息、API 密钥或环境详情,帮助智能体(Agent)做出更好的决策。
  • 控制审批:自动批准安全操作,同时要求对敏感操作进行确认。

以下示例创建一个在每次文件编辑后运行 Prettier 的 Hook。在工作区中创建 .github/hooks/format.json 文件:

{
"hooks": {
"PostToolUse": [
{
"type": "command",
"command": "npx prettier --write \"$TOOL_INPUT_FILE_PATH\""
}
]
}
}

保存此文件后,VS Code 会自动加载该 Hook。下次智能体(Agent)编辑文件时,Prettier 会对修改的文件运行。查看 GitHub Copilot Chat Hooks 输出频道以验证 Hook 已执行。

VS Code 支持八个 Hook 事件,在智能体(Agent)会话(Agent Session)的特定节点触发:

Hook 事件触发时机常见用途
SessionStart用户提交新会话的第一个提示词(Prompt)时初始化资源、记录会话开始、验证项目状态
UserPromptSubmit用户提交提示词(Prompt)时审计用户请求、注入系统上下文
PreToolUse智能体(Agent)调用任何工具之前阻止危险操作、要求审批、修改工具输入
PostToolUse工具成功完成后运行格式化程序、记录结果、触发后续操作
PreCompact在对话上下文压缩之前导出重要上下文、在截断前保存状态
SubagentStart子智能体(Agent)被创建时跟踪嵌套智能体(Agent)使用、初始化子智能体(Agent)资源
SubagentStop子智能体(Agent)完成时聚合结果、清理子智能体(Agent)资源
Stop智能体(Agent)会话(Agent Session)结束时生成报告、清理资源、发送通知

Hooks 在存储于工作区或用户目录中的 JSON 文件中配置。

VS Code 在以下位置搜索 Hook 配置文件:

范围默认文件位置
工作区.github/hooks/*.json
工作区(Claude 格式).claude/settings.json.claude/settings.local.json
用户~/.copilot/hooks~/.claude/settings.json
自定义智能体(Custom Agent).agent.md frontmatter 中的 hooks 字段(参见智能体(Agent)作用域 Hooks

工作区 Hooks 优先于同一事件类型的用户 Hooks。

使用 chat.hookFilesLocations 设置自定义加载哪些 Hook 文件。

可以直接在自定义智能体(Custom Agent)的 YAML frontmatter 中定义 Hooks。智能体(Agent)作用域 Hooks 仅在该自定义智能体(Custom Agent)活跃时运行,与工作区或用户级别为同一事件配置的 Hooks 同时运行。

要启用智能体(Agent)作用域 Hooks,将 chat.useCustomAgentHooks 设置为 true

---
name: "Strict Formatter"
description: "Agent that auto-formats code after every edit"
hooks:
PostToolUse:
- type: command
command: "./scripts/format-changed-files.sh"
---
You are a code editing agent. After making changes, files are automatically formatted.

创建一个 JSON 文件,包含每个事件类型的 Hook 命令数组:

{
"hooks": {
"PreToolUse": [
{
"type": "command",
"command": "./scripts/validate-tool.sh",
"timeout": 15
}
],
"PostToolUse": [
{
"type": "command",
"command": "npx prettier --write \"$TOOL_INPUT_FILE_PATH\""
}
]
}
}
属性类型描述
typestring必须为 "command"
commandstring要运行的默认命令(跨平台)
windowsstringWindows 特定命令覆盖
linuxstringLinux 特定命令覆盖
osxstringmacOS 特定命令覆盖
cwdstring工作目录(相对于仓库根目录)
envobject额外的环境变量
timeoutnumber超时时间(秒)(默认:30)

Hooks 通过 stdin(输入)和 stdout(输出)使用 JSON 与 VS Code 通信。

每个 Hook 通过 stdin 接收包含以下公共字段的 JSON 对象:

{
"timestamp": "2026-02-09T10:30:00.000Z",
"cwd": "/path/to/workspace",
"sessionId": "session-identifier",
"hookEventName": "PreToolUse",
"transcript_path": "/path/to/transcript.json"
}

Hooks 可以通过 stdout 返回 JSON 来影响智能体(Agent)行为:

{
"continue": true,
"stopReason": "Security policy violation",
"systemMessage": "Unit tests failed"
}
字段类型描述
continueboolean设置为 false 停止处理(默认:true
stopReasonstring停止原因,当 continuefalse 时显示给用户
systemMessagestring显示给用户的警告消息

Hook 的退出码决定 VS Code 如何处理结果:

退出码行为
0成功:将 stdout 解析为 JSON
2阻塞错误:停止处理并向模型显示错误
其他非阻塞警告:向用户显示警告,继续处理

PreToolUse Hook 在智能体(Agent)调用工具之前触发,可以通过 hookSpecificOutput 对象控制工具执行:

{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Destructive command blocked by policy",
"updatedInput": { "files": ["src/safe.ts"] },
"additionalContext": "User has read-only access to production files"
}
}

permissionDecision 值:"allow"(自动批准)、"deny"(阻止执行)、"ask"(要求用户确认)。

权限决策优先级:当多个 Hooks 为同一工具调用(Tool Call)运行时,最严格的决策优先:deny > ask > allow

PostToolUse Hook 在工具成功完成后触发,可以向模型提供额外上下文或阻止进一步处理:

{
"decision": "block",
"reason": "Post-processing validation failed",
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "The edited file has lint errors that need to be fixed"
}
}

SessionStart Hook 在新智能体(Agent)会话(Agent Session)开始时触发,可以向智能体(Agent)的对话中注入额外上下文:

{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "Project: my-app v2.1.0 | Branch: main | Node: v20.11.0"
}
}

Stop Hook 在智能体(Agent)会话(Agent Session)结束时触发,可以阻止智能体(Agent)停止:

{
"hookSpecificOutput": {
"hookEventName": "Stop",
"decision": "block",
"reason": "Run the test suite before finishing"
}
}

重要提示Stop Hook 阻止智能体(Agent)停止时,智能体(Agent)会继续运行,额外的轮次会消耗高级请求额度。检查 stop_hook_active 字段(当智能体(Agent)已因之前的 Stop Hook 而继续时为 true),以防止智能体(Agent)无限运行。