钩子挂钩允许您在 Antigravity 执行循环期间的特定点运行自定义脚本或 shell 命令。这对于执行自定义规则、运行 linter 或自动捕获诊断信息非常有用。

配置挂钩在位于自定义目录中的 hooks.json 文件中进行配置(例如,工作区中的 .agents/~/.gemini/config/ )。

架构和文件格式

hooks.json 文件将挂钩名称映射到其事件配置。

{
  "my-linter-hook": {
    "PostToolUse": [
      {
        "matcher": "run_command",
        "hooks": [
          {
            "type": "command",
            "command": "./scripts/lint.sh",
            "timeout": 10
          }
        ]
      }
    ]
  },
  "safety-gate": {
    "enabled": false,
    "PreToolUse": [
      {
        "matcher": "run_command",
        "hooks": [
          {
            "command": "./scripts/safety-check.sh"
          }
        ]
      }
    ]
  },
  "reminder": {
    "PreInvocation": [
      {
        "type": "command",
        "command": "./scripts/reminder.sh"
      }
    ]
  }
}

钩子定义字段

领域 类型 描述
enabled 布尔 选修的。设置为 false 以禁用挂钩而不删除它。默认为 true
PreToolUse 数组 在执行工具之前运行的处理程序。
PostToolUse 数组 工具完成后运行的处理程序。
PreInvocation 数组 在 Antigravity 调用模型之前运行的处理程序。
PostInvocation 数组 工具调用完成后运行的处理程序。
Stop 数组 当执行循环终止时运行的处理程序。

支持的活动

活动 描述 匹配器目标
PreToolUse 在执行工具之前触发。 工具名称(例如 run_command
PostToolUse 工具完成后触发。 工具名称
PreInvocation 在调用模型之前触发。 N/A(忽略匹配器)
PostInvocation 工具调用完成后触发。 N/A(忽略匹配器)
Stop 执行终止时触发。 N/A(忽略匹配器)

匹配器对于 PreToolUsePostToolUse ,您可以在 matcher 字段中使用正则表达式来指定哪些工具触发挂钩:

  • """*" :匹配所有工具。
  • "run_command" :完全匹配 run_command
  • "run_command|view_file" :匹配任一工具。
  • "browser_.*" :匹配以 browser_ 开头的任何工具。

<公告> 图标:信息 iconColor: var(--主题-primary) 颜色:var(--主题-表面-表面-容器) 文本: 注意:对于 PreInvocationPostInvocationStop ,结构更简单(直接位于事件键下的处理程序列表)并且匹配器被忽略。 </公告>

支持的工具对于 PreToolUsePostToolUse 匹配器,您可以匹配以下工具名称(按类别分组):

文件和目录操作

  • ** view_file **:查看文件的内容。
  • 参数: AbsolutePathStartLine (可选)、 EndLine (可选)、 IsSkillFile (可选)
  • ** write_to_file **:创建新文件。
  • 参数: TargetFileOverwriteCodeContentDescriptionIsArtifact (可选)、 ArtifactMetadata (可选)
  • ** replace_file_content **:编辑文件中的单个连续文本块。
  • 参数: TargetFileInstructionDescriptionAllowMultipleTargetContentReplacementContentStartLineEndLineTargetLintErrorIds (可选)
  • ** multi_replace_file_content **:对同一文件进行多次、不连续的编辑。
  • 参数: TargetFileInstructionDescriptionReplacementChunks (块数组)、 TargetLintErrorIds (可选)、 ArtifactMetadata (可选)
  • ** list_dir **:列出目录的内容。
  • 参数: DirectoryPath
  • ** find_by_name **:使用 glob 模式搜索文件和目录。
  • 参数: SearchDirectoryPatternType (可选)、 Excludes (可选)、 Extensions (可选)、 FullPath (可选)、 MaxDepth (可选)

搜索与研究

  • ** grep_search **:在特定路径内快速文本搜索。
  • 参数: SearchPathQueryIsRegex (可选)、 CaseInsensitive (可选)、 Includes (可选)、 MatchPerLine (可选)
  • ** search_web **:执行一般网络搜索。
  • 参数: querydomain (可选)
  • ** read_url_content **:获取公共 URL 的文本内容。
  • 参数: Url

系统与执行

  • ** run_command **:建议运行 bash 命令。
  • 参数: CommandLineCwdWaitMsBeforeAsyncRunPersistent (可选)、 RequestedTerminalID (可选)
  • ** manage_task **:与后台任务交互。
  • 参数: Action'list''kill''status''send_input' )、 TaskId (可选)、 Input (可选)
  • ** schedule **:设置计时器或重复的 cron 作业。
  • 参数: DurationSeconds (可选)、 CronExpression (可选)、 MaxIterations (可选)、 Prompt
  • ** list_permissions **:查看当前资源访问授权。
  • 参数:无
  • ** ask_permission **:请求额外的范围权限。
  • 参数: ActionTargetReason

代理协作

  • ** invoke_subagent **:生成专门的子代理。
  • 参数: Subagents (包含 PromptRoleTypeNameWorkspace 的规范数组(可选))
  • ** define_subagent **:创建自定义子代理。
  • 参数: namedescriptionsystem_promptenable_mcp_tools (可选)、 enable_write_tools (可选)、 enable_subagent_tools (可选)
  • ** send_message **:与其他代理通信。
  • 参数: RecipientMessage
  • ** manage_subagents **:列出或终止活动子代理。
  • 参数: Action'list''kill''kill_all' )、 ConversationIds (可选)

互动与媒体

  • ** ask_question **:提出多项选择题。
  • 参数: questions (包含 questionoptionsis_multi_select 的问题数组)
  • ** generate_image **:创建或编辑图像。
  • 参数: PromptImageNameImagePaths (可选)

钩子处理程序配置

hooks 数组中的每一项都支持:

领域 类型 描述
type 字符串 选修的。目前仅支持 "command" 。默认为 "command"
command 字符串 必需的。要执行的 shell 命令。
timeout 整数 选修的。超时(以秒为单位)。默认为 30

输入/输出合同挂钩通过 stdin 作为 JSON 接收输入,并应通过 stdout 作为 JSON 返回输出。字段名称使用驼峰命名法。

通用输入字段所有挂钩在 stdin 上的输入负载中接收以下系统元数据字段:

领域 类型 描述
conversationId 字符串 活动代理对话的唯一 UUID。
workspacePaths 字符串数组 代表用户安装的工作空间的绝对目录路径。
transcriptPath 字符串 持久 transcript.jsonl 对话日志的绝对路径。
artifactDirectoryPath 字符串 包含所有对话工件和屏幕截图的目录的绝对路径。

预工具使用在执行工具之前触发。

模式

输入字段(标准输入)

领域 类型 描述
toolCall 对象 建议的工具调用的详细信息。
toolCall.name 字符串 正在执行的工具的名称(例如 run_command )。
toolCall.args 对象 传递给工具的参数。
stepIdx 整数 轨迹中当前步骤的从 0 开始的索引。
(公共字段) 包括 conversationIdworkspacePathstranscriptPathartifactDirectoryPath

输出字段(标准输出)

领域 类型 描述
decision 字符串 必需。 控制工具调用的门控方式:
- "allow" :自动允许工具执行。
- "deny" :立即硬块执行。
- "ask" :提示用户,但遵循“始终允许”设置。
- "force_ask" :始终提示用户,忽略缓存的权限。
reason 字符串 可选。 向代理或用户显示的决策解释。
permissionOverrides 字符串数组 可选。 用于覆盖默认工具权限的资源字符串列表(例如 ["read_file(/path)", "command(args)"] )。

例子

  • 输入(标准输入)
{
  "toolCall": {
    "name": "run_command",
    "args": {
      "CommandLine": "npm test",
      "Cwd": "/workspace/project",
      "WaitMsBeforeAsync": 5000
    }
  },
  "stepIdx": 19,
  "conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
  "workspacePaths": ["/workspace/project"],
  "transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
  "artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
  • 输出(标准输出)
{
  "decision": "ask",
  "reason": "Requires confirmation for test execution.",
  "permissionOverrides": ["command(npm test)"]
}

后期工具使用工具完成后触发。

模式

输入字段(标准输入)

领域 类型 描述
stepIdx 整数 已完成步骤的从 0 开始的索引。
error 字符串 选修的。如果工具调用失败,则详细的运行时错误消息。如果成功则为空。
(公共字段) 包括 conversationIdworkspacePathstranscriptPathartifactDirectoryPath

输出字段(stdout):返回空 JSON 对象 {}

例子

  • 输入(标准输入)
{
  "stepIdx": 5,
  "error": "exit status 1",
  "conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
  "workspacePaths": ["/workspace/project"],
  "transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
  "artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
  • 输出(标准输出){}

预调用在调用模型之前触发。

模式

输入字段(标准输入)

领域 类型 描述
invocationNum 整数 当前模型调用的序列号。
initialNumSteps 整数 轨迹中当前的步数。
(公共字段) 包括 conversationIdworkspacePathstranscriptPathartifactDirectoryPath

输出字段(标准输出)

领域 类型 描述
injectSteps 对象数组 可选。 在调用模型之前注入对话轨迹的步骤列表。

注入的步骤架构injectSteps 数组中的每个对象都可以具有以下字段之一:

  • toolCall (对象):要执行的工具调用。
  • userMessage (字符串):来自用户的消息。
  • ephemeralMessage (字符串):瞬态系统消息。

例子

  • 输入(标准输入)
{
  "invocationNum": 3,
  "initialNumSteps": 10,
  "conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
  "workspacePaths": ["/workspace/project"],
  "transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
  "artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
  • 输出(标准输出)
{
  "injectSteps": [{"ephemeralMessage": "Remember to lint"}]
}

调用后工具调用完成后触发。

模式

输入字段 (stdin):与 PreInvocation 输入字段相同。

输出字段(标准输出)

领域 类型 描述
injectSteps 对象数组 可选。 调用完成后要注入的步骤列表(与 PreInvocation 注入步骤相同的架构)。
terminationBehavior 字符串 可选。 控制注入后的执行流程:
- "force_continue" :强制循环继续。
- "terminate" :强制循环终止。
- "" (或省略):默认行为。

例子

  • 输入(标准输入):与 PreInvocation 相同
  • 输出(标准输出)
{
  "injectSteps": [],
  "terminationBehavior": ""
}

停止当执行循环终止时触发。

模式

输入字段(标准输入)

领域 类型 描述
executionNum 整数 执行尝试的序列号。
terminationReason 字符串 执行停止的原因(例如 "model_stop""max_steps_exceeded""error" )。
error 字符串 选修的。如果终止是由系统错误引起的,则显示错误消息。
fullyIdle 布尔 必需。 true 如果代理完全完成并且所有后台命令或异步任务均已完成。 false 如果活动后台任务仍在运行。
(公共字段) 包括 conversationIdworkspacePathstranscriptPathartifactDirectoryPath

输出字段(标准输出)

领域 类型 描述
decision 字符串 必需。 设置为 "continue" 以防止代理停止并重新进入执行循环。任何其他值都允许停止。
reason 字符串 可选。 如果 decision"continue" ,则此消息将作为系统消息注入到对话中。

例子

  • 输入(标准输入)
{
  "executionNum": 1,
  "terminationReason": "model_stop",
  "error": "",
  "fullyIdle": true,
  "conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
  "workspacePaths": ["/workspace/project"],
  "transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
  "artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
  • 输出(标准输出)
{
  "decision": "continue",
  "reason": "Not done yet"
}