Azure SRE Agent의 에이전트 후크

후크는 중요한 순간에 에이전트 동작을 가로채고 제어하는 사용자 지정 검사점입니다. 후크를 사용하여 에이전트 응답에 품질 게이트를 적용하고, 도구 사용을 감사 및 제어하고, 정책을 적용하여 위험한 작업을 차단하고, 에이전트 출력의 유효성을 검사하여 초기 작업 완료를 방지합니다.

문제

에이전트는 작업을 자율적으로 실행하여 인시던트 조사, 도구 실행 및 응답 생성을 수행합니다. 그러나 감독없이 자율성은 위험을 만듭니다 :

  • 불완전한 응답: 에이전트는 요청한 모든 사항을 해결하기 전에 "완료"라고 말합니다.
  • 감사되지 않은 도구 사용: 에이전트가 호출하는 도구 또는 어떤 결과를 가져오는지에 대한 가시성이 없습니다.
  • 정책 적용 없음: 위험한 작업(파괴적인 명령, 무단 변경)이 확인되지 않은 상태로 진행됩니다.
  • 품질 격차: 유효성 검사 단계가 없으므로 응답에서 중요한 정보를 누락합니다.

속도를 늦추거나 자율성을 완전히 제거하지 않고 중요한 순간에 에이전트 동작을 가로채는 방법이 필요합니다.

에이전트 후크의 작동 방식

후크는 특정 에이전트 이벤트에 연결하는 사용자 지정 검사점입니다. 이벤트가 발생하면 훅이 상황을 평가하고 작업을 허용할지 아니면 차단할지 결정합니다.

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

현재 두 개의 후크 이벤트가 지원됩니다.

이벤트 트리거 조건 수행 가능한 작업
중지 에이전트가 최종 응답을 반환하려고 합니다. 완전성을 검토하고 거부하며 에이전트가 계속하도록 강제합니다.
PostToolUse 도구 실행이 성공적으로 완료됨 사용 감사, 결과 차단, 추가 컨텍스트 삽입

두 가지 수준의 후크

후크는 다음 두 수준에서 작동합니다.

수준 구성할 위치 Scope
에이전트 수준 포털의 빌더 → 훅스 모든 스레드 및 모든 사용자 지정 에이전트를 포함하여 전체 에이전트에 적용됩니다.
사용자 지정 에이전트 수준 에이전트 캔버스 → 사용자 지정 에이전트 → 후크 관리 또는 REST API v2를 통해 특정 사용자 지정 에이전트가 실행되는 경우에만 적용됩니다.

두 수준 모두 공존할 수 있습니다. 에이전트 수준 후크와 사용자 지정 에이전트 수준 후크가 모두 동일한 이벤트와 일치하면 둘 다 실행됩니다. 에이전트 수준의 후크가 가장 먼저 실행됩니다.

실행 형식

LLM 또는 셸 스크립트를 사용하여 후크를 구현할 수 있습니다.

유형 작동 방식 적합한 대상
프롬프트 LLM은 프롬프트를 평가하고 JSON 결정을 반환합니다. 미묘한 유효성 검사("이 응답이 완료된가요?")
Command 샌드박스 환경에서 bash 또는 Python 스크립트 실행 결정적 검사, 정책 적용, 감사

프롬프트 후크는 응답이 모든 사용자 문제를 해결하는지 확인하거나 조사가 충분히 철저했는지 확인하는 등 주관적인 평가에 강력합니다. 그들은 $ARGUMENTS 자리 표시자를 사용하여 전체 후크 컨텍스트를 받습니다. 프롬프트에 없는 경우 $ARGUMENTS 컨텍스트가 자동으로 추가됩니다. 대화 대본을 사용할 수 있는 경우, 프롬프트 후크는 ReadFileGrepSearch 도구를 활용하여 LLM이 전체 대화 기록을 이해할 수 있도록 합니다.

명령 후크는 응답에 필요한 표식이 포함되어 있는지 확인하거나, 위험한 명령을 차단하거나, 도구 사용을 외부 시스템에 로깅하는 등 결정적 검사에 더 적합합니다.

이 접근 방식이 다른 이유

다음 표에서는 후크를 사용 또는 사용하지 않는 에이전트 동작을 비교합니다.

