Safety Hooks Pattern
Automatische Sicherheitsschichten für AI-Agenten.
Das Problem
Du kannst nicht jeden API-Call manuell prüfen. Aber du musst sicherstellen, dass keine schädlichen Outputs, Datenlecks oder unbeabsichtigte Aktionen passieren.

Lösung: Safety Hooks
Hooks sind automatische Prüfungen, die bei jedem Call ausgeführt werden.
User Input
|
v
[Input Validation Hook]
| |
| (Block if invalid)
v
[Agent Execution]
|
v
[Output Filter Hook]
| |
| (Block/modify if unsafe)
v
[Memory Capture Hook]
| |
+----> Save to persistent storage
|
v
User ResponseTypen von Hooks
1. Input Validation Hook
- Prüft auf verbotene Wörter
- Validiert JSON/Syntax
- Checkt Rate-Limits
2. Output Filter Hook
- Entfernt PII (Personally Identifiable Information)
- Blockiert sensitive Daten (API-Keys, Passwörter)
- Formatiert Output nach Schema
3. Memory Capture Hook
- Speichert jeden erfolgreichen Call
- Loggt Fehler für Debugging
- Ermöglicht spüres Lernen aus Vergangenheit
Implementierung in Python
# Safety Hooks als Decorator
from functools import wraps
import re
import logging
logger = logging.getLogger(__name__)
def input_validation_hook(forbidden_words: list):
"""Blockiert Inputs mit verbotenen Wörtern"""
def decorator(func):
@wraps(func)
def wrapper(user_input, *args, **kwargs):
for word in forbidden_words:
if word.lower() in user_input.lower():
logger.warning(f"Blocked input containing: {word}")
raise ValueError("Input contains forbidden content")
return func(user_input, *args, **kwargs)
return wrapper
return decorator
def output_filter_hook(patterns: list):
"""Filtert sensitive Daten aus Output"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
for pattern, replacement in patterns:
result = re.sub(pattern, replacement, result)
return result
return wrapper
return decorator
# Usage:
@input_validation_hook(forbidden_words=["hack", "exploit", "bypass"])
@output_filter_hook(patterns=[
(r"sk-w+", "[API_KEY_REDACTED]"),
(r"d{3}-d{2}-d{4}", "[SSN_REDACTED]")
])
def agent_execute(prompt: str) -> str:
# Hier passiert die eigentliche Agent-Logik
return llama3.2(prompt)Implementierung in n8n
// n8n Function Node - Input Hook
const forbidden = ['hack', 'exploit', 'bypass'];
const input = $input.item.json.message;
for (const word of forbidden) {
if (input.toLowerCase().includes(word)) {
throw new Error('Input blocked by safety hook');
}
}
return $input.item;Memory Capture Hook
# Memory Capture Hook - speichert jeden Call
import sqlite3
from datetime import datetime
def memory_capture_hook(func):
@wraps(func)
def wrapper(prompt, *args, **kwargs):
start_time = datetime.now()
try:
result = func(prompt, *args, **kwargs)
status = "success"
except Exception as e:
result = str(e)
status = "error"
# In SQLite speichern
conn = sqlite3.connect('agent_memory.db')
conn.execute("""
INSERT INTO interactions
(prompt, result, status, duration_ms, timestamp)
VALUES (?, ?, ?, ?, ?)
""", (
prompt,
result[:1000], # Truncate für DB
status,
(datetime.now() - start_time).total_seconds() * 1000,
datetime.now().isoformat()
))
conn.commit()
return result
return wrapperBest Practices
- Hook-Fehler nicht stillschweigend ignorieren
- Logging für Audit-Trail aktivieren
- Regelmäßig Safety Rules aktualisieren
- False Positives reduzieren durch Whitelists
Quellen
Verwandte Artikel
Patterns
Agent Orchestration Patterns
Übersicht über bewährte Orchestration-Patterns für Multi-Agent Systeme.
Security
API Keys sicher speichern
Vault, Environment Variables, Secrets Management für AI-Stack.
Patterns
Heartbeat & Monitoring Pattern
Wie du erkennst, ob Agenten laufen — Health Checks, Status-Updates, Alerting.
War dieser Artikel hilfreich?
Weiter im Lernpfad
Der Lernpfad bringt diese Artikel in eine Reihenfolge, und der Hub führt die Bausteine, die wir im eigenen Betrieb geprüft haben.
Warum AI Engineering
- Lokal und selbst gehostet
- Dokumentiert und prüfbar
- Aus eigenem Betrieb
- Made in Austria
Kein Ersatz für Rechtsberatung.