fix: Correct all agent command parsers and document Claude Code tools in system prompt

- @SEND_TELEGRAM: fix regex To: -> TelegramID:, fix DB lookup telegram_chat_id -> telegram_id,
  use send_telegram_message() (sync HTTP) instead of asyncio.run(), support direct numeric IDs
- @ADD_TEAM_MEMBER: fix field order in regex (Name/Role/Responsibilities/Email) to match prompt
- System prompt: document all Claude Code built-in tools (WebFetch, Read, Write, Edit,
  Glob, Grep, Bash) so agents know what is available, clean up command documentation
This commit is contained in:
eric 2026-02-21 18:56:52 +00:00
parent f6ad727bf0
commit eaccbe770a

86
app.py
View file

@ -548,10 +548,22 @@ Question: [Deine Frage]
Context: [Kontext] Context: [Kontext]
@END @END
## Agent-Kollaboration: ## Verfügbare Tools (Claude Code Built-ins):
Du kannst mit anderen Agents kommunizieren! Verwende folgendes Format: Du läufst als Claude Code Agent und hast folgende Tools direkt verfügbar:
- **WebFetch** Webseiten abrufen und analysieren (URLs fetchen, Recherche)
- **Read** Dateien lesen (absoluter Pfad)
- **Write** Dateien schreiben/erstellen
- **Edit** Bestehende Dateien bearbeiten
- **Glob** Dateien nach Muster suchen (z.B. `**/*.pdf`)
- **Grep** Inhalte in Dateien durchsuchen (Regex)
- **Bash** Shell-Befehle ausführen (z.B. Berechnungen, Dateioperationen)
**Frage an Orchestrator stellen (er delegiert an passenden Agent):** Nutze diese Tools aktiv für Recherche, Dateiverarbeitung und Berechnungen!
## Frankenbot-Kommandos (werden vom System verarbeitet):
Diese Kommandos musst du exakt so formatieren sie werden nach deiner Antwort automatisch ausgeführt:
**Frage an Orchestrator / Sub-Task delegieren:**
@ASK_ORCHESTRATOR @ASK_ORCHESTRATOR
Question: [Deine Frage] Question: [Deine Frage]
Context: [Warum brauchst du diese Info?] Context: [Warum brauchst du diese Info?]
@ -570,25 +582,26 @@ Skills: [Benötigte Fähigkeiten]
Reason: [Warum wird dieser Agent gebraucht?] Reason: [Warum wird dieser Agent gebraucht?]
@END @END
**Team-Member per Email kontaktieren:** **Email versenden:**
@SEND_EMAIL @SEND_EMAIL
To: [Email-Adresse des Team-Members] To: [Email-Adresse]
Subject: [Betreff] Subject: [Betreff]
Body: [Nachricht] Body: [Nachricht]
@END @END
**Team-Member per Telegram kontaktieren:** **Telegram-Nachricht senden:**
@SEND_TELEGRAM @SEND_TELEGRAM
TelegramID: [Telegram-ID des Team-Members] TelegramID: [Numerische Telegram-ID aus den Team-Member-Daten]
Message: [Nachricht] Message: [Nachricht]
@END @END
**Team-Member Informationen aktualisieren:** **Team-Member-Daten aktualisieren:**
@UPDATE_TEAM_MEMBER @UPDATE_TEAM_MEMBER
Identifier: [Email oder Name des Team-Members] Identifier: [Email oder Name des Team-Members]
Name: [Neuer Name] (optional)
Role: [Neue Rolle] (optional) Role: [Neue Rolle] (optional)
Responsibilities: [Neue Verantwortlichkeiten] (optional) Responsibilities: [Neue Verantwortlichkeiten] (optional)
TelegramID: [Telegram-ID] (optional) TelegramID: [Telegram-ID als Zahl] (optional)
Phone: [Telefon] (optional) Phone: [Telefon] (optional)
@END @END
@ -600,14 +613,8 @@ Responsibilities: [Verantwortlichkeiten]
Email: [Email-Adresse] Email: [Email-Adresse]
@END @END
Der Orchestrator kümmert sich um die Zuweisung und Kommunikation!
## Wichtig: ## Wichtig:
- Du hast Zugriff auf das Internet via WebFetch-Tool - nutze es aktiv! - Arbeitsverzeichnis: {work_dir} speichere alle Dateien dort mit absolutem Pfad
- Du kannst Emails versenden - nutze send_email wenn beauftragt
- Dein Arbeitsverzeichnis: {work_dir}
- Speichere ALLE erstellten Dateien in diesem Verzeichnis!
- Verwende absolute Pfade für Dateien: {work_dir}/dateiname.ext
- Liefere immer eine vollständige, direkt verwertbare Antwort - Liefere immer eine vollständige, direkt verwertbare Antwort
{extra_context}""" {extra_context}"""
@ -1094,8 +1101,9 @@ Bitte entscheide ob dieser Agent erstellt werden soll.""",
logger.error(f"[AgentCmd] Email-Fehler: {message}") logger.error(f"[AgentCmd] Email-Fehler: {message}")
# SEND_TELEGRAM: Orchestrator sendet Telegram-Nachricht # SEND_TELEGRAM: Orchestrator sendet Telegram-Nachricht
# Format: TelegramID: <numerische ID> oder Name/Email (wird dann in DB nachgeschlagen)
send_telegram_requests = re.findall( send_telegram_requests = re.findall(
r'@SEND_TELEGRAM\s*\nTo:\s*([^\n]+)\s*\nMessage:\s*(.*?)@END', r'@SEND_TELEGRAM\s*\nTelegramID:\s*([^\n]+)\s*\nMessage:\s*(.*?)@END',
response_text, response_text,
re.DOTALL re.DOTALL
) )
@ -1106,42 +1114,44 @@ Bitte entscheide ob dieser Agent erstellt werden soll.""",
# Telegram-Integration (wenn aktiviert) # Telegram-Integration (wenn aktiviert)
if TELEGRAM_CONFIG.get('bot_token') and TELEGRAM_CONFIG.get('telegram_bot'): if TELEGRAM_CONFIG.get('bot_token') and TELEGRAM_CONFIG.get('telegram_bot'):
try: try:
# Finde Chat-ID für Recipient (basierend auf Team-Member) # Direkte numerische ID oder Name/Email → DB-Lookup
con = sqlite3.connect(EMAIL_JOURNAL_DB) chat_id = None
result = con.execute( if recipient_clean.lstrip('-').isdigit():
"SELECT telegram_chat_id FROM team_members WHERE name = ? OR email = ?", chat_id = int(recipient_clean)
(recipient_clean, recipient_clean)
).fetchone()
con.close()
if result and result[0]:
chat_id = result[0]
import asyncio
asyncio.run(TELEGRAM_CONFIG['telegram_bot'].bot.send_message(
chat_id=chat_id,
text=message_clean
))
logger.info(f"[AgentCmd] Telegram gesendet an {recipient_clean}")
else: else:
logger.warning(f"[AgentCmd] Keine Telegram Chat-ID für {recipient_clean}") con = sqlite3.connect(EMAIL_JOURNAL_DB)
result = con.execute(
"SELECT telegram_id FROM team_members WHERE name = ? OR email = ?",
(recipient_clean, recipient_clean)
).fetchone()
con.close()
if result and result[0]:
chat_id = int(result[0])
if chat_id:
send_telegram_message(chat_id, message_clean)
logger.info(f"[AgentCmd] Telegram gesendet an {recipient_clean} (chat_id={chat_id})")
else:
logger.warning(f"[AgentCmd] Keine Telegram Chat-ID für '{recipient_clean}'")
except Exception as e: except Exception as e:
logger.error(f"[AgentCmd] Telegram-Fehler: {str(e)}") logger.error(f"[AgentCmd] Telegram-Fehler: {str(e)}")
else: else:
logger.warning("[AgentCmd] Telegram nicht konfiguriert") logger.warning("[AgentCmd] Telegram nicht konfiguriert")
# ADD_TEAM_MEMBER: Füge neues Team-Mitglied hinzu # ADD_TEAM_MEMBER: Füge neues Team-Mitglied hinzu
# Format: Name / Role / Responsibilities / Email (Reihenfolge wie im System-Prompt)
add_member_requests = re.findall( add_member_requests = re.findall(
r'@ADD_TEAM_MEMBER\s*\nName:\s*([^\n]+)\s*\nEmail:\s*([^\n]+)\s*\nRole:\s*([^\n]+)\s*\nResponsibilities:\s*(.*?)@END', r'@ADD_TEAM_MEMBER\s*\nName:\s*([^\n]+)\s*\nRole:\s*([^\n]+)\s*\nResponsibilities:\s*([^\n]+)\s*\nEmail:\s*(.*?)@END',
response_text, response_text,
re.DOTALL re.DOTALL
) )
for name, email, role, resp in add_member_requests: for name, role, resp, email in add_member_requests:
name_clean = name.strip() name_clean = name.strip()
email_clean = email.strip()
role_clean = role.strip() role_clean = role.strip()
resp_clean = resp.strip() resp_clean = resp.strip()
email_clean = email.strip()
success = add_team_member(name_clean, role_clean, email_clean, resp_clean) success = add_team_member(name_clean, role_clean, resp_clean, email_clean)
if success: if success:
logger.info(f"[AgentCmd] Team-Member hinzugefügt: {name_clean} ({role_clean})") logger.info(f"[AgentCmd] Team-Member hinzugefügt: {name_clean} ({role_clean})")
else: else: