Note

Hooks

BeforeToolCall, AfterModelCall, HookProvider, HookRegistry

⏱ 35분 93 / 189

Hooks

BeforeToolCall, AfterModelCall, HookProvider, HookRegistry

에이전트를 안전하게 제어한다

Hooks에서 Sandbox까지 — 4계층 제어 체계

제어와 확장 체계

4계층 방어 심도

PART 1 · 제어와 확장 체계

자율에 필요한 경계

모델이 스스로 도구와 반복을 결정하는 에이전트 — 통제 없는 자율이 만드는 사고들

위험 도구 실행

모델이 고른 도구가 항상 안전하지는 않음

비용 폭주

루프가 돌 때마다 토큰 과금 — 상한 없는 재시도

무한 루프

같은 도구를 계속 반복 — 스스로는 멈추지 못함

데이터 유출

도구 결과와 응답에 민감 정보가 섞여 나감

takeaway

자율성을 죽이지 않고 경계를 세우는 것 — 그 해법이 지금부터 볼 제어 4계층입니다.

PART 1 · 제어와 확장 체계

제어의 4계층

자율은 남기고 경계만 세우는 4계층 — 가볍게는 Hooks, 최후에는 Sandbox

Sandbox

실행 환경 자체를 격리 — 최후의 방어선

Interventions

Cedar 정책으로 동작 허용/거부 판정

Plugins

deny/steer 정책 제어 등 확장 모듈 부착

Hooks

이벤트 콜백으로 관찰·개입 — 가장 가벼운 제어

PART 1 · 제어와 확장 체계

계층별 비교

적용 시점·수준·구현 방식이 모두 다른 4개 레이어

계층적용 시점제어 수준구현 방식
Hooks이벤트 발생 시관찰 + 선택적 중단콜백 함수 등록
Plugins에이전트 초기화 시정책 제어·기능 주입클래스 인스턴스 부착
Interventions도구 호출 직전허용/거부/승인 대기Cedar 정책 파일
Sandbox프로세스 시작 전환경 격리Docker/SSH 설정
takeaway

가장 가벼운 Hooks부터 시작해 필요한 만큼 아래 계층을 더합니다 — 네 층을 다 쓰는 게 아니라, 워크로드의 위험도만큼 씁니다.

PART 1 · 제어와 확장 체계

요청이 지나는 관문 순서

Hook 검사 → Plugin 정책 → Intervention 판정 → Sandbox 격리 — 네 계층이 번갈아 개입하는 경로

  1. 1
    Hook: BeforeModelCallEvent

    모델 호출 전 검사 — 프롬프트 검증, 비용 체크

  2. 2
    Plugin: 정책 확인

    deny/steer 규칙 평가 — 위반 시 차단하거나 방향 수정

  3. 3
    Hook: BeforeToolCallEvent

    도구 호출 전 인자 검증·로깅

  4. 4
    Intervention: 판정

    Cedar 정책이 permit/forbid 판정, HumanInTheLoop이 민감 도구 승인 요구 — 별개 클래스

  5. 5
    Sandbox: 격리 실행

    허용된 도구를 컨테이너 내부에서 실행

takeaway

한 관문이라도 막히면 실행되지 않습니다 — 겹겹의 관문이 곧 방어 심도입니다.

Hooks

Event Callbacks · cancel_tool · 루프 제어

PART 2 · Hooks

Hooks

가장 가벼운 제어 계층 — 이벤트마다 콜백을 걸어 관찰하고 개입

Hooks

에이전틱 루프의 모든 지점에서 이벤트 콜백으로 관찰하고, 필요하면 개입합니다.

  • 이벤트 8종 — 루프 전 구간 커버
  • cancel_tool — 도구 실행 취소
  • 기존 코드 변경 없이 부착
  • 가장 가벼운 제어
takeaway

관찰이 먼저입니다 — 보이지 않으면 제어할 수 없습니다

PART 2 · Hooks

8가지 Hook Event

에이전틱 루프 전 구간을 관찰할 수 있는 강타입 이벤트 포인트

Hook Event발생 시점주요 용도
AgentInitializedEvent에이전트 생성자 완료 후초기 설정 검증, 플러그인 바인딩
BeforeInvocationEvent에이전트 호출 시작 전요청 로깅, 카운터 리셋
BeforeModelCallEvent모델 추론 호출 직전프롬프트 검증, 비용 사전 체크
AfterModelCallEvent모델 응답 수신 후응답 필터링, 재시도 판정
BeforeToolCallEvent도구 실행 직전인자 검증, 위험 도구 차단/교체
AfterToolCallEvent도구 실행 완료 후결과 수정, 재시도 판정
MessageAddedEvent대화 이력에 메시지 추가 시로깅, 메시지 감사
AfterInvocationEvent에이전트 호출 종료 후최종 응답 검사, 감사 로깅
takeaway

Before 이벤트는 막을 수 있는 지점, After 이벤트는 바로잡을 수 있는 지점입니다 — 개입 위치 선택이 곧 제어 전략입니다.

PART 2 · Hooks

Hook 등록

HookProvider 프로토콜로 기존 에이전트 코드 변경 없이 콜백 부착

python
from strands import Agent
from strands.hooks import BeforeToolCallEvent, HookProvider, HookRegistry

class BlockDangerousTools(HookProvider):
    """위험 도구 호출을 사전 차단"""
    BLOCKED = {"delete_file", "drop_table", "rm_rf"}

    def register_hooks(self, registry: HookRegistry, **kwargs) -> None:
        registry.add_callback(BeforeToolCallEvent, self.check_tool)

    def check_tool(self, event: BeforeToolCallEvent) -> None:
        tool_name = event.tool_use["name"]
        if tool_name in self.BLOCKED:
            event.cancel_tool = f"Blocked: {tool_name} is not allowed"

agent = Agent(
    model="us.anthropic.claude-sonnet-4-6",
    hooks=[BlockDangerousTools()],
)
PART 2 · Hooks

Hooks 개입 패턴

관찰에서 개입으로 — 취소·예외·마스킹을 조합한 4가지 대표 시나리오

비용 폭주 차단

토큰 사용량이 임계값 초과 시 즉시 중단

위험 도구 차단

허용 목록에 없는 도구 호출 시 거부

무한 루프 탐지

동일 도구 반복 호출 패턴 감지 시 탈출

PII 유출 방지

응답에 개인정보 패턴 감지 시 차단

takeaway

네 패턴의 뼈대는 같습니다 — 이벤트에서 조건을 검사하고, cancel_tool·예외·마스킹으로 개입합니다.

제어 없는 자율은 위험합니다.

Hooks · Plugins · Interventions · Sandbox — 4계층으로 에이전트를 통제