Files
ai-agent/cmd/mailtest/main.go
2026-03-19 21:46:12 +01:00

111 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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
}