Hooks
BeforeToolCall, AfterModelCall, HookProvider, HookRegistry
Hooks
BeforeToolCall, AfterModelCall, HookProvider, HookRegistry
에이전트를 안전하게 제어한다
Hooks에서 Sandbox까지 — 4계층 제어 체계
제어와 확장 체계
4계층 방어 심도
자율에 필요한 경계
모델이 스스로 도구와 반복을 결정하는 에이전트 — 통제 없는 자율이 만드는 사고들
위험 도구 실행
모델이 고른 도구가 항상 안전하지는 않음
비용 폭주
루프가 돌 때마다 토큰 과금 — 상한 없는 재시도
무한 루프
같은 도구를 계속 반복 — 스스로는 멈추지 못함
데이터 유출
도구 결과와 응답에 민감 정보가 섞여 나감
자율성을 죽이지 않고 경계를 세우는 것 — 그 해법이 지금부터 볼 제어 4계층입니다.
제어의 4계층
자율은 남기고 경계만 세우는 4계층 — 가볍게는 Hooks, 최후에는 Sandbox
Sandbox
실행 환경 자체를 격리 — 최후의 방어선
Interventions
Cedar 정책으로 동작 허용/거부 판정
Plugins
deny/steer 정책 제어 등 확장 모듈 부착
Hooks
이벤트 콜백으로 관찰·개입 — 가장 가벼운 제어
계층별 비교
적용 시점·수준·구현 방식이 모두 다른 4개 레이어
| 계층 | 적용 시점 | 제어 수준 | 구현 방식 |
|---|---|---|---|
| Hooks | 이벤트 발생 시 | 관찰 + 선택적 중단 | 콜백 함수 등록 |
| Plugins | 에이전트 초기화 시 | 정책 제어·기능 주입 | 클래스 인스턴스 부착 |
| Interventions | 도구 호출 직전 | 허용/거부/승인 대기 | Cedar 정책 파일 |
| Sandbox | 프로세스 시작 전 | 환경 격리 | Docker/SSH 설정 |
가장 가벼운 Hooks부터 시작해 필요한 만큼 아래 계층을 더합니다 — 네 층을 다 쓰는 게 아니라, 워크로드의 위험도만큼 씁니다.
요청이 지나는 관문 순서
Hook 검사 → Plugin 정책 → Intervention 판정 → Sandbox 격리 — 네 계층이 번갈아 개입하는 경로
-
1
Hook: BeforeModelCallEvent
모델 호출 전 검사 — 프롬프트 검증, 비용 체크
-
2
Plugin: 정책 확인
deny/steer 규칙 평가 — 위반 시 차단하거나 방향 수정
-
3
Hook: BeforeToolCallEvent
도구 호출 전 인자 검증·로깅
-
4
Intervention: 판정
Cedar 정책이 permit/forbid 판정, HumanInTheLoop이 민감 도구 승인 요구 — 별개 클래스
-
5
Sandbox: 격리 실행
허용된 도구를 컨테이너 내부에서 실행
한 관문이라도 막히면 실행되지 않습니다 — 겹겹의 관문이 곧 방어 심도입니다.
Hooks
Event Callbacks · cancel_tool · 루프 제어
Hooks
가장 가벼운 제어 계층 — 이벤트마다 콜백을 걸어 관찰하고 개입
Hooks
에이전틱 루프의 모든 지점에서 이벤트 콜백으로 관찰하고, 필요하면 개입합니다.
- 이벤트 8종 — 루프 전 구간 커버
- cancel_tool — 도구 실행 취소
- 기존 코드 변경 없이 부착
- 가장 가벼운 제어
관찰이 먼저입니다 — 보이지 않으면 제어할 수 없습니다
8가지 Hook Event
에이전틱 루프 전 구간을 관찰할 수 있는 강타입 이벤트 포인트
| Hook Event | 발생 시점 | 주요 용도 |
|---|---|---|
| AgentInitializedEvent | 에이전트 생성자 완료 후 | 초기 설정 검증, 플러그인 바인딩 |
| BeforeInvocationEvent | 에이전트 호출 시작 전 | 요청 로깅, 카운터 리셋 |
| BeforeModelCallEvent | 모델 추론 호출 직전 | 프롬프트 검증, 비용 사전 체크 |
| AfterModelCallEvent | 모델 응답 수신 후 | 응답 필터링, 재시도 판정 |
| BeforeToolCallEvent | 도구 실행 직전 | 인자 검증, 위험 도구 차단/교체 |
| AfterToolCallEvent | 도구 실행 완료 후 | 결과 수정, 재시도 판정 |
| MessageAddedEvent | 대화 이력에 메시지 추가 시 | 로깅, 메시지 감사 |
| AfterInvocationEvent | 에이전트 호출 종료 후 | 최종 응답 검사, 감사 로깅 |
Before 이벤트는 막을 수 있는 지점, After 이벤트는 바로잡을 수 있는 지점입니다 — 개입 위치 선택이 곧 제어 전략입니다.
Hook 등록
HookProvider 프로토콜로 기존 에이전트 코드 변경 없이 콜백 부착
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()],
)
Hooks 개입 패턴
관찰에서 개입으로 — 취소·예외·마스킹을 조합한 4가지 대표 시나리오
비용 폭주 차단
토큰 사용량이 임계값 초과 시 즉시 중단
위험 도구 차단
허용 목록에 없는 도구 호출 시 거부
무한 루프 탐지
동일 도구 반복 호출 패턴 감지 시 탈출
PII 유출 방지
응답에 개인정보 패턴 감지 시 차단
네 패턴의 뼈대는 같습니다 — 이벤트에서 조건을 검사하고, cancel_tool·예외·마스킹으로 개입합니다.
Hooks · Plugins · Interventions · Sandbox — 4계층으로 에이전트를 통제