llm mail integration

This commit is contained in:
Christoph K.
2026-03-19 21:46:12 +01:00
parent fdc7a8588d
commit 0e7aa3e7f2
19 changed files with 1707 additions and 306 deletions

110
cmd/mailtest/main.go Normal file
View File

@@ -0,0 +1,110 @@
// mailtest IMAP-Verbindungstest und LLM-Zusammenfassungstest
//
// Flags:
//
// -llm-only Überspringt IMAP, testet LLM mit eingebetteten Testdaten
// -unread Holt nur ungelesene Emails (statt letzte 5)
package main
import (
"flag"
"fmt"
"log"
"log/slog"
"os"
"my-brain-importer/internal/agents/tool/email"
"my-brain-importer/internal/config"
)
// testEmails sind eingebettete Beispieldaten für den LLM-Test ohne IMAP.
var testEmails = []email.Message{
{Subject: "KRITISCH: Server down in Produktion", From: "monitoring@company.com", Date: "2026-03-19 09:00"},
{Subject: "Meeting morgen 10 Uhr Projektreview Q1", From: "chef@company.com", Date: "2026-03-19 08:30"},
{Subject: "Rechnung Nr. 2026-042 fällig bis 25.03.", From: "buchhaltung@lieferant.de", Date: "2026-03-18 14:00"},
{Subject: "Re: Urlaubsantrag genehmigt", From: "hr@company.com", Date: "2026-03-18 11:00"},
{Subject: "Newsletter: Neue Features in Go 1.26", From: "newsletter@golangweekly.com", Date: "2026-03-17 18:00"},
{Subject: "Amazon: Ihre Bestellung wurde versendet", From: "no-reply@amazon.de", Date: "2026-03-17 10:00"},
{Subject: "Erinnerung: Zahnarzttermin 21.03. um 15:00", From: "praxis@zahnarzt.de", Date: "2026-03-16 09:00"},
}
func main() {
llmOnly := flag.Bool("llm-only", false, "Überspringe IMAP, teste LLM mit eingebetteten Testdaten")
unread := flag.Bool("unread", false, "Hole nur ungelesene Emails")
verbose := flag.Bool("v", false, "Verbose Logging (Debug-Level)")
flag.Parse()
config.LoadConfig()
// Logging konfigurieren
logLevel := slog.LevelInfo
if *verbose {
logLevel = slog.LevelDebug
}
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: logLevel})))
if *llmOnly {
runLLMTest()
return
}
cfg := config.Cfg.Email
fmt.Printf("🔌 Verbinde mit %s:%d (TLS=%v StartTLS=%v) als %s ...\n",
cfg.Host, cfg.Port, cfg.TLS, cfg.StartTLS, cfg.User)
cl, err := email.Connect()
if err != nil {
log.Fatalf("❌ Verbindung fehlgeschlagen: %v", err)
}
defer cl.Close()
fmt.Println("✅ Login erfolgreich!")
var msgs []email.Message
if *unread {
fmt.Println("📥 Hole ungelesene Emails...")
msgs, err = cl.FetchUnread()
} else {
fmt.Println("📥 Hole die letzten 5 Emails...")
msgs, err = cl.FetchRecent(5)
}
if err != nil {
log.Fatalf("❌ Fetch fehlgeschlagen: %v", err)
}
if len(msgs) == 0 {
fmt.Println("📭 Keine Emails gefunden.")
return
}
for i, m := range msgs {
fmt.Printf("[%d] %s | Von: %s | %s\n", i+1, m.Date, m.From, m.Subject)
}
fmt.Printf("\n🤖 Teste LLM-Zusammenfassung (Modell: %s)...\n", effectiveModel())
summary, err := email.Summarize()
if err != nil {
log.Fatalf("❌ Fehler: %v", err)
}
fmt.Println(summary)
}
func runLLMTest() {
fmt.Printf("🧪 LLM-Testmodus mit %d eingebetteten Testdaten\n", len(testEmails))
fmt.Printf(" Modell: %s\n\n", effectiveModel())
for i, m := range testEmails {
fmt.Printf("[%d] %s | %s | %s\n", i+1, m.Date, m.From, m.Subject)
}
fmt.Println("\n🤖 Starte LLM-Zusammenfassung...")
result, err := email.SummarizeMessages(testEmails, "Fasse diese Emails zusammen. Priorisiere nach Dringlichkeit und Wichtigkeit.")
if err != nil {
log.Fatalf("❌ LLM-Fehler: %v", err)
}
fmt.Println("\n--- Ergebnis ---")
fmt.Println(result)
}
func effectiveModel() string {
if config.Cfg.Email.Model != "" {
return config.Cfg.Email.Model
}
return config.Cfg.Chat.Model
}