fix: Chat streaming uses same full prompt as execute_agent_task

The /chat/send SSE stream was building a stripped-down system prompt
without any Frankenbot command documentation (@CREATE_SUBTASK, @SEND_EMAIL,
@SEND_TELEGRAM etc.), so agents never knew to emit these commands during
web chat sessions — tasks were never created, emails never sent.

Extract build_agent_prompt() as shared function used by both
execute_agent_task() and the streaming chat generator.
This commit is contained in:
eric 2026-02-21 19:04:03 +00:00
parent eaccbe770a
commit f13860f38d

54
app.py
View file

@ -503,32 +503,25 @@ def get_agent_prompt(agent_key):
return prompt_content
def execute_agent_task(agent_key, user_prompt, extra_context=""):
def build_agent_prompt(agent_key, user_prompt, extra_context=""):
"""
Führt einen echten Agenten-Task via opencode aus.
System-Prompt wird als --prompt übergeben, User-Prompt als Message.
Baut den vollständigen kombinierten Prompt (System + User) für einen Agenten.
Wird sowohl von execute_agent_task() als auch vom Streaming-Chat verwendet,
damit beide exakt denselben Prompt inkl. aller Kommandos erhalten.
"""
system_prompt = get_agent_prompt(agent_key)
if not system_prompt:
return f"⚠️ Kein System-Prompt für Agent '{agent_key}' gefunden."
return None
# Agent-Struktur sicherstellen
dirs = ensure_agent_structure(agent_key)
work_dir = dirs['work_dir']
# Memory-Zusammenfassung laden
memory_summary = get_agent_memory_summary(agent_key)
# Wissensdatenbank-Pfad (im Orchestrator-Ordner)
kb_file = os.path.join(os.path.dirname(__file__), 'agents', 'orchestrator', 'knowledge', 'diversityball_knowledge.md')
# Team-Members laden (nur für Orchestrator)
team_summary = ""
if agent_key == 'orchestrator':
team_summary = "\n\n" + get_team_member_summary()
# System-Prompt = Agent-Rolle + Memory + Team + Kommandos (OHNE große Wissensdatenbank!)
full_system = f"""{system_prompt}
## Deine Erinnerungen:
@ -618,9 +611,20 @@ Email: [Email-Adresse]
- Liefere immer eine vollständige, direkt verwertbare Antwort
{extra_context}"""
# System-Prompt + User-Prompt zusammen als eine Message
# (--prompt flag gibt leere Antwort, daher alles in eine Message)
combined_message = f"{full_system}\n\n---\n\n{user_prompt}"
return f"{full_system}\n\n---\n\n{user_prompt}"
def execute_agent_task(agent_key, user_prompt, extra_context=""):
"""
Führt einen echten Agenten-Task via opencode aus.
"""
combined_message = build_agent_prompt(agent_key, user_prompt, extra_context)
if not combined_message:
return f"⚠️ Kein System-Prompt für Agent '{agent_key}' gefunden."
dirs = ensure_agent_structure(agent_key)
work_dir = dirs['work_dir']
# Modell aus Konfiguration holen
model = get_agent_model(agent_key)
@ -2382,24 +2386,10 @@ def chat_send():
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__), 'agents', 'orchestrator', 'knowledge', '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}"
# Vollständigen System-Prompt über build_agent_prompt() bauen —
# identisch zu execute_agent_task(), damit alle Kommandos dokumentiert sind
combined_message = build_agent_prompt(agent_key, prompt)
model = get_agent_model(agent_key)
# OpenCode mit Streaming aufrufen