"""E-Mail Tools (IMAP).""" from core import config, mail_client TOOLS = [ { "type": "function", "function": { "name": "get_mail_summary", "description": "E-Mail Zusammenfassung: Letzte Mails, Absender, Betreff + wichtige Mails der letzten 48h.", "parameters": {"type": "object", "properties": {}, "required": []}, }, }, { "type": "function", "function": { "name": "get_mail_count", "description": "Anzahl E-Mails: gesamt und ungelesen im Postfach.", "parameters": {"type": "object", "properties": {}, "required": []}, }, }, { "type": "function", "function": { "name": "search_mail", "description": "Volltextsuche in E-Mails nach Betreff/Absender.", "parameters": { "type": "object", "properties": { "query": {"type": "string", "description": "Suchbegriff"}, "days": {"type": "number", "description": "Zeitraum in Tagen (default: 30)", "default": 30} }, "required": ["query"], }, }, }, { "type": "function", "function": { "name": "get_mails_by_period", "description": "E-Mails eines bestimmten Zeitraums auflisten. Nutze dieses Tool wenn der User nach Mails der letzten X Tage/Stunden fragt, oder nach heutigen Mails.", "parameters": { "type": "object", "properties": { "hours": {"type": "number", "description": "Zeitraum in Stunden. 24 = heute, 168 = 7 Tage, 720 = 30 Tage.", "default": 24} }, "required": [], }, }, }, { "type": "function", "function": { "name": "get_smart_mail_digest", "description": "KI-Zusammenfassung: klassifiziert Mails in wichtig/aktion/info/newsletter/spam. Nutze bei 'wichtige Mails', 'was ist relevant', 'persoenliche Mails'.", "parameters": { "type": "object", "properties": { "hours": {"type": "number", "description": "Zeitraum in Stunden. 24 = heute, 168 = 7 Tage.", "default": 24} }, "required": [], }, }, }, ] SYSTEM_PROMPT_EXTRA = """E-Mail Tools: - 'Welche Mails heute/diese Woche' → get_mails_by_period (hours=24 bzw 168) - 'Wichtige/persoenliche Mails' → get_smart_mail_digest (klassifiziert per KI) - 'Wie viele Mails' (gesamt) → get_mail_count - Suche nach Absender/Betreff → search_mail WICHTIG: get_mail_count zeigt NUR die Gesamtzahl im Postfach, NICHT einen Zeitraum. Fuer Zeitraum-Fragen IMMER get_mails_by_period oder get_smart_mail_digest nutzen. """ def _cfg(): cfg = config.parse_config() mail_client.init(cfg) return cfg def handle_get_mail_summary(**kw): cfg = _cfg() return mail_client.format_summary() def handle_get_mail_count(**kw): _cfg() counts = mail_client.get_mail_count() if "error" in counts: return f"Mail-Fehler: {counts['error']}" return f"E-Mails im Postfach: {counts['total']} gesamt, {counts['unread']} ungelesen ({counts['account']})\n(Das ist der gesamte Posteingang, nicht ein bestimmter Zeitraum.)" def handle_search_mail(query="", days=30, **kw): _cfg() results = mail_client.search_mail(query, days=days) return mail_client.format_search_results(results) def handle_get_mails_by_period(hours=24, **kw): """Mails eines Zeitraums auflisten.""" from datetime import datetime, timedelta _cfg() m = mail_client._connect() if not m: return "IMAP-Verbindung fehlgeschlagen" try: m.select("INBOX", readonly=True) since = (datetime.now() - timedelta(hours=hours)).strftime("%d-%b-%Y") _, data = m.search(None, f'(SINCE "{since}")') ids = data[0].split() if data[0] else [] mails = [] for mid in ids: _, msg_data = m.fetch(mid, "(BODY.PEEK[HEADER])") parsed = mail_client._parse_mail(msg_data) if parsed: mails.append(parsed) mails.reverse() except Exception as e: return f"Fehler: {e}" finally: m.logout() if not mails: return f"Keine Mails in den letzten {hours} Stunden." days_label = f"{hours}h" if hours < 48 else f"{hours // 24} Tagen" lines = [f"{len(mails)} Mail(s) in den letzten {days_label}:\n"] for i, r in enumerate(mails, 1): lines.append(f"{i:2d}. {r['date_str']} | {r['from'][:35]}") lines.append(f" -> {r['subject'][:70]}") return "\n".join(lines) def handle_get_smart_mail_digest(hours=24, **kw): cfg = _cfg() api_key = cfg.api_keys.get("openrouter_key", "") digest = mail_client.get_smart_digest(hours=hours, api_key=api_key) return mail_client.format_smart_digest(digest) HANDLERS = { "get_mail_summary": handle_get_mail_summary, "get_mail_count": handle_get_mail_count, "search_mail": handle_search_mail, "get_mails_by_period": handle_get_mails_by_period, "get_smart_mail_digest": handle_get_smart_mail_digest, }