feat: Add live streaming to Chat page

- Replace blocking execute_agent_task() with live subprocess streaming
- Use Popen() to read opencode output line-by-line in real-time
- Send 'chunk' events to frontend as agent thinks
- Frontend appends chunks incrementally for live response
- Matches Orchestrator's streaming UX
- No more waiting for complete response before seeing output
This commit is contained in:
pdyde 2026-02-21 17:32:37 +01:00
parent d620f496a8
commit e2a853ffde
3 changed files with 408 additions and 7 deletions

View file

@ -0,0 +1,344 @@
# 📊 ZUSAMMENFASSUNG DIVERSITY-BALL WIEN 2026
**Stand:** 21. Februar 2026 | **Erstellt von:** Zusammenfasser-Agent
---
## 🎯 EXECUTIVE SUMMARY
Das Agenten-System hat in kürzester Zeit **8 substantielle Fachkonzepte** für den Diversity-Ball Wien entwickelt. Die **Grundplanung ist solide**, aber es gibt **kritische Koordinationsprobleme**, die sofortige Eskalation erfordern.
| Kennzahl | Status |
|----------|--------|
| **Agenten aktiv** | 8 von 13 (mit Output) |
| **Deliverables** | 11 umfassende Dokumente |
| **Größtes Risiko** | Fehlende Agenten-Abstimmung |
| **Kritische Deadline** | 28. Februar 2026 (Rathaus-Verhandlung) |
---
## 📋 WAS WURDE BISHER GELEISTET
### ✅ Abgeschlossene Fachkonzepte
| Agent | Deliverable | Qualität | Status |
|-------|-------------|----------|--------|
| **budget_manager** | Vollständiger Budgetplan (750k€) | 8/10 | Vorlage, braucht Abstimmung |
| **catering_manager** | Komplettes Catering-Konzept | 9/10 | Ready, 3.500 Gäste geplant |
| **location_manager** | Rathaus-Konzept + MA 36 Checkliste | 9/10 | Critical Path: bis 28.2. handeln |
| **program_manager** | 8h Programmablauf (17:00-02:00) | 7/10 | Minutengenau, braucht Budget-Check |
| **tax_advisor** | Steuerliche Komplettanalyse | 9/10 | Gemeinnützigkeit klär, Tombola 5% |
| **musik_rechte_advisor** | AKM/LSG/Austro-Mechana Analyse | 9/10 | Ready, exakte Tarifberechnung |
| **social_media_manager** | Marketing-Strategie 6 Monate | 9/10 | 1.182 Zeilen, aber falsches Datum |
| **researcher** | Diversity-Trends + Benchmarking | 9/10 | Opernball-Vergleich, Ticketing-Analyse |
### ❌ Noch nicht aktiviert
| Agent | Rolle | Priorität | Grund |
|-------|-------|-----------|-------|
| **negotiator** | Vertragsverhandlungen | 🔴 SOFORT | Rathaus-Deadline 28.2.2026! |
| **zusammenfasser** | Status-Reports | 🟡 WICHTIG | Wurde erst jetzt eingesetzt |
---
## 💰 BUDGET-SITUATION (KRITISCH!)
### Die Ausgangslage
| Position | Betrag | Anmerkung |
|----------|--------|----------|
| **Zielbudget** | 750.000 € | Vorgabe |
| **Gesamtausgaben (Expected)** | 1.127.428 € | ⚠️ 50% ÜBER BUDGET! |
| **Ticketeinnahmen (85% Auslastung)** | 636.650 € | @ 214€/Ticket |
| **Geplantes Sponsoring** | 250.000 € | Optimistisch |
| **Deckungslücke** | -224.378 € | Muss durch Förderungen gedeckt werden |
### Budget-Struktur
```
AUSGABEN (Largest Drivers):
┌─────────────────────────────────────────┐
│ 1. Location (Rathaus): 395.000€ (49,8%) │
│ 2. Catering: 370.000€ (32,8%) │
│ 3. Entertainment: 61.000€ (5,4%) │
│ 4. Technik: 60.000€ (5,3%) │
│ 5. Marketing: 37.500€ (3,3%) │
│ 6. Sonstige: 163.928€ (14,5%) │
└─────────────────────────────────────────┘
```
### 🚨 KOSTENPROBLEM: Keine Abstimmung zwischen Agenten!
| Agent | Catering-Kosten | Veranstaltungs-Budget |
|-------|-----------------|----------------------|
| budget_manager | 420.000€ (ohne Sponsor) | **1.127.428€** |
| catering_manager | 320.800€ | — |
| program_manager | 280.000€ | **750.000€** |
**→ Die Agenten arbeiten mit unterschiedlichen Zahlen und haben sich NICHT abgestimmt!**
---
## 📅 EVENT-DETAILS (Zentrale Parameter)
| Parameter | Wert | Notiz |
|-----------|------|-------|
| **Datum** | Samstag, 5. September 2026 | ⚠️ Diskrepanz: ORCHESTRATION.md sagt 1. März! |
| **Ort** | Wiener Rathaus, Festsaal | Größte Location Wiens (3.500 Plätze) |
| **Gäste** | 3.500 Personen | Expected 85% Auslastung = 2.975 Personen |
| **Ticketpreis** | 214 € (Einheitspreis) | 214€/Person x 3.500 = 749.000€ max. Einnahmen |
| **Uhrzeit** | 18:00 02:00 Uhr | 8h Event, volle Nacht |
---
## 🏆 PROGRAMM-ÜBERBLICK (8-Stunden-Event)
### Zeitplan (Simplified)
| Phase | Zeit | Highlight |
|-------|------|-----------|
| **Eröffnung** | 18:0019:00 | Sektempfang, Einmarsch, Eröffnungsrede |
| **Dinner** | 19:0021:30 | 3-Gang-Menü (Rathauskeller), Walzer |
| **Unterhaltung** | 21:3022:15 | Diversity-Dance-Showcase (Highlight!) |
| **Awards** | 22:1523:30 | 5 Diversity-Awards + Lifetime Achievement |
| **Tombola & Party** | 23:3001:30 | Losziehung, Charity-Auktion, DJ |
| **Abschluss** | 01:3002:00 | Letzter Walzer, Dank, Abgang |
### Diversity-Elemente
✅ ÖGS-Dolmetscher durchgehend
✅ Rollstuhl-Walzer in Eröffnung
✅ Induktionsanlage für Hörgeschädigte
✅ 5 Menü-Varianten (vegetarisch, vegan, glutenfrei, halal, koscher)
✅ 5 Award-Kategorien (LGBTQ+, Ethnie, Behinderung, Alter, Geschlecht)
✅ Tanzshow mit weltweiten Tanzstilen
---
## 🍽️ CATERING-DETAILS (3.500 Personen)
### Menü-Struktur
| Gang | Standard | Vegetarisch | Vegan | Glutenfrei | Halal/Koscher |
|------|----------|-------------|-------|-----------|---------------|
| Vorspeise | Beef-Tatar | Burrata | Gazpacho | Spezial | Separat |
| Hauptgang | Tafelspitz | Wellington | Linsen-Risotto | Tafelspitz (GF) | Lammmedaillons |
| Dessert | Topfenknödel | Topfenknödel | Schokoladenmousse | Panna Cotta | Topfenknödel |
| **Personal** | **168 Servicekräfte** | | | | |
### Ernährungsverteilung (geplant)
- Standard: 50% (1.750 Gäste)
- Vegetarisch: 20% (700 Gäste)
- Vegan: 15% (525 Gäste)
- Glutenfrei: 10% (350 Gäste)
- Halal/Koscher: 5% (175 Gäste)
**Kosten:** 370.000420.000 € (mit/ohne Getränke-Sponsor)
---
## 🎪 UNTERSTÜTZUNG DURCH AGENTEN
### Personal (gesamter Event)
```
Total ~354 Personen:
├─ Catering: 168 Servicekräfte
├─ Security: 50 Ordner
├─ Künstler: ~60 (Orchester, Tänzer, DJ)
├─ Technik: 20 Mitarbeiter
├─ Garderobe/Einlass: 20 Personen
├─ Volunteers: 30 Personen
├─ Moderation: 12 Personen
├─ ÖGS-Dolmetscher: 2 Personen
└─ Sanitätsdienst: 3 Personen
```
### Technische Ausstattung
✅ PA-System: Line Array, 80 kW Leistung
✅ LED-Wand: 12×6 m (Hauptbühne)
✅ Licht: 120 Moving Heads, 60 LED-Par
✅ Bühnenrampe für Barrierefreiheit
✅ Induktionsanlage: 6 Schleifen
✅ Videomagnifikation: 8 Monitore
---
## ⚠️ KRITISCHE PROBLEME (SOFORT-HANDLUNG ERFORDERLICH)
### 🔴 PROBLEM 1: Datums-Diskrepanz
**WIDERSPRUCH:**
- ORCHESTRATION.md nennt **1. März 2026** als Eventdatum
- **ALLE Agenten** arbeiten mit **5. September 2026**
**Auswirkung:**
- Alle Zeitpläne, Fristen und Meilensteine möglicherweise falsch
- 6 Monate Unterschied = massive Planungs-Konfusion
**SOFORTIGE LÖSUNG:** Orchestrator muss Richtdatum bestätigen und an alle kommunizieren!
---
### 🔴 PROBLEM 2: Budget-Chaos (3 verschiedene Gesamtbudgets!)
| Agent | Gesamtbudget |
|-------|--------------|
| budget_manager | **1.127.428€** (Expected) |
| program_manager | **750.000€** (Zielbudget) |
| Kombiniert betrachtet | **1.1+ Mio€** (über Ziel!) |
**Folge:** Keine Abstimmung zwischen den Agenten. Budget kann nicht gehalten werden ohne massive Sponsoring-Einnahmen (300k+€) oder Förderungen.
**SOFORTIGE LÖSUNG:** Budget-Koordinationsrunde mit allen Agenten!
---
### 🔴 PROBLEM 3: Ticketpreis-Inkonsistenz
| Agent | Verwendeter Ticketpreis |
|-------|------------------------|
| budget_manager | **214€** (Basis) |
| researcher | **85120€** (empfohlen) |
| tax_advisor | **100€** (Beispiel) |
| musik_rechte_advisor | **80€** (Beispiel) |
→ Kein einheitlicher Ticketpreis fixiert!
---
### 🟡 PROBLEM 4: Negotiator noch nicht aktiviert
**KRITISCH:**
- Rathaus-Vertrag muss bis **28. Februar 2026** unterzeichnet sein
- Catering-Vertrag: März 2026
- Künstler-Buchungen: AprilMai 2026
- **Der Negotiator-Agent wurde noch NICHT eingesetzt** — aber er wird dringend gebraucht!
---
### 🟡 PROBLEM 5: Sponsoring-Ziel realistisch?
| Szenario | Sponsoring-Ziel | Erreichbarkeit |
|----------|-----------------|----------------|
| Worst Case | 80.000€ | Nur 1 Hauptsponsor |
| Expected | 250.000€ | 🟡 Optimistisch |
| Best Case | 350.000€ | 🔴 Sehr schwierig |
**Risikoanalyse:** Ohne Sponsoring ist das Event **negativ** (Deckungslücke -224k€).
---
## ✅ WAS LÄUFT GUT
### Sehr hohe inhaltliche Qualität
- Alle Agenten liefern fachlich exzellente Konzepte (9/10 durchschnittlich)
- Detailtreue ist hervorragend (z.B. Catering: Allergen-Management EU-LMIV-konform)
- Barrierefreiheit ist durchgehend berücksichtigt
### Vollständige Fachplanung vorhanden
- ✅ Detaillierter Event-Minutenplan (Program Manager)
- ✅ Steuerliche Roadmap (Tax Advisor)
- ✅ Musikrechte komplett geklärt (Musik-Advisor)
- ✅ Location-Checkliste mit MA 36 (Location Manager)
- ✅ Marketing-Strategie 6 Monate voraus (Social Media Manager)
### Diversity-Fokus konsequent
- Alle Agenten denken Barrierefreiheit mit
- Awards für marginalisierte Communities
- Mehrsprachigkeit geplant (Deutsch, Englisch, Türkisch, BKS)
---
## 🎯 TOP-PRIORITÄTEN (NÄCHSTE 2 WOCHEN)
### Sofort (Diese Woche!)
1. **Datum klären:** Ist es 1. März oder 5. September 2026?
- → Sofort an alle Agenten kommunizieren
- → Alle Timelines neu prüfen
2. **Negotiator aktivieren:**
- → Task für Vertragsverhandlungen Rathaus bis 28.2.
- → Catering-Vertrag vorbereiten
3. **Budget-Koordination starten:**
- → Kostenblock-Abstimmung (Catering: 280k vs. 420k€?)
- → Ticketpreis einheitlich festlegen (214€ oder 85120€?)
### Diese Woche (Parallel)
4. **Sponsoring-Akquise starten:**
- → Hauptsponsor-Gespräche
- → Getränke-Sponsor identifizieren
5. **Förderanträge einreichen:**
- → WienTourismus (bis 100k€)
- → MA 7 Kulturabteilung (bis 80k€)
6. **Agent-Abstimmung einleiten:**
- → Orchestrator moderiert Cross-Check
- → Jeder Agent prüft seine Schnittstellen
---
## 📊 AGENTEN-LEISTUNGSÜBERSICHT
### Top Performer (9/10)
- **catering_manager** — Beste Detailtreue
- **location_manager** — Vollständigste Planung
- **musik_rechte_advisor** — Rechtlich fundiert
- **researcher** — Webrecherche aktiv
- **social_media_manager** — Umfangreichstes Deliverable
- **tax_advisor** — Steuerlich kompetent
### Gute Leistung (78/10)
- **budget_manager** (8/10) — Guter Plan, aber Delegations-Tendenz
- **program_manager** (7/10) — Sehr detailliert, aber Timeout-Problem
### Noch nicht aktiv (3/10)
- **negotiator** — Kritisch! Sofort einsetzen
- **zusammenfasser** — Erst jetzt initialisiert
---
## 💡 NÄCHSTE SCHRITTE FÜR ZUSAMMENFASSER
1. ✅ Diese Zusammenfassung erstellen (gerade getan)
2. 🔜 Wöchentliche Status-Reports starten
3. 🔜 Critical-Path-Tracking (Deadlines, Meilensteine)
4. 🔜 Agent-Koordinations-Meetings dokumentieren
5. 🔜 Budget-Abweichungen flaggen
---
## 📋 VERWENDETE QUELLEN
- `diversityball_knowledge.md` — Master-Wissensdatenbank
- `eventplan_diversity_ball_2026.md` — Program Manager Deliverable
- `agent_performance_report_2026-02-21.md` — AR Manager Analyse
- `budget_plan.md` — Budget Manager Vollplan
- Weitere 8 Agenten-Deliverables (siehe Archive)
---
## ⏰ NÄCHSTE ZUSAMMENFASSUNG
**Geplant:** 28. Februar 2026 (nach Rathaus-Verhandlung)
**Focus-Themen:**
- Verhandlungs-Erfolg Rathaus?
- Budget-Abstimmung abgeschlossen?
- Sponsoring-Status?
- Negotiator-Aktivierung?
---
**FAZIT:** Das System hat beeindruckende Fachkonzepte geliefert. Der Event ist technisch machbar. **Aber ohne sofortige Koordination zwischen Agenten und Klärung fundamentaler Parameter (Datum, Budget, Ticketpreis) wird der Plan kollabieren.**
*Zusammenfassung erstellt: 21. Februar 2026, 15:00 Uhr*
*Zusammenfasser-Agent für Diversity-Ball Wien 2026*

66
app.py
View file

@ -2198,7 +2198,7 @@ def chat():
@app.route('/chat/send', methods=['POST'])
def chat_send():
"""Führt einen Agent aus und gibt die Antwort per Server-Sent Events zurück."""
"""Führt einen Agent aus und gibt die Antwort per Server-Sent Events LIVE zurück."""
data = request.get_json()
prompt = data.get('prompt', '').strip()
agent_key = data.get('agent', '').strip()
@ -2216,17 +2216,69 @@ def chat_send():
def generate():
# Agent-Info senden
yield f"data: {json.dumps({'type': 'agent_selected', 'agent': agent_name, 'agent_key': agent_key})}\n\n"
yield f"data: {json.dumps({'type': 'processing', 'message': f'{agent_name} arbeitet...'})}\n\n"
yield f"data: {json.dumps({'type': 'processing', 'message': f'{agent_name} denkt nach...'})}\n\n"
try:
# Agent ausführen (mit Memory und Work-Dir)
response = execute_agent_task(agent_key, prompt)
# Agent live ausführen mit Streaming
response_text = ""
# Antwort streamen
yield f"data: {json.dumps({'type': 'response', 'text': response})}\n\n"
# System-Prompt vorbereiten
system_prompt = get_agent_prompt(agent_key)
if not system_prompt:
yield f"data: {json.dumps({'type': 'error', 'message': f'Kein System-Prompt für Agent {agent_key}'})}\n\n"
return
dirs = ensure_agent_structure(agent_key)
work_dir = dirs['work_dir']
memory_summary = get_agent_memory_summary(agent_key)
kb_file = os.path.join(os.path.dirname(__file__), 'diversityball_knowledge.md')
team_summary = ""
if agent_key == 'orchestrator':
team_summary = "\n\n" + get_team_member_summary()
full_system = f"""{system_prompt}
## Deine Erinnerungen:
{memory_summary}{team_summary}
## Wissensdatenbank:
Die Wissensdatenbank liegt unter: {kb_file}
- Du hast Zugriff auf das Internet via WebFetch-Tool
- Dein Arbeitsverzeichnis: {work_dir}"""
combined_message = f"{full_system}\n\n---\n\n{prompt}"
model = get_agent_model(agent_key)
# OpenCode mit Streaming aufrufen
process = subprocess.Popen(
['opencode', 'run', '--model', model, '--format', 'json', combined_message],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
cwd=work_dir
)
# Live-Output lesen und streamen
for line in process.stdout:
try:
data_json = json.loads(line.strip())
if data_json.get('part', {}).get('type') == 'text':
chunk = data_json.get('part', {}).get('text', '')
response_text += chunk
# Chunk live an Frontend senden
yield f"data: {json.dumps({'type': 'chunk', 'text': chunk})}\n\n"
except (json.JSONDecodeError, KeyError):
pass
process.wait()
# Agent-Kommandos parsen
if response_text:
parse_agent_commands(agent_key, response_text)
# Erfolg melden
yield f"data: {json.dumps({'type': 'complete', 'message': '✓ Fertig', 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M'), 'response': response})}\n\n"
yield f"data: {json.dumps({'type': 'complete', 'message': '✓ Fertig', 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M'), 'response': response_text})}\n\n"
except Exception as e:
logger.error(f"[Chat] Fehler beim Ausführen von {agent_key}: {str(e)}")

View file

@ -178,6 +178,11 @@ function sendChat(event) {
agentBadge.textContent = currentAgent;
} else if (data.type === 'processing') {
chatStatus.innerHTML = `<span style="color:var(--info);">${data.message}</span>`;
} else if (data.type === 'chunk') {
// Live-Chunk empfangen - append to response
currentResponse += data.text;
responseText.textContent = currentResponse;
chatContainer.scrollTop = chatContainer.scrollHeight;
} else if (data.type === 'response') {
currentResponse = data.text;
responseText.textContent = currentResponse;