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:
parent
f6ad727bf0
commit
eaccbe770a
1 changed files with 50 additions and 40 deletions
74
app.py
74
app.py
|
|
@ -548,10 +548,22 @@ Question: [Deine Frage]
|
|||
Context: [Kontext]
|
||||
@END
|
||||
|
||||
## Agent-Kollaboration:
|
||||
Du kannst mit anderen Agents kommunizieren! Verwende folgendes Format:
|
||||
## Verfügbare Tools (Claude Code Built-ins):
|
||||
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
|
||||
Question: [Deine Frage]
|
||||
Context: [Warum brauchst du diese Info?]
|
||||
|
|
@ -570,25 +582,26 @@ Skills: [Benötigte Fähigkeiten]
|
|||
Reason: [Warum wird dieser Agent gebraucht?]
|
||||
@END
|
||||
|
||||
**Team-Member per Email kontaktieren:**
|
||||
**Email versenden:**
|
||||
@SEND_EMAIL
|
||||
To: [Email-Adresse des Team-Members]
|
||||
To: [Email-Adresse]
|
||||
Subject: [Betreff]
|
||||
Body: [Nachricht]
|
||||
@END
|
||||
|
||||
**Team-Member per Telegram kontaktieren:**
|
||||
**Telegram-Nachricht senden:**
|
||||
@SEND_TELEGRAM
|
||||
TelegramID: [Telegram-ID des Team-Members]
|
||||
TelegramID: [Numerische Telegram-ID aus den Team-Member-Daten]
|
||||
Message: [Nachricht]
|
||||
@END
|
||||
|
||||
**Team-Member Informationen aktualisieren:**
|
||||
**Team-Member-Daten aktualisieren:**
|
||||
@UPDATE_TEAM_MEMBER
|
||||
Identifier: [Email oder Name des Team-Members]
|
||||
Name: [Neuer Name] (optional)
|
||||
Role: [Neue Rolle] (optional)
|
||||
Responsibilities: [Neue Verantwortlichkeiten] (optional)
|
||||
TelegramID: [Telegram-ID] (optional)
|
||||
TelegramID: [Telegram-ID als Zahl] (optional)
|
||||
Phone: [Telefon] (optional)
|
||||
@END
|
||||
|
||||
|
|
@ -600,14 +613,8 @@ Responsibilities: [Verantwortlichkeiten]
|
|||
Email: [Email-Adresse]
|
||||
@END
|
||||
|
||||
Der Orchestrator kümmert sich um die Zuweisung und Kommunikation!
|
||||
|
||||
## Wichtig:
|
||||
- Du hast Zugriff auf das Internet via WebFetch-Tool - nutze es aktiv!
|
||||
- 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
|
||||
- Arbeitsverzeichnis: {work_dir} – speichere alle Dateien dort mit absolutem Pfad
|
||||
- Liefere immer eine vollständige, direkt verwertbare Antwort
|
||||
{extra_context}"""
|
||||
|
||||
|
|
@ -1094,8 +1101,9 @@ Bitte entscheide ob dieser Agent erstellt werden soll.""",
|
|||
logger.error(f"[AgentCmd] Email-Fehler: {message}")
|
||||
|
||||
# SEND_TELEGRAM: Orchestrator sendet Telegram-Nachricht
|
||||
# Format: TelegramID: <numerische ID> oder Name/Email (wird dann in DB nachgeschlagen)
|
||||
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,
|
||||
re.DOTALL
|
||||
)
|
||||
|
|
@ -1106,42 +1114,44 @@ Bitte entscheide ob dieser Agent erstellt werden soll.""",
|
|||
# Telegram-Integration (wenn aktiviert)
|
||||
if TELEGRAM_CONFIG.get('bot_token') and TELEGRAM_CONFIG.get('telegram_bot'):
|
||||
try:
|
||||
# Finde Chat-ID für Recipient (basierend auf Team-Member)
|
||||
# Direkte numerische ID oder Name/Email → DB-Lookup
|
||||
chat_id = None
|
||||
if recipient_clean.lstrip('-').isdigit():
|
||||
chat_id = int(recipient_clean)
|
||||
else:
|
||||
con = sqlite3.connect(EMAIL_JOURNAL_DB)
|
||||
result = con.execute(
|
||||
"SELECT telegram_chat_id FROM team_members WHERE name = ? OR email = ?",
|
||||
"SELECT telegram_id FROM team_members WHERE name = ? OR email = ?",
|
||||
(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}")
|
||||
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}")
|
||||
logger.warning(f"[AgentCmd] Keine Telegram Chat-ID für '{recipient_clean}'")
|
||||
except Exception as e:
|
||||
logger.error(f"[AgentCmd] Telegram-Fehler: {str(e)}")
|
||||
else:
|
||||
logger.warning("[AgentCmd] Telegram nicht konfiguriert")
|
||||
|
||||
# ADD_TEAM_MEMBER: Füge neues Team-Mitglied hinzu
|
||||
# Format: Name / Role / Responsibilities / Email (Reihenfolge wie im System-Prompt)
|
||||
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,
|
||||
re.DOTALL
|
||||
)
|
||||
for name, email, role, resp in add_member_requests:
|
||||
for name, role, resp, email in add_member_requests:
|
||||
name_clean = name.strip()
|
||||
email_clean = email.strip()
|
||||
role_clean = role.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:
|
||||
logger.info(f"[AgentCmd] Team-Member hinzugefügt: {name_clean} ({role_clean})")
|
||||
else:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue