From f13860f38d48efc72b2ed371ca927709bb9688cf Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 21 Feb 2026 19:04:03 +0000 Subject: [PATCH] fix: Chat streaming uses same full prompt as execute_agent_task MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- app.py | 56 +++++++++++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/app.py b/app.py index a8b59d4..0886451 100644 --- a/app.py +++ b/app.py @@ -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