후크 없이 후크 사용
에이전트가 "완료" 시기를 결정합니다. "완료"의 의미를 정의합니다.
도구 사용이 눈에 띄지 않습니다. 모든 도구 호출을 감사할 수 있습니다.
위험한 명령은 알림 없이 진행됩니다. 정책 집행이 그들을 자동으로 차단합니다.
품질은 프롬프트 엔지니어링에만 달려 있습니다. 자동화된 품질 게이트가 격차를 해소합니다.

후크는 실행 모드 안전 컨트롤을 대체하지 않으며 이를 보완합니다. 실행 모드는 에이전트가 수행할 수 있는 작업을 제어합니다. 후크는 얼마나 수행하고 결과에 어떤 일이 일어나는지 제어합니다.

이전 및 이후

시나리오 이전 이후
응답 품질 에이전트는 완료되었다고 생각하면 중지됩니다. 응답이 사용자에게 도달하기 전에 중지 후크가 완전성을 확인합니다.
도구 표시 유형 도구 실행의 감사 내역 없음 PostToolUse 후크는 모든 도구 호출을 로그하고 검증합니다.
정책 적용 위험한 명령이 선택되지 않은 상태로 실행됨 스크립트는 rm -rf, sudo 및 다른 위험한 패턴을 자동으로 차단합니다.
품질 보증 프롬프트 엔지니어링은 유일한 레버입니다. LLM 기반 후크는 뉘앙스를 평가합니다. 스크립트는 결정적 규칙을 적용합니다.

후크 구성

후크를 만드는 가장 쉬운 방법은 포털 UI를 사용하는 것입니다.

  1. 에이전트 수준 후크:빌더후크로 이동 → 후크 만들기를 선택합니다.
  2. 사용자 지정 에이전트 수준 후크:에이전트 캔버스로 이동하여 → 사용자 지정 에이전트를 선택 → 후크 관리.

팁 (조언)

을 사용하여 PUT /api/v2/extendedAgent/agents/{agentName}를 통해 후크를 구성할 수도 있습니다. 다음 섹션의 YAML 형식은 전체 구성 스키마를 보여줍니다. 자세한 내용은 API 자습서를 참조하세요.

에이전트 캔버스 YAML 탭은 v1 형식을 표시하고 후크를 표시하지 않습니다. 작성기 아래의 후크 페이지를 사용하여 후크를 보고 관리합니다.

다음 예제에서는 전체 후크 구성을 보여줍니다.

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"}))

후크 응답 형식

후크는 JSON을 출력해야 합니다. 두 가지 형식이 지원됩니다.

간단한 형식 (프롬프트 후크에 권장):

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

확장된 형식 (명령 후크에 권장):

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

명령 후크는 JSON 출력 대신 종료 코드를 사용할 수도 있습니다.

종료 코드 행동
0 출력 없음 허용(이의 없음)
0 JSON을 사용하여 결정에 대한 JSON 구문 분석
2 항상 차단합니다. stderr가 이유가 됩니다.
기타 failMode 설정 사용 (allow 또는 block)

주의

중지 후크의 경우 이유 없는 거부는 승인으로 처리되며 에이전트가 정상적으로 중지됩니다. 거부할 때 항상 필드를 제공합니다 reason .

메모

동일한 이벤트에 대해 여러 후크를 정의할 수 있습니다. PostToolUse의 경우 일치하는 matcher 패턴이 있는 각 후크는 독립적으로 실행됩니다. 여러 후크가 제공 additionalContext되면 마지막 후크의 컨텍스트가 대화에 삽입됩니다.

구성 참조

다음 표에서는 사용 가능한 모든 후크 구성 옵션을 설명합니다.

Option 유형 기본값 설명
type 문자열 prompt prompt 또는 command
prompt 문자열 LLM 프롬프트 텍스트입니다(프롬프트 후크에 필요함). 컨텍스트 주입에 사용합니다 $ARGUMENTS .
command 문자열 인라인 셸 명령(명령 후크의 경우 script와 상호 배타적).
script 문자열 여러 줄 스크립트(command와 명령 후크는 상호 배타적입니다).
matcher 문자열 도구 이름에 대한 Regex 패턴(PostToolUse 후크에 필요). * 는 모든 도구와 일치합니다. 패턴은 ^(pattern)$(으)로 앵커되고 대소문자를 구분하여 일치됩니다. 비었거나 null와 아무것도 일치하지 않습니다.
timeout int 30 실행 제한 시간(초)은 양수여야 하며 CLI 유효성 검사 중에 300을 초과하는 값에 플래그가 지정됩니다.
failMode 문자열 allow 후크 오류를 처리하는 방법: allow 또는 block.
model 문자열 ReasoningFast 프롬프트 후크(시나리오 이름 또는 배포 이름)에 대한 모델입니다.
maxRejections int 3 (에이전트 기본값) 강제 중지를 하기 전 최대 거부 수입니다. 범위: 1-25. 프롬프트 형식 중지 후크에만 적용됩니다. 명령 유형 중지 후크에는 암시적 제한이 없습니다. 여러 프롬프트 후크가 서로 다른 값을 지정하는 경우 최대값이 사용됩니다.

