Skip to main content

Fehlerbehandlungs-Hook

Verwenden Sie den onErrorOccurred Hook, um benutzerdefinierte Fehlerprotokollierung zu implementieren, Fehlermuster nachzuverfolgen und benutzerfreundliche Fehlermeldungen bereitzustellen Copilot SDK.

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 onErrorOccurred Hook wird aufgerufen, wenn Während der Sitzungsausführung Fehler auftreten. Verwenden Sie es zu folgenden Zwecken:

  • Implementieren der benutzerdefinierten Fehlerprotokollierung
  • Nachverfolgen von Fehlermustern
  • Bereitstellen von benutzerfreundlichen Fehlermeldungen
  • Auslösen von Warnungen für kritische Fehler

Hook-Signatur

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

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

Eingabe

FeldTypBeschreibung
timestampZahlUnix-Zeitstempel, wenn der Fehler aufgetreten ist
cwdSchnurAktuelles Arbeitsverzeichnis
errorSchnurFehlermeldung
errorContextSchnurWo der Fehler aufgetreten ist: "model_call", , "tool_execution", , "system"oder "user_input"
recoverablebooleanGibt an, ob der Fehler möglicherweise wiederhergestellt werden kann.

Output

Geben Sie null oder undefined zurück, um die standardmäßige Fehlerbehandlung zu verwenden. Geben Sie andernfalls ein Objekt mit einem der folgenden Felder zurück.

FeldTypBeschreibung
suppressOutputbooleanWenn "true" ist, wird die Fehlerausgabe für den Benutzer nicht angezeigt.
errorHandlingSchnurBehandeln von: "retry", "skip", oder "abort"
retryCountZahlAnzahl der Wiederholungsversuche (wenn errorHandling``"retry" ist)
userNotificationSchnurBenutzerdefinierte Nachricht für den Benutzer anzeigen

Beispiele

Grundlegende Fehlerprotokollierung

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (
      input, invocation
    ) => {
      console.error(
        `[${invocation.sessionId}] `
        + `Error: ${input.error}`
      );
      console.error(
        `  Context: ${input.errorContext}`
      );
      console.error(
        `  Recoverable: ${input.recoverable}`
      );
      return null;
    },
  },
});

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

Fehler an den Überwachungsdienst senden

import { captureException } from "@sentry/node"; // or your monitoring service

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (input, invocation) => {
      captureException(new Error(input.error), {
        tags: {
          sessionId: invocation.sessionId,
          errorContext: input.errorContext,
        },
        extra: {
          error: input.error,
          recoverable: input.recoverable,
          cwd: input.cwd,
        },
      });
      
      return null;
    },
  },
});

Benutzerfreundliche Fehlermeldungen

const ERROR_MESSAGES: Record<string, string> = {
  "model_call":
    "There was an issue communicating "
    + "with the AI model. Please try again.",
  "tool_execution":
    "A tool failed to execute. "
    + "Please check your inputs and try again.",
  "system":
    "A system error occurred. "
    + "Please try again later.",
  "user_input":
    "There was an issue with your input. "
    + "Please check and try again.",
};

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (input) => {
      const friendlyMessage =
        ERROR_MESSAGES[input.errorContext];

      if (friendlyMessage) {
        return {
          userNotification: friendlyMessage,
        };
      }

      return null;
    },
  },
});

Unterdrücken nicht kritischer Fehler

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (input) => {
      // Suppress tool execution errors
      // that are recoverable
      if (
        input.errorContext === "tool_execution"
        && input.recoverable
      ) {
        console.log(
          `Suppressed recoverable error: `
          + `${input.error}`
        );
        return { suppressOutput: true };
      }
      return null;
    },
  },
});

Hinzufügen des Wiederherstellungskontexts

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (input) => {
      if (
        input.errorContext === "tool_execution"
      ) {
        return {
          userNotification:
            "The tool failed. Here are some "
            + "recovery suggestions:\n"
            + "- Check if required dependencies "
            + "are installed\n"
            + "- Verify file paths are correct\n"
            + "- Try a simpler approach",
        };
      }

      if (
        input.errorContext === "model_call"
        && input.error.includes("rate")
      ) {
        return {
          errorHandling: "retry",
          retryCount: 3,
          userNotification:
            "Rate limit hit. Retrying...",
        };
      }

      return null;
    },
  },
});

Nachverfolgen von Fehlermustern

interface ErrorStats {
  count: number;
  lastOccurred: number;
  contexts: string[];
}

const errorStats =
  new Map<string, ErrorStats>();

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (
      input, invocation
    ) => {
      const key =
        `${input.errorContext}:`
        + `${input.error.substring(0, 50)}`;

      const existing =
        errorStats.get(key) || {
          count: 0,
          lastOccurred: 0,
          contexts: [],
        };

      existing.count++;
      existing.lastOccurred = input.timestamp;
      existing.contexts.push(
        invocation.sessionId
      );

      errorStats.set(key, existing);

      // Alert if error is recurring
      if (existing.count >= 5) {
        console.warn(
          `Recurring error detected: `
          + `${key} (${existing.count} times)`
        );
      }

      return null;
    },
  },
});

Warnung bei kritischen Fehlern

const CRITICAL_CONTEXTS = [
  "system", "model_call",
];

const session = await client.createSession({
  hooks: {
    onErrorOccurred: async (
      input, invocation
    ) => {
      if (
        CRITICAL_CONTEXTS.includes(
          input.errorContext
        )
        && !input.recoverable
      ) {
        await sendAlert({
          level: "critical",
          message:
            `Critical error in session `
            + `${invocation.sessionId}`,
          error: input.error,
          context: input.errorContext,
          timestamp: new Date(
            input.timestamp
          ).toISOString(),
        });
      }

      return null;
    },
  },
});

Bewährte Methoden

  •         **Protokollieren Sie immer Fehler.** Auch wenn Sie sie von Benutzern unterdrücken, behalten Sie Protokolle für das Debuggen bei.
    
  •         **Kategorisieren sie Fehler.** Verwenden Sie `errorContext`, um unterschiedliche Fehler angemessen zu behandeln.
    
  •         **Schlucken Sie keine kritischen Fehler.** Nur Fehler unterdrücken, von denen Sie sicher sind, dass sie nicht kritisch sind.
    
  •         **Halten Sie Haken fest.** Fehlerbehandlung sollte die Wiederherstellung nicht verlangsamen.
    
  •         **Überwachen von Fehlermustern.** Verfolgen Sie wiederkehrende Fehler, um systemische Probleme zu identifizieren.
    

Weiterführende Lektüre

  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/quickstart)
    
  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/session-lifecycle)
    
  •         [AUTOTITLE](/copilot/how-tos/copilot-sdk/use-hooks/pre-tool-use)