⚡ Server-Sent Events: Real-Time Progress Updates für KI-Agenten

Veröffentlicht am 28. Juni 2025 | 8 Minuten Lesezeit | Kategorie: Technische Entwicklung
SSE Before and After Comparison
FastAPI React TypeScript Python SSE Real-Time

🎯 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:

🏗️ 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:

// 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:

🔧 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:

  1. SSE vs. WebSockets: Für uni-direktionale Updates ist SSE oft die bessere Wahl
  2. Session-basierte Queues: Saubere Trennung zwischen gleichzeitigen Nutzern
  3. Frontend-Integration: Custom Hooks machen SSE-Handling wiederverwendbar
  4. 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