후크 컨텍스트 스키마

후크는 현재 이벤트에 대한 구조적 JSON 컨텍스트를 받습니다. 프롬프트 후크는 프롬프트 텍스트의 $ARGUMENTS 자리 표시자를 통해 컨텍스트를 수신합니다. 명령 훅stdin에서 JSON으로 컨텍스트를 수신합니다.

두 후크 형식 execution_summary 의 경우 필드에는 대화 내용에 대한 파일 경로 (인라인 콘텐츠 아님)가 포함됩니다. 프롬프트 후크의 경우 LLM은 ReadFileGrepSearch 도구를 수신하여 이 파일에 액세스합니다. 명령 후크의 경우 샌드박스의 지정된 경로에서 파일을 사용할 수 있습니다.

공통 필드

모든 후크는 다음의 필드를 받습니다.

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

중지 후크 필드

중지 후크는 에이전트의 최종 출력에 대한 추가 필드를 받습니다.

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

PostToolUse 후크 필드

PostToolUse 후크는 도구 실행에 대한 추가 필드를 받습니다.

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

제한

에이전트 후크에는 다음 제한이 적용됩니다.

Limit 가치
스크립트 크기 최대 64KB
일시 중지 1~300초
최대 거부 횟수(프롬프트 중지 후크) 1-25(기본값: 3)
지원되는 스크립트 셰뱅 #!/bin/bash, #!/usr/bin/env python3
스크립트 실행 환경 샌드박스 코드 인터프리터

예제: 모든 도구 사용 감사

다음 PostToolUse 후크는 모든 도구 호출을 기록하고 감사 컨텍스트 메시지를 추가합니다.

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))

additionalContext 필드는 대화에 사용자 메시지로 추가되어 에이전트가 감사 내역을 볼 수 있게 합니다.

예: 완성 표식 필요

다음 중지 후크는 "작업 완료"로 끝나지 않는 응답을 거부합니다.

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

모범 사례

에이전트 후크를 구성할 때 다음 지침을 따릅니다.

  1. 거부할 때 항상 이유를 입력합니다. 이유 없이 거부를 승인으로 처리합니다.
  2. 적절한 시간 제한 사용: 장기 실행 후크로 인해 에이전트 실행 속도가 느려집니다.
  3. 오류를 우아하게 처리: 엄격한 적용이 필요하지 않는 한 failMode: allow을 사용합니다.
  4. 매처를 구체적으로 명확히 하십시오. 지나치게 광범위한 PostToolUse 매처는 성능 문제를 일으킬 수 있습니다.
  5. 후크를 철저히 테스트하라: 항상 거부하는 후크는 루프를 발생시킬 수 있습니다(maxRejections에 의해 완화됨).
  6. stderr에 로그: 디버깅 출력을 위해 stderr를 사용합니다. 시스템은 stdout을 후크의 결과로 구문 분석합니다.

직접 사용해 보기

다음 스크린샷은 정지 후크의 동작을 보여줍니다. 처음에는 에이전트가 "4"로 응답하지만 완료 표식이 누락되어 후크가 응답을 거부합니다. 그런 다음 에이전트가 계속하여 표식을 추가합니다.

후크 거부 후 에이전트 응답이 완료 표식으로 데코레이트된 실제 중지 후크를 보여 주는 스크린샷입니다.

시작하기

Resource 학습할 내용
에이전트 후크 구성(API) REST API v2 및 YAML을 사용하여 후크 설정
역량 관련성
실행 모드 후크는 실행 모드 안전 제어를 보완합니다. 모드는 무엇을 실행할지 제어하고, 후크는 얼마나 잘 실행되는지를 제어합니다.
Python 도구 훅이 감사와 유효성을 검사할 수 있는 사용자 지정 도구를 만듭니다.