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
War dieser Artikel hilfreich?
Nächster Schritt: vom Wissen in die Umsetzung
Wenn du mehr willst als Theorie: Setups, Workflows und Vorlagen aus dem echten Betrieb für Teams, die lokale und dokumentierte AI-Systeme wollen.
Warum AI Engineering
- Lokal und self-hosted gedacht
- Dokumentiert und auditierbar
- Aus eigener Runtime entwickelt
- Made in Austria
Kein Ersatz für Rechtsberatung.