Skip to main content

Haken zur Verwendung vor Werkzeugen

Verwenden Sie den onPreToolUse Hook, um die Toolausführung zu steuern, Argumente zu ändern und Kontext hinzuzufügen, bevor ein Tool in Copilot SDK ausgeführt wird.

Wer kann dieses Feature verwenden?

GitHub Copilot SDK ist mit allen Copilot Tarifen verfügbar.

Hinweis

Copilot SDK ist zurzeit in Technische Preview. Funktionalität und Verfügbarkeit können geändert werden.

Der onPreToolUse Hook wird aufgerufen , bevor ein Tool ausgeführt wird. Verwenden Sie es zu folgenden Zwecken:

  • Genehmigen oder Verweigern der Toolausführung
  • Ändern von Toolargumenten
  • Hinzufügen von Kontext für das Tool
  • Toolausgabe aus der Unterhaltung unterdrücken

Hook-Signatur

import type { PreToolUseHookInput, HookInvocation, PreToolUseHookOutput } from "@github/copilot-sdk";
type PreToolUseHandler = (
  input: PreToolUseHookInput,
  invocation: HookInvocation
) => Promise<PreToolUseHookOutput | null | undefined>;

Die Hook-Signaturen in Python, Go und .NET finden Sie im github/copilot-sdk Repository.

Eingabe

FeldTypBeschreibung
timestampZahlUnix-Zeitstempel, zu dem der Hook ausgelöst wurde
cwdSchnurAktuelles Arbeitsverzeichnis
toolNameSchnurName des aufgerufenen Tools
toolArgsObjektAn das Tool übergebene Argumente

Output

Geben Sie null oder undefined zurück, um das Tool ohne Änderungen auszuführen. Geben Sie andernfalls ein Objekt mit einem der folgenden Felder zurück.

FeldTypBeschreibung
permissionDecision
          `"allow"`
          \|
          `"deny"`
          \|
          `"ask"`
         | Gibt an, ob der Toolaufruf zugelassen werden soll. |

| permissionDecisionReason | Schnur | Erläuterung, die dem Benutzer angezeigt wird (zur Ablehnung/Frage) | | modifiedArgs | Objekt | Geänderte Argumente, die an das Tool übergeben werden sollen | | additionalContext | Schnur | Zusätzlicher Kontext, der in die Unterhaltung eingefügt wurde | | suppressOutput | boolean | Wenn wahr, wird die Toolausgabe nicht in Unterhaltungen angezeigt. |

Berechtigungsentscheidungen

EntscheidungVerhalten
"allow"Das Tool wird normal ausgeführt
"deny"Tool ist blockiert, Grund, der dem Benutzer angezeigt wird
"ask"Der Benutzer wird aufgefordert, den Zugriff (im interaktiven Modus) zu genehmigen.

Beispiele

Alle Tools zulassen (nur Protokollierung)

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input, invocation) => {
      console.log(
        `[${invocation.sessionId}] `
        + `Calling ${input.toolName}`
      );
      console.log(
        `  Args: ${JSON.stringify(input.toolArgs)}`
      );
      return { permissionDecision: "allow" };
    },
  },
});

Beispiele in Python, Go und .NET finden Sie im github/copilot-sdk Repository.

Blockieren bestimmter Tools

const BLOCKED_TOOLS = [
  "shell", "bash", "write_file", "delete_file",
];

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      if (BLOCKED_TOOLS.includes(input.toolName)) {
        return {
          permissionDecision: "deny",
          permissionDecisionReason:
            `Tool '${input.toolName}' `
            + `is not permitted in this environment`,
        };
      }
      return { permissionDecision: "allow" };
    },
  },
});

Ändern von Toolargumenten

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      // Add a default timeout to all shell commands
      if (
        input.toolName === "shell" && input.toolArgs
      ) {
        const args = input.toolArgs as {
          command: string;
          timeout?: number;
        };
        return {
          permissionDecision: "allow",
          modifiedArgs: {
            ...args,
            timeout: args.timeout ?? 30000,
          },
        };
      }
      return { permissionDecision: "allow" };
    },
  },
});

Einschränken des Dateizugriffs auf bestimmte Verzeichnisse

const ALLOWED_DIRECTORIES = [
  "/home/user/projects", "/tmp",
];

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      if (
        input.toolName === "read_file"
        || input.toolName === "write_file"
      ) {
        const args = input.toolArgs as {
          path: string;
        };
        const isAllowed =
          ALLOWED_DIRECTORIES.some((dir) =>
            args.path.startsWith(dir)
          );

        if (!isAllowed) {
          return {
            permissionDecision: "deny",
            permissionDecisionReason:
              `Access to '${args.path}' `
              + `is not permitted. `
              + `Allowed directories: `
              + ALLOWED_DIRECTORIES.join(", "),
          };
        }
      }
      return { permissionDecision: "allow" };
    },
  },
});

Ausführliche Toolausgabe unterdrücken

const VERBOSE_TOOLS = ["list_directory", "search_files"];

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      return {
        permissionDecision: "allow",
        suppressOutput: VERBOSE_TOOLS.includes(input.toolName),
      };
    },
  },
});

Hinzufügen von Kontext basierend auf dem Tool

const session = await client.createSession({
  hooks: {
    onPreToolUse: async (input) => {
      if (input.toolName === "query_database") {
        return {
          permissionDecision: "allow",
          additionalContext:
            "Remember: This database uses "
            + "PostgreSQL syntax. "
            + "Always use parameterized queries.",
        };
      }
      return { permissionDecision: "allow" };
    },
  },
});

Bewährte Methoden

  •         **Stellen Sie sicher, dass Sie immer eine Entscheidung zurückgeben.** Das Zurückgeben von `null` erlaubt es, das Tool zu verwenden, aber die explizite Angabe von `{ permissionDecision: "allow" }` ist klarer.
    
  •         **Geben Sie hilfreiche Ablehnungsgründe an.** Erläutern Sie beim Verweigern, warum, damit Benutzer verstehen, was passiert ist.
    
  •         **Achten Sie bei der Argumentänderung darauf.** Stellen Sie sicher, dass geänderte Argumente das erwartete Schema für das Tool beibehalten.
    
  •         **Berücksichtigen Sie die Leistung.** Vortool-Hooks werden synchron vor jedem Toolaufruf ausgeführt. Halten Sie sie schnell bereit.
    
  •         **Verwenden Sie `suppressOutput` sorgfältig.** Die Unterdrückung der Ausgabe bedeutet, dass das Modell das Ergebnis nicht sieht, was sich auf die Gesprächsqualität auswirken kann.
    
  •         **Achten Sie auf vertrauliche Daten.** Toolargumente und Ergebnisse können geheime Schlüssel, Dateipfade oder persönlich identifizierbare Informationen enthalten. Vermeiden Sie das Protokollieren oder Verfügbarmachen dieser Daten in Produktionsumgebungen.
    

Weiterführende Lektüre

  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/quickstart)
    
  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/post-tool-use)
    
  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/error-handling)