Agent-Hooks im Azure SRE Agent

Hooks sind benutzerdefinierte Prüfpunkte, die das Verhalten des Agents in wichtigen Momenten abfangen und steuern. Verwenden Sie Hooks, um Quality-Gates für die Antworten von Agents zu erzwingen, die Verwendung von Tools zu überprüfen und zu steuern, gefährliche Operationen durch die Durchsetzung von Richtlinien zu blockieren und eine vorzeitige Aufgabenerledigung durch die Validierung der Agentenausgaben zu verhindern.

Das Problem

Ihr Agent führt Aufgaben autonom aus – Untersuchung von Vorfällen, Ausführen von Tools und Generieren von Antworten. Aber Autonomie ohne Aufsicht schafft Risiken:

  • Unvollständige Antworten: Der Agent sagt "fertig", bevor er alles adressiert, was Sie angefordert haben.
  • Nicht überprüfte Toolverwendung: Sie haben keinen Einblick in welche Tools der Agent aufruft oder welche Ergebnisse es erhält.
  • Keine Richtlinienerzwingung: Gefährliche Vorgänge (destruktive Befehle, nicht autorisierte Änderungen) erfolgen unkontrolliert.
  • Qualitätslücken: Antworten verpassen wichtige Informationen, da kein Überprüfungsschritt vorhanden ist.

Sie benötigen eine Möglichkeit, das Verhalten des Agenten in wichtigen Momenten abzufangen, ohne es zu verlangsamen oder seine Autonomie vollständig zu entfernen.

Funktionsweise von Agenten-Hooks

Hooks sind benutzerdefinierte Prüfpunkte, die Sie an bestimmte Agentereignisse anfügen. Wenn ein Ereignis ausgelöst wird, evaluiert der Hook die Situation und entscheidet, ob die Aktion zugelassen oder blockiert wird.

Agent about to stop → Stop hook evaluates response → Allow or reject
Agent uses a tool   → PostToolUse hook checks result → Allow, block, or inject context

Derzeit werden zwei Hook-Ereignisse unterstützt:

Ereignis Trigger, wenn Ihre Möglichkeiten
Beenden Agent ist dabei, eine endgültige Antwort zurückzugeben. Vollständigkeit prüfen, ablehnen und den Agenten zum Weitermachen zwingen.
PostToolUse Ein Tool wird erfolgreich ausgeführt. Überwachen der Nutzung, Blockieren von Ergebnissen, Einfügen eines zusätzlichen Kontexts

Zwei Ebenen von Haken

Hooks funktionieren auf zwei Ebenen:

Grad Wo konfiguriert werden soll Geltungsbereich
Agent-Ebene Builder → Hooks im Portal Gilt für den gesamten Agent einschließlich aller Threads und aller benutzerdefinierten Agents
Benutzerdefinierte Agentebene Agent Canvas → benutzerdefinierter Agent → Verwalten von Hooks oder über die REST-API v2 Gilt nur, wenn der spezifische benutzerdefinierte Agent ausgeführt wird.

Beide Ebenen können koexistieren. Wenn ein Hook auf Agentebene und ein Hook auf benutzerdefinierter Agent-Ebene beide mit demselben Ereignis übereinstimmen, werden beide ausgeführt. Die Hooks auf Agentenebene werden zuerst ausgelöst.

Ausführungstypen

Sie können Hooks mithilfe eines LLM oder eines Shellskripts implementieren:

Typ So funktioniert es Am besten geeignet für:
Prompt Ein LLM wertet Ihre Eingabeaufforderung aus und gibt eine JSON-Entscheidung zurück. Differenzierte Validierung („Ist diese Antwort vollständig?“)
Befehl Ein Bash- oder Python-Skript wird in einer Sandkastenumgebung ausgeführt Deterministische Prüfungen, Richtlinienerzwingung, Überwachung

Eingabeaufforderungshaken eignen sich für subjektive Auswertungen, z. B. die Überprüfung, ob eine Antwort alle Bedenken des Benutzers behandelt oder überprüft, ob eine Untersuchung gründlich genug war. Sie verwenden den $ARGUMENTS Platzhalter, um den vollen Kontext des Hooks zu erhalten. Wenn $ARGUMENTS in der Eingabeaufforderung nicht vorhanden ist, wird der Kontext automatisch angefügt. Wenn ein Transkript der Kommunikation zur Verfügung steht, erhalten Prompt Hooks auch ReadFile und GrepSearch Tools, die dem LLM Rückschlüsse auf die gesamte Historie der Kommunikation ermöglichen.

Befehlshaken eignen sich besser für deterministische Überprüfungen, z. B. die Überprüfung, dass eine Antwort erforderliche Markierungen enthält, gefährliche Befehle blockieren oder die Verwendung des Protokollierungstools für ein externes System.

Was macht diesen Ansatz anders

In der folgenden Tabelle wird das Verhalten von Agenten mit und ohne Hooks verglichen.

Ohne Haken Mit Haken
Agent entscheidet, wann es "fertig" ist Sie definieren, was "erledigt" bedeutet
Die Toolverwendung ist nicht sichtbar. Jeder Toolaufruf kann überwacht werden.
Gefährliche Befehle werden stillschweigend ausgeführt Die Richtliniendurchsetzung blockiert sie automatisch
Qualität hängt allein von prompt Engineering ab Automatisierte Qualitätstore erkennen Lücken

Hooks ersetzen die Sicherheitskontrollen im Ausführungsmodus nicht – sie ergänzen sie. Ausführungsmodi steuern , was der Agent tun kann. Hooks steuern , wie gut es funktioniert und was mit den Ergebnissen passiert .

Vor und nachher

Szenario Vorher Nach
Antwortqualität Der Agent stoppt, wenn er denkt, dass es abgeschlossen ist. Ihr Stopp-Hook überprüft die Vollständigkeit, bevor die Antwort die Benutzer erreicht.
Sichtbarkeit des Tools Kein Audit-Trail für die Ausführung des Tools Nach der Werkzeugnutzung protokollieren und überprüfen Hooks jeden Werkzeugaufruf.
Richtlinienerzwingung Gefährliche Befehle werden ungeprüft ausgeführt Skripts blockieren rm -rf, sudound andere riskante Muster automatisch
Qualitätssicherung Prompt Engineering ist Ihr einziger Hebel LLM-basierte Hooks bewerten Nuancen; Skripts erzwingen deterministische Regeln

Hooks konfigurieren

Die einfachste Möglichkeit zum Erstellen von Hooks besteht in der Portal-UI:

  1. Hooks auf Agentebene: Wechseln Sie zu GeneratorHooks , → Wählen Sie "Hook erstellen" aus.
  2. Hooks auf benutzerdefinierter Agent-Ebene: Wechseln Sie zu "Agent Canvas" , → einen benutzerdefinierten Agent auswählen → Hooks verwalten.

Tipp

Sie können Hooks auch mithilfe der REST-API v2 konfigurieren PUT /api/v2/extendedAgent/agents/{agentName}. Das YAML-Format im folgenden Abschnitt zeigt das vollständige Konfigurationsschema. Weitere Informationen finden Sie im API-Lernprogramm.

Auf der Registerkarte "Agent Canvas YAML " wird das v1-Format angezeigt und keine Hooks angezeigt. Verwenden Sie die Hooks-Seite unter Generator , um Hooks anzuzeigen und zu verwalten.

Das folgende Beispiel zeigt eine vollständige Hook-Konfiguration:

api_version: azuresre.ai/v2
kind: ExtendedAgent
metadata:
  name: my_hooked_agent
spec:
  instructions: |
    You are a helpful assistant.
  handoffDescription: ""
  enableVanillaMode: true
  hooks:
    Stop:
      - type: prompt
        prompt: |
          Check if the response ends with "Task complete."
          $ARGUMENTS
          Respond with:
          - {"ok": true} if it does
          - {"ok": false, "reason": "End your response with 'Task complete.'"} if not
        timeout: 30

    PostToolUse:
      - type: command
        matcher: "Bash|ExecuteShellCommand"
        timeout: 30
        failMode: block
        script: |
          #!/usr/bin/env python3
          import sys, json, re

          context = json.load(sys.stdin)
          command = context.get('tool_input', {}).get('command', '')

          dangerous = [r'\brm\s+-rf\b', r'\bsudo\b', r'\bchmod\s+777\b']
          for pattern in dangerous:
              if re.search(pattern, command):
                  print(json.dumps({"decision": "block", "reason": f"Blocked: {pattern}"}))
                  sys.exit(0)

          print(json.dumps({"decision": "allow"}))

Hook-Antwortformat

Hooks müssen JSON ausgeben. Zwei Formate werden unterstützt.

Einfaches Format (empfohlen für Prompt-Hooks):

{"ok": true}
{"ok": false, "reason": "Please include more details."}

Erweitertes Format (empfohlen für Befehlshaken):

{"decision": "allow"}
{"decision": "block", "reason": "Dangerous command detected."}
{"decision": "allow", "hookSpecificOutput": {"additionalContext": "Tool audit logged."}}

Befehlshaken können auch Exitcodes anstelle der JSON-Ausgabe verwenden:

Exitcode Verhalten
0 ohne Ausgabe Zulassen (kein Widerspruch)
0 mit JSON Analysieren von JSON für Entscheidung
2 Immer blockieren. stderr wird zum Grund
Andere Verwendet failMode Einstellung (allow oder block)

Vorsicht

Bei Stopp-Hooks wird eine Ablehnung ohne Grund als Genehmigung behandelt, und der Agent wird normal gestoppt. Geben Sie beim Ablehnen immer ein Feld an reason .

Hinweis

Sie können mehrere Hooks für dasselbe Ereignis definieren. Bei PostToolUse wird jeder Hook mit einem passenden matcher Muster unabhängig ausgeführt. Wenn mehrere Hooks additionalContext bereitstellen, wird der Kontext des letzten Hooks in die Unterhaltung eingefügt.

Konfigurationsreferenz

In der folgenden Tabelle werden alle verfügbaren Hook-Konfigurationsoptionen beschrieben.

Auswahl Typ Vorgabe Beschreibung
type Schnur prompt prompt oder command
prompt Schnur LLM-Prompttext (erforderlich für Prompt-Hooks). Verwenden Sie $ARGUMENTS für die Kontexteinfügung.
command Schnur Inline-Shell-Befehl (für Befehls-Hooks; diese und script schließen sich gegenseitig aus).
script Schnur Mehrzeiliges Skript (für Befehl-Hooks; diese und command schließen sich gegenseitig aus).
matcher Schnur Regex-Muster für Toolnamen (erforderlich für PostToolUse-Hooks). * entspricht allen Tools. Muster sind als ^(pattern)$ verankert und werden unter Berücksichtigung der Groß- und Kleinschreibung abgeglichen. Leer oder Null stimmt mit nichts überein.
timeout INT 30 Ausführungstimeout in Sekunden (muss positiv sein; Werte über 300 werden während der CLI-Überprüfung gekennzeichnet).
failMode Schnur allow So behandeln Sie Hookfehler: allow oder block.
model Schnur ReasoningFast Modell für Prompt-Hooks (Szenarioname oder Bereitstellungsname).
maxRejections INT 3 (Agent-Standardwert) Maximale Ablehnung vor dem Erzwingen des Stopps. Bereich: 1 bis 25. Gilt nur für Stopp-Hooks vom Typ "Prompt". Stop-Hooks vom Typ "Befehlstyp" haben keine implizite Grenze. Wenn mehrere Eingabeaufforderungshaken unterschiedliche Werte angeben, wird das Maximum verwendet.

Hook-Kontextschema

Hooks empfangen strukturierten JSON-Kontext zu dem aktuellen Ereignis. Prompt-Hooks erhalten den Kontext über den Platzhalter $ARGUMENTS im Prompttext. Befehlshaken empfangen Kontext als JSON für stdin.

Für beide Hooktypen enthält das Feld execution_summary einen Dateipfad zum Transkript der Unterhaltung (nicht zu Inlineinhalten). Für Prompt-Hooks erhält das LLM ReadFile- und GrepSearch-Tools für den Zugriff auf diese Datei. Bei Befehlshaken ist die Datei im angegebenen Pfad im Sandkasten verfügbar.

Allgemeine Felder

Alle Hooks erhalten die folgenden Felder:

{
  "hook_event_name": "Stop",
  "agent_name": "my_agent",
  "current_turn": 5,
  "max_turns": 50,
  "execution_summary": "/path/to/transcript.txt"
}

Felder für Stopp-Hooks

Stopp-Hooks erhalten zusätzliche Felder für die endgültige Ausgabe des Agents.

{
  "final_output": "Here is my response...",
  "stop_hook_active": false,
  "stop_rejection_count": 0
}

PostToolUse-Hookfelder

PostToolUse-Hooks erhalten zusätzliche Felder zur Toolausführung.

{
  "tool_name": "ExecutePythonCode",
  "tool_input": { "code": "print(2+2)" },
  "tool_result": "4",
  "tool_succeeded": true
}

Einschränkungen

Die folgenden Limits gelten für Agent Hooks.

Begrenzung Wert
Skriptgröße Maximal 64 KB
Timeout 1–300 Sekunden
Maximal zulässige Ablehnungen (Sofort-Stopp-Hooks) 1 bis 25 (Standard: 3)
Unterstützte Skript-Shebangs #!/bin/bash, #!/usr/bin/env python3
Skriptausführungsumgebung Codeinterpreter in der Sandbox

Beispiel: Überwachen der gesamten Toolverwendung

Der folgende PostToolUse-Hook protokolliert jeden Toolaufruf und fügt eine Überwachungskontextmeldung hinzu:

hooks:
  PostToolUse:
    - type: command
      matcher: "*"
      timeout: 30
      failMode: allow
      script: |
        #!/usr/bin/env python3
        import sys, json

        context = json.load(sys.stdin)
        tool_name = context.get('tool_name', 'unknown')

        print(f"Tool used: {tool_name}", file=sys.stderr)

        output = {
            "decision": "allow",
            "hookSpecificOutput": {
                "additionalContext": f"[AUDIT] Tool '{tool_name}' was executed."
            }
        }
        print(json.dumps(output))

Das additionalContext Feld wird in der Unterhaltung als Benutzernachricht hinzugefügt, sodass der Agent einen Einblick in den Überwachungspfad erhält.

Beispiel: Anfordern einer Vervollständigungsmarkierung

Der folgende Stopp-Hook lehnt Antworten ab, die nicht mit "Aufgabe abgeschlossen" enden:

hooks:
  Stop:
    - type: command
      timeout: 30
      failMode: allow
      script: |
        #!/bin/bash
        CONTEXT=$(cat)
        FINAL_OUTPUT=$(echo "$CONTEXT" | jq -r '.final_output // empty')

        if [[ "$FINAL_OUTPUT" == *"Task complete."* ]]; then
          exit 0
        else
          echo "Please end your response with 'Task complete.'" >&2
          exit 2
        fi

Bewährte Methoden

Befolgen Sie die folgenden Richtlinien, wenn Sie Agent-Hooks konfigurieren:

  1. Geben Sie beim Ablehnen immer einen Grund an. Behandeln Sie Ablehnungen ohne Gründe als Genehmigungen.
  2. Verwenden Sie angemessene Timeouts: Lang laufende Hooks verlangsamen die Ausführung des Agents.
  3. Behandeln Sie Fehler ordnungsgemäß: Verwenden Sie failMode: allow, es sei denn, strenge Durchsetzung ist erforderlich.
  4. Sein Sie spezifisch mit Matchern: Zu weit gefasste PostToolUse-Matchers können Leistungsprobleme verursachen.
  5. Testen Sie Hooks gründlich: Hooks, die immer ablehnen, können Schleifen verursachen (Behebung durch maxRejections).
  6. In stderr protokollieren: Verwenden Sie stderr zur Fehlerbehebung der Ausgaben. Das System parst stdout als Ergebnis des Hooks.

Probieren Sie es selbst aus

Der folgende Screenshot zeigt einen Stopphaken in Aktion. Der Agent antwortet zunächst nur mit „4“. Der Hook lehnt die Antwort jedoch ab, weil der Completion-Marker fehlt. Der Agent fährt dann fort und fügt die Markierung hinzu.

Screenshot, der einen Stopp-Hook zeigt, bei dem die Antwort des Agents nach der Hook-Ablehnung mit einem Completion-Marker versehen ist.

Erste Schritte

Ressource Was Sie lernen werden
Konfigurieren von Agent-Hooks (API) Einrichten von Hooks mithilfe der REST-API v2 und YAML
Fähigkeit Wie es zusammenhängt
Ausführungsmodi Hooks ergänzen die Sicherheitskontrollen im Ausführungsmodus. Modi steuern , was ausgeführt wird, Hooks steuern , wie gut es ausgeführt wird.
Python-Tools Erstellen Sie benutzerdefinierte Tools, die Hooks prüfen und validieren können.