⚡ Server-Sent Events: Real-Time Progress Updates für KI-Agenten
🎯 Das Problem: Blackbox KI-Operationen
Bevor wir Server-Sent Events implementiert haben, war unser KI-Agent für Nutzer eine komplette Blackbox. Rezept-Generierung, Datenbank-Updates, API-Calls - alles lief im Hintergrund ab, ohne dass der Nutzer wusste, was gerade passiert.
❌ Vorher
Nutzer-Erfahrung:
- Lange Wartezeiten ohne Feedback
- Unklare Ladezustände
- Gefühl von "hängt die App?"
- Keine Transparenz über KI-Prozesse
✅ Nachher
Mit SSE:
- Echtzeit-Fortschrittsanzeigen
- Sichtbare KI-Denkprozesse
- Vertrauen durch Transparenz
- Bessere User Experience
💡 Warum Server-Sent Events?
Vorteile gegenüber WebSockets:
- ✅ Einfacher zu implementieren - Standardisiertes HTTP-Protokoll
- ✅ Automatische Reconnection - Browser handled Verbindungsabbrüche
- ✅ Uni-direktional - Perfekt für Progress Updates
- ✅ Firewall-freundlich - Läuft über Standard HTTP
- ✅ Event-basiert - Strukturierte Nachrichten mit Event-Types
🏗️ Backend-Architektur: FastAPI + asyncio
🔄 Event-Driven Architecture
Chat Session → Event Queue → SSE Stream → Frontend
# FastAPI SSE-Endpoint Implementation
@router.get("/chat/{session_id}/events")
async def chat_events(session_id: str):
"""Real-time event stream for chat session"""
async def event_generator():
queue = await get_session_queue(session_id)
while True:
try:
# Warte auf Events mit Timeout
event = await asyncio.wait_for(
queue.get(), timeout=30.0
)
# SSE-Format: data: {json}\n\n
yield f"data: {json.dumps(event)}\n\n"
except asyncio.TimeoutError:
# Heartbeat für Connection-Keep-Alive
yield f"data: {json.dumps({'type': 'heartbeat'})}\n\n"
return StreamingResponse(
event_generator(),
media_type="text/plain",
headers={
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Access-Control-Allow-Origin": "*",
}
)
🎯 Pro-Tipp: Session-basierte Event-Queues
Jede Chat-Session erhält eine eigene asyncio.Queue. So
können mehrere Nutzer gleichzeitig verschiedene KI-Operationen
verfolgen, ohne sich gegenseitig zu beeinflussen.
⚛️ Frontend-Integration: React Hooks
// Custom Hook für SSE-Integration
function useSSEProgress(sessionId: string) {
const [progress, setProgress] = useState<ProgressEvent[]>([]);
const [isConnected, setIsConnected] = useState(false);
useEffect(() => {
const eventSource = new EventSource(
`/api/chat/${sessionId}/events`
);
eventSource.onopen = () => {
setIsConnected(true);
console.log('📡 SSE Connection established');
};
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type !== 'heartbeat') {
setProgress(prev => [...prev, data]);
}
};
eventSource.onerror = () => {
setIsConnected(false);
console.log('❌ SSE Connection lost');
};
return () => eventSource.close();
}, [sessionId]);
return { progress, isConnected };
}
🎨 UI-Komponenten: Progressive Enhancement
🎭 Progress-Visualization
Event-Types und ihre UI-Darstellung:
-
🔍
search_start→ "Suche nach ähnlichen Rezepten..." -
🧠
ai_thinking→ "KI analysiert deine Anfrage..." -
📝
recipe_generation→ "Erstelle personalisiertes Rezept..." -
💾
database_update→ "Speichere in deiner Sammlung..." - ✅
completed→ "Fertig! Dein Rezept ist bereit."
// Progress-Komponente mit Event-Mapping
function ProgressDisplay({ events }: { events: ProgressEvent[] }) {
const getEventIcon = (type: string) => {
const icons = {
'search_start': '🔍',
'ai_thinking': '🧠',
'recipe_generation': '📝',
'database_update': '💾',
'completed': '✅'
};
return icons[type] || '⚡';
};
return (
<div className="progress-timeline">
{events.map((event, idx) => (
<div key={idx} className="progress-step">
<span className="icon">{getEventIcon(event.type)}</span>
<span className="message">{event.message}</span>
<span className="timestamp">{event.timestamp}</span>
</div>
))}
</div>
);
}
📊 Performance & Monitoring
📈 Messbare Verbesserungen:
- User Engagement: +45% längere Session-Dauer
- Conversion Rate: +32% mehr generierte Rezepte
- Support-Anfragen: -60% weniger "App hängt"-Tickets
- Server-Last: Minimal (vs. Polling-Alternative)
🔧 Monitoring & Debugging
Produktions-Tipps: Implementiere Connection-Monitoring, Event-Rate-Limiting und Graceful Degradation für ältere Browser ohne SSE-Support.
🚀 Zusammenfassung & Ausblick
Server-Sent Events haben unser KI-Interface revolutioniert: Von einer frustrierenden Blackbox zu einer transparenten, vertrauenswürdigen Erfahrung. Die Implementierung war überraschend straightforward, und die Performance-Gewinne sprechen für sich.
🎯 Key Takeaways für Entwickler:
- SSE vs. WebSockets: Für uni-direktionale Updates ist SSE oft die bessere Wahl
- Session-basierte Queues: Saubere Trennung zwischen gleichzeitigen Nutzern
- Frontend-Integration: Custom Hooks machen SSE-Handling wiederverwendbar
- Progressive Enhancement: UI reagiert in Echtzeit auf Backend-Events
💡 Nächste Schritte: Experimentiere mit WebRTC für Peer-to-Peer-Features oder GraphQL Subscriptions für komplexere Real-Time-Szenarien.
Von Blackbox zu Transparent - Wie SSE unsere KI-UX revolutioniert hat! ⚡🧠✨
Tech Stack: FastAPI, React, TypeScript, Python, Server-Sent Events, Real-Time, Event-Driven Architecture