跳至主要内容

关于钩子

通过在代理执行的关键时刻运行自定义 Shell 命令,扩展和定制 GitHub Copilot 代理的行为。

谁可以使用此功能?

Copilot 云代理在 GitHub Copilot Pro、GitHub Copilot Pro+、GitHub Copilot Business 和 GitHub Copilot Enterprise 计划中可用。该代理在 GitHub 上存储的所有仓库中均可用,受管用户账户拥有的仓库以及已明确禁用的仓库除外。
注册 Copilot

关于钩子

钩子使您能够在代理工作流的关键点(例如代理会话开始或结束时,或在输入提示前后以及调用工具时)执行自定义 shell 命令。

钩子通过 JSON 输入接收有关代理操作的详细信息,从而实现上下文感知的自动化。例如,您可以使用钩子来

  • 以编程方式批准或拒绝工具执行。
  • 利用内置安全功能,如机密扫描,防止凭证泄露。
  • 实现自定义验证规则和审计日志以满足合规要求。

Copilot 代理支持存放在仓库 .github/hooks/*.json 下的 JSON 文件中的钩子。

钩子可用于以下场景

  • GitHub 上的 Copilot 云代理
  • 终端中的 GitHub Copilot CLI

钩子类型

以下类型的钩子可用

  • sessionStart:在新的代理会话开始或恢复现有会话时执行。可用于初始化环境、记录会话开始以便审计、验证项目状态以及设置临时资源。
  • sessionEnd:在代理会话完成或被终止时执行。可用于清理临时资源、生成并归档会话报告和日志,或发送会话完成通知。
  • userPromptSubmitted:在用户向代理提交提示时执行。可用于记录用户请求以便审计和使用分析。
  • preToolUse:在代理使用任何工具(例如 basheditview)之前执行。这是最强大的钩子,因为它可以批准或拒绝工具执行。使用此钩子可以阻止危险命令、强制安全策略和编码规范、对敏感操作要求审批,或记录工具使用情况以满足合规。
  • postToolUse:在工具执行完毕(无论成功还是失败)后执行。可用于记录执行结果、跟踪使用统计、生成审计轨迹、监控性能指标以及发送失败警报。
  • agentStop:在主代理完成对您的提示的响应时执行。
  • subagentStop:在子代理完成并将结果返回给父代理之前执行。
  • errorOccurred:在代理执行期间发生错误时执行。可用于记录错误以便调试、发送通知、跟踪错误模式并生成报告。

要查看包含示例用例、最佳实践和高级模式的完整钩子类型参考,请参阅 钩子配置

钩子配置格式

您使用一种特殊的 JSON 格式来配置钩子。JSON 必须包含一个值为 1version 字段,以及一个包含钩子定义数组的 hooks 对象。

JSON
{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "command",
        "bash": "string (optional)",
        "powershell": "string (optional)",
        "cwd": "string (optional)",
        "env": { "KEY": "value" },
        "timeoutSec": 30
      }
    ],
  }
}

钩子对象可以包含以下键

属性是否必填描述
type必须为 "command"
bash是(在 Unix 系统上)要执行的 bash 脚本路径
powershell是(在 Windows 上)要执行的 PowerShell 脚本路径
cwd脚本的工作目录(相对于仓库根目录)
env与现有环境合并的附加环境变量
timeoutSec最大执行时间(秒),默认:30

示例钩子配置文件

这是一个示例配置文件,位于仓库中的 ~/.github/hooks/project-hooks.json

JSON
{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "command",
        "bash": "echo \"Session started: $(date)\" >> logs/session.log",
        "powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"",
        "cwd": ".",
        "timeoutSec": 10
      }
    ],
    "userPromptSubmitted": [
      {
        "type": "command",
        "bash": "./scripts/log-prompt.sh",
        "powershell": "./scripts/log-prompt.ps1",
        "cwd": "scripts",
        "env": {
          "LOG_LEVEL": "INFO"
        }
      }
    ],
    "preToolUse": [
      {
        "type": "command",
        "bash": "./scripts/security-check.sh",
        "powershell": "./scripts/security-check.ps1",
        "cwd": "scripts",
        "timeoutSec": 15
      },
      {
        "type": "command",
        "bash": "./scripts/log-tool-use.sh",
        "powershell": "./scripts/log-tool-use.ps1",
        "cwd": "scripts"
      }
    ],
    "postToolUse": [
      {
        "type": "command",
        "bash": "cat >> logs/tool-results.jsonl",
        "powershell": "$input | Add-Content -Path logs/tool-results.jsonl"
      }
    ],
    "sessionEnd": [
      {
        "type": "command",
        "bash": "./scripts/cleanup.sh",
        "powershell": "./scripts/cleanup.ps1",
        "cwd": "scripts",
        "timeoutSec": 60
      }
    ]
  }
}

性能考虑因素

钩子同步运行并阻塞代理执行。为确保体验响应迅速,请注意以下事项

  • 最小化执行时间:尽可能将钩子执行时间控制在 5 秒以内。
  • 优化日志记录:使用异步日志(如追加写入文件),而非同步 I/O。
  • 使用后台处理:对于昂贵的操作,考虑使用后台处理。
  • 缓存结果:在可能的情况下缓存耗时计算。

安全考虑因素

为确保在使用钩子时保持安全,请注意以下事项

  • 始终验证并清理钩子处理的输入。不受信任的输入可能导致意外行为。
  • 在构造命令时使用正确的 shell 转义。这可防止命令注入漏洞。
  • 永不记录敏感数据,例如令牌或密码.
  • 确保钩子脚本和日志具有适当的权限.
  • 对发起外部网络调用的钩子保持谨慎。这些调用可能引入延迟、失败或将数据暴露给第三方。
  • 设置适当的超时以防止资源耗尽。长时间运行的钩子会阻塞代理执行并降低性能。

后续步骤

要开始创建钩子,请参阅 在 GitHub Copilot 代理中使用钩子

© . This site is unofficial and not affiliated with GitHub, Inc.