Skip to main content

会话挂钩

钩子允许你在对话生命周期的关键节点拦截并自定义 Copilot 会话的行为。 使用挂钩可以:

  • 控制工具执行 - 批准、拒绝或修改工具调用
  • 转换结果 - 在处理结果之前修改工具输出
  • 添加上下文 - 在会话开始时注入其他信息
  • 处理错误 - 实现自定义错误处理
  • 审核和记录 - 跟踪符合性的所有交互

可用挂钩

挂钩Trigger用例
工具使用前挂钩在工具执行之前权限控制,参数验证
工具使用后挂钩工具执行后(仅在成功时)结果转换,日志记录
工具使用后挂钩在工具执行结果为失败之后添加重试指引,记录失败日志
用户提示提交挂钩当用户发送消息时提示修改、筛选
会话生命周期挂钩会话开始添加上下文,配置会话
会话生命周期挂钩会话结束清理、分析
错误处理挂钩发生错误自定义错误处理

快速入门

代码语言 navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      console.log(`Tool called: ${input.toolName}`);
      // Allow all tools
      return { permissionDecision: "allow" };
    },
    onPostToolUse: async (input) => {
      console.log(`Tool result: ${JSON.stringify(input.toolResult)}`);
      return null; // No modifications
    },
    onSessionStart: async (input) => {
      return { additionalContext: "User prefers concise answers." };
    },
  },
});

挂钩调用上下文

每个挂钩接收一个 invocation 参数,其中包含有关当前会话的上下文:

领域类型说明
sessionId字符串当前会话的 ID

这允许钩子维护状态或执行会话特定的逻辑。

常见模式

记录所有工具调用

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      console.log(`[${new Date().toISOString()}] Tool: ${input.toolName}, Args: ${JSON.stringify(input.toolArgs)}`);
      return { permissionDecision: "allow" };
    },
    onPostToolUse: async (input) => {
      console.log(`[${new Date().toISOString()}] Result: ${JSON.stringify(input.toolResult)}`);
      return null;
    },
  },
});

阻止危险工具

const BLOCKED_TOOLS = ["shell", "bash", "exec"];

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      if (BLOCKED_TOOLS.includes(input.toolName)) {
        return {
          permissionDecision: "deny",
          permissionDecisionReason: "Shell access is not permitted",
        };
      }
      return { permissionDecision: "allow" };
    },
  },
});

添加用户上下文

const session = await client.createSession({
  hooks: {
    onSessionStart: async () => {
      const userPrefs = await loadUserPreferences();
      return {
        additionalContext: `User preferences: ${JSON.stringify(userPrefs)}`,
      };
    },
  },
});

挂钩指南

另见