Die MailHelper-API bietet eine umfassende Schnittstelle zur Integration in andere Systeme und zur Automatisierung von Mail-Verarbeitungsaufgaben. Die API ist modular aufgebaut und deckt alle Kernfunktionen der Anwendung ab.
Die zentrale Klasse zur Koordination aller Komponenten.
from src.core.engine import MailHelperEngine
# Engine initialisieren
engine = MailHelperEngine()
# Mit Konfiguration initialisieren
config = {
"llm": {
"provider": "ollama",
"model": "qwen2.5:latest",
"temperature": 0.7
},
"exchange": {
"autodiscover": True,
"access_type": "delegate"
}
}
engine = MailHelperEngine(config=config)Initialisiert alle Komponenten der Anwendung.
engine.initialize_all()Rückgabewert: bool - True bei Erfolg, False bei Fehler
Gibt den aktuellen Status der Anwendung zurück.
status = engine.get_status()Rückgabewert: Dict[str, Any] - Statusinformationen
{
"status": "initialized",
"components": {
"mail_service": "connected",
"llm_client": "ready",
"clustering_engine": "ready",
"storage_manager": "ready"
},
"last_updated": "2024-01-01T12:00:00Z"
}Gibt den Status einzelner Komponenten zurück.
component_status = engine.get_component_status()Rückgabewert: Dict[str, str] - Status der einzelnen Komponenten
Aktualisiert die Konfiguration der Anwendung.
engine.update_config({
"llm": {
"temperature": 0.5
},
"frontend": {
"port": 8080
}
})Parameter:
config_dict(Dict[str, Any]): Konfigurations-Dictionary
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Fährt die Anwendung ordnungsgemäß herunter.
engine.shutdown()Rückgabewert: None
Konfigurationsverwaltung mit Pydantic-Validierung.
Hauptkonfigurationsklasse.
from src.core.config import CoreAppConfig
config = CoreAppConfig(
theme="monochrome",
title="MailHelper",
port=7860,
share=False,
height=800,
width=1200
)Attribute:
theme(str): UI-Themetitle(str): Anwendungstitelport(int): Port für Web-Interfaceshare(bool): Public Share aktivierenheight(int): Fensterhöhewidth(int): Fensterbreite
Exchange-Server-Konfiguration.
from src.core.config import ExchangeConfig
exchange_config = ExchangeConfig(
server="outlook.office365.com",
username="user@company.com",
password="password",
use_ssl=True,
timeout=30,
autodiscover=True,
access_type="delegate"
)Attribute:
server(str): Exchange-Server-Adresseusername(str): Benutzernamepassword(str): Passwortuse_ssl(bool): SSL verwendentimeout(int): Timeout in Sekundenautodiscover(bool): Autodiscover verwendenaccess_type(str): Zugriffstyp
LLM-Konfiguration.
from src.core.config import LLMConfig
llm_config = LLMConfig(
provider="ollama",
base_url="http://localhost:11434/v1",
model="qwen2.5:latest",
temperature=0.7,
api_key="",
max_tokens=1000
)Attribute:
provider(str): LLM-Providerbase_url(str): Basis-URL des LLM-Serversmodel(str): Modellnametemperature(float): Temperatur für Zufälligkeitapi_key(str): API-Schlüsselmax_tokens(int): Maximale Token-Anzahl
Speicher-Konfiguration.
from src.core.config import StorageConfig
storage_config = StorageConfig(
storage_type="file",
storage_path="storage",
base_path="storage",
backup_enabled=True,
backup_interval=24,
encryption_enabled=False,
compression_enabled=True,
retention_days=30
)Attribute:
storage_type(str): Speichertypstorage_path(str): Speicherpfadbase_path(str): Basispfadbackup_enabled(bool): Backup aktiviertbackup_interval(int): Backup-Intervall in Stundenencryption_enabled(bool): Verschlüsselung aktiviertcompression_enabled(bool): Kompression aktiviertretention_days(int): Aufbewahrungsfrist in Tagen
Clustering-Konfiguration.
from src.core.config import ClusteringConfig
clustering_config = ClusteringConfig(
algorithm="kmeans",
n_clusters=5,
min_cluster_size=3,
max_cluster_size=100,
similarity_threshold=0.7,
enable_clustering=True,
clustering_interval=24,
auto_clustering=True,
subject_weight=0.4,
body_weight=0.6
)Attribute:
algorithm(str): Clustering-Algorithmusn_clusters(int): Anzahl der Clustermin_cluster_size(int): Minimale Cluster-Größemax_cluster_size(int): Maximale Cluster-Größesimilarity_threshold(float): Ähnlichkeitsschwelleenable_clustering(bool): Clustering aktiviertclustering_interval(int): Clustering-Intervall in Stundenauto_clustering(bool): Automatisches Clusteringsubject_weight(float): Gewichtung des Betreffsbody_weight(float): Gewichtung des Inhalts
Plugin-Konfiguration.
from src.core.config import PluginConfig
plugin_config = PluginConfig(
plugin_dir="plugins",
enabled_plugins=[],
disabled_plugins=[],
auto_load=True,
plugin_timeout=30
)Attribute:
plugin_dir(str): Plugin-Verzeichnisenabled_plugins(List[str]): Aktivierte Pluginsdisabled_plugins(List[str]): Deaktivierte Pluginsauto_load(bool): Automatisches Laden von Pluginsplugin_timeout(int): Plugin-Timeout in Sekunden
Ausnahmeklassen für Fehlerbehandlung.
Basisklasse für alle Anwendungsausnahmen.
from src.core.exceptions import MailHelperException
try:
# Code, der eine Ausnahme auslösen kann
pass
except MailHelperException as e:
print(f"MailHelper Fehler: {e}")Konfigurationsfehler.
from src.core.exceptions import ConfigurationError
try:
# Konfigurationsfehler
pass
except ConfigurationError as e:
print(f"Konfigurationsfehler: {e}")Authentifizierungsfehler.
from src.core.exceptions import AuthenticationError
try:
# Authentifizierungsfehler
pass
except AuthenticationError as e:
print(f"Authentifizierungsfehler: {e}")Exchange-Verbindungsfehler.
from src.core.exceptions import ExchangeConnectionError
try:
# Exchange-Verbindungsfehler
pass
except ExchangeConnectionError as e:
print(f"Exchange-Verbindungsfehler: {e}")Mail-Verarbeitungsfehler.
from src.core.exceptions import MailProcessingError
try:
# Mail-Verarbeitungsfehler
pass
except MailProcessingError as e:
print(f"Mail-Verarbeitungsfehler: {e}")Clustering-Fehler.
from src.core.exceptions import ClusteringError
try:
# Clustering-Fehler
pass
except ClusteringError as e:
print(f"Clustering-Fehler: {e}")LLM-Verarbeitungsfehler.
from src.core.exceptions import LLMError
try:
# LLM-Verarbeitungsfehler
pass
except LLMError as e:
print(f"LLM-Fehler: {e}")Speicherfehler.
from src.core.exceptions import StorageError
try:
# Speicherfehler
pass
except StorageError as e:
print(f"Speicherfehler: {e}")Plugin-Fehler.
from src.core.exceptions import PluginError
try:
# Plugin-Fehler
pass
except PluginError as e:
print(f"Plugin-Fehler: {e}")Verbindung zu Exchange-Servern.
from src.exchange.connector import ExchangeConnector
connector = ExchangeConnector(
server="outlook.office365.com",
username="user@company.com",
password="password",
autodiscover=True,
access_type="delegate"
)Stellt Verbindung zum Exchange-Server her.
connector.connect()Rückgabewert: bool - True bei Erfolg, False bei Fehler
Trennt die Verbindung zum Exchange-Server.
connector.disconnect()Rückgabewert: None
Ruft alle Ordner ab.
folders = connector.get_folders()Rückgabewert: List[MailFolder] - Liste der Ordner
Ruft Mails aus einem Ordner ab.
mails = connector.get_mails(folder, limit=50)Parameter:
folder(MailFolder): Zielordnerlimit(int, optional): Limit der Mails
Rückgabewert: MailCollection - Sammlung von Mails
Sucht Mails basierend auf Kriterien.
from src.exchange.models import MailSearchCriteria
criteria = MailSearchCriteria(
subject_contains="Angebot",
date_from=datetime.now() - timedelta(days=7),
date_to=datetime.now(),
sender_contains="company.com"
)
results = connector.search_mails(criteria)Parameter:
criteria(MailSearchCriteria): Suchkriterien
Rückgabewert: MailCollection - Suchergebnisse
Ruft eine Mail per ID ab.
mail = connector.get_mail_by_id(mail_id)Parameter:
mail_id(str): Mail-ID
Rückgabewert: MailItem - Mail-Objekt
Sendet eine Mail.
from src.exchange.models import MailItem
mail = MailItem(
subject="Test Mail",
body="Dies ist eine Test-Mail",
recipients=["recipient@company.com"]
)
connector.send_mail(mail)Parameter:
mail(MailItem): Zu sendende Mail
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Verschiebt eine Mail in einen anderen Ordner.
connector.move_mail(mail, target_folder)Parameter:
mail(MailItem): Zu verschiebende Mailtarget_folder(MailFolder): Zielordner
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Löscht eine Mail.
connector.delete_mail(mail)Parameter:
mail(MailItem): Zu löschende Mail
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Datenmodell für E-Mails.
id(str): Eindeutige IDsubject(str): Betreffbody(str): Mail-Inhaltsender(Dict[str, str]): Absender-Informationenrecipients(List[Dict[str, str]]): Empfängercc(List[Dict[str, str]]): CC-Empfängerbcc(List[Dict[str, str]]): BCC-Empfängerdatetime_received(datetime): Empfangsdatumdatetime_sent(datetime): Sendedatumattachments(List[Dict[str, Any]]): Anhängestatus(str): Status (z.B. "unread", "read")folder(MailFolder): Ordnerthread_id(str): Thread-IDimportance(str): Wichtigkeit ("low", "normal", "high")sensitivity(str): Vertraulichkeit ("normal", "personal", "private", "confidential")
Konvertiert das Mail-Objekt in ein Dictionary.
mail_dict = mail.to_dict()Rückgabewert: Dict[str, Any] - Mail-Daten als Dictionary
Erstellt ein Mail-Objekt aus einem Dictionary.
mail = MailItem.from_dict(mail_dict)Parameter:
data(Dict[str, Any]): Mail-Daten
Rückgabewert: MailItem - Mail-Objekt
Datenmodell für Mail-Ordner.
id(str): Eindeutige IDname(str): Ordnernamedisplay_name(str): Anzeigenametotal_count(int): Gesamtzahl der Mailsunread_count(int): Anzahl ungelesener Mailsfolder_path(str): Pfad zum Ordnerparent_folder(MailFolder): Übergeordneter Ordnerchild_folders(List[MailFolder]): Unterordneris_search_folder(bool): Ist ein Suchordner
Konvertiert das Ordner-Objekt in ein Dictionary.
folder_dict = folder.to_dict()Rückgabewert: Dict[str, Any] - Ordner-Daten als Dictionary
Erstellt ein Ordner-Objekt aus einem Dictionary.
folder = MailFolder.from_dict(folder_dict)Parameter:
data(Dict[str, Any]): Ordner-Daten
Rückgabewert: MailFolder - Ordner-Objekt
Suchkriterien für Mail-Abfragen.
subject_contains(str, optional): Betreff enthältsubject_equals(str, optional): Betreff gleichbody_contains(str, optional): Körper enthältsender_contains(str, optional): Absender enthältsender_equals(str, optional): Absender gleichrecipient_contains(str, optional): Empfänger enthältrecipient_equals(str, optional): Empfänger gleichdate_from(datetime, optional): Datum abdate_to(datetime, optional): Datum bishas_attachments(bool, optional): Hat Anhängeattachment_contains(str, optional): Anhang enthältstatus(str, optional): Statusimportance(str, optional): Wichtigkeitsensitivity(str, optional): Vertraulichkeitfolder_id(str, optional): Ordner-IDlimit(int, optional): Limitoffset(int, optional): Offset
Konvertiert die Suchkriterien in ein Dictionary.
criteria_dict = criteria.to_dict()Rückgabewert: Dict[str, Any] - Suchkriterien als Dictionary
Erstellt Suchkriterien aus einem Dictionary.
criteria = MailSearchCriteria.from_dict(criteria_dict)Parameter:
data(Dict[str, Any]): Suchkriterien
Rückgabewert: MailSearchCriteria - Suchkriterien-Objekt
OpenAI-kompatibler Client für verschiedene LLM-Provider.
from src.llm.client import LLMClient, LLMConfig
config = LLMConfig(
provider="ollama",
base_url="http://localhost:11434/v1",
model="qwen2.5:latest",
temperature=0.7
)
client = LLMClient(config)Sendet Chat-Nachrichten und erhält eine Antwort.
messages = [
{"role": "system", "content": "Du bist ein hilfreicher Assistent."},
{"role": "user", "content": "Was ist Künstliche Intelligenz?"}
]
response = client.chat_completion(messages, temperature=0.5)Parameter:
messages(List[Dict[str, str]]): Nachrichtentemperature(float, optional): Temperaturmax_tokens(int, optional): Maximale Tokentop_p(float, optional): Top-P-Wertfrequency_penalty(float, optional): Frequency Penaltypresence_penalty(float, optional): Presence Penalty
Rückgabewert: Dict[str, Any] - API-Antwort
Analysiert Text mit verschiedenen Analyse-Typen.
analysis = client.analyze_text(
text="Dies ist ein Test-Text zur Sentiment-Analyse.",
analysis_type="sentiment"
)Parameter:
text(str): Zu analysierender Textanalysis_type(str): Analyse-Typ ("sentiment", "keywords", "categories", "urgency")
Rückgabewert: Dict[str, Any] - Analyse-Ergebnis
Generiert eine Antwort basierend auf einem Prompt.
response = client.generate_response(
prompt="Erstelle eine professionelle Antwort auf folgende Anfrage:",
context="Der Kunde möchte ein Angebot erhalten.",
tone="professionell",
max_length=200
)Parameter:
prompt(str): Prompt-Textcontext(str, optional): Kontext-Texttone(str, optional): Ton ("professionell", "freundlich", "formell", "locker")max_length(int, optional): Maximale Länge
Rückgabewert: str - Generierte Antwort
Fasst Text zusammen.
summary = client.summarize_text(
text="Langer Text, der zusammengefasst werden soll...",
max_length=200
)Parameter:
text(str): Zusammenzufassender Textmax_length(int, optional): Maximale Länge der Zusammenfassung
Rückgabewert: str - Zusammenfassung
Extrahiert Schlüsselwörter aus Text.
keywords = client.extract_keywords(
text="Text, aus dem Schlüsselwörter extrahiert werden sollen...",
max_keywords=10
)Parameter:
text(str): Text zur Schlüsselwort-Extraktionmax_keywords(int, optional): Maximale Anzahl von Schlüsselwörtern
Rückgabewert: List[str] - Liste von Schlüsselwörtern
Kategorisiert Text.
categories = client.categorize_text(
text="Text, der kategorisiert werden soll..."
)Parameter:
text(str): Zu kategorisierender Text
Rückgabewert: List[str] - Liste von Kategorien
Übersetzt Text.
translation = client.translate_text(
text="Text, der übersetzt werden soll...",
target_language="en",
source_language="de"
)Parameter:
text(str): Zu übersetzender Texttarget_language(str): Zielsprachesource_language(str, optional): Quellsprache
Rückgabewert: str - Übersetzter Text
Überprüft Grammatik.
grammar_check = client.check_grammar(
text="Text, dessen Grammatik überprüft werden soll..."
)Parameter:
text(str): Zu überprüfender Text
Rückgabewert: Dict[str, Any] - Grammatik-Prüfungsergebnis
Ruft Informationen über das aktuelle Modell ab.
model_info = client.get_model_info()Rückgabewert: Dict[str, Any] - Modell-Informationen
Testet die Verbindung zum LLM-Server.
is_connected = client.test_connection()Rückgabewert: bool - True bei Erfolg, False bei Fehler
Verwaltung von Prompts für verschiedene Szenarien.
from src.llm.prompts import PromptManager
prompt_manager = PromptManager()Fügt einen neuen Prompt hinzu.
prompt_manager.add_prompt(
category="response_generation",
name="professional_email",
template="Erstelle eine professionelle Antwort auf: {content}"
)Parameter:
category(str): Kategorie des Promptsname(str): Name des Promptstemplate(str): Prompt-Vorlage
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Ruft einen Prompt ab.
prompt = prompt_manager.get_prompt(
category="response_generation",
name="professional_email",
content="Der Kunde möchte ein Angebot erhalten."
)Parameter:
category(str): Kategorie des Promptsname(str): Name des Prompts**kwargs: Variablen für die Prompt-Vorlage
Rückgabewert: str - Generierter Prompt
Listet alle Prompts auf.
prompts = prompt_manager.list_prompts(category="response_generation")Parameter:
category(str, optional): Kategorie zum Filtern
Rückgabewert: List[Dict[str, str]] - Liste von Prompts
Entfernt einen Prompt.
prompt_manager.remove_prompt(
category="response_generation",
name="professional_email"
)Parameter:
category(str): Kategorie des Promptsname(str): Name des Prompts
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Aktualisiert einen bestehenden Prompt.
prompt_manager.update_prompt(
category="response_generation",
name="professional_email",
template="Aktualisierte Prompt-Vorlage: {content}"
)Parameter:
category(str): Kategorie des Promptsname(str): Name des Promptstemplate(str): Neue Prompt-Vorlage
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Konfiguration für LLM-Parameter.
provider(str): LLM-Provider ("ollama", "openai", "onnx")base_url(str): Basis-URL des LLM-Serversmodel(str): Modellnametemperature(float): Temperatur für Zufälligkeitapi_key(str): API-Schlüsselmax_tokens(int): Maximale Token-Anzahltimeout(int): Timeout in Sekundenretry_attempts(int): Wiederholungsversucheretry_delay(float): Verzögerung zwischen Wiederholungen
Konvertiert die Konfiguration in ein Dictionary.
config_dict = llm_config.to_dict()Rückgabewert: Dict[str, Any] - Konfiguration als Dictionary
Erstellt eine Konfiguration aus einem Dictionary.
llm_config = LLMConfig.from_dict(config_dict)Parameter:
data(Dict[str, Any]): Konfigurationsdaten
Rückgabewert: LLMConfig - Konfigurationsobjekt
Validiert die Konfiguration.
is_valid = llm_config.validate()Rückgabewert: bool - True bei gültiger Konfiguration, False bei ungültiger
Ruft die Provider-Klasse ab.
provider_class = llm_config.get_provider_class()Rückgabewert: Type - Provider-Klasse
Implementiert fortschrittliche Mail-Clustering-Algorithmen.
from src.clustering.engine import ClusteringEngine, ClusterConfig
config = ClusterConfig(
num_clusters=10,
subject_weight=0.3,
body_weight=0.7,
min_cluster_size=2,
max_cluster_size=100,
algorithm="kmeans"
)
engine = ClusteringEngine(config)Führt Clustering auf Mails durch.
clusters = engine.cluster_mails(mails)Parameter:
mails(List[MailItem]): Liste von Mails
Rückgabewert: Dict[str, Any] - Cluster-Ergebnisse
{
"clusters": [
{
"id": "cluster_1",
"mails": [MailItem, MailItem, ...],
"keywords": ["angebot", "preis", "konditionen"],
"centroid": [0.1, 0.2, 0.3, ...],
"size": 15,
"similarity": 0.85
}
],
"statistics": {
"total_mails": 100,
"total_clusters": 10,
"average_cluster_size": 10,
"silhouette_score": 0.75
}
}Optimiert die Anzahl der Cluster.
optimal_count = engine.optimize_cluster_count(mails, max_clusters=20)Parameter:
mails(List[MailItem]): Liste von Mailsmax_clusters(int): Maximale Anzahl von Clustern
Rückgabewert: int - Optimale Cluster-Anzahl
Ruft Cluster-Statistiken ab.
stats = engine.get_cluster_statistics()Rückgabewert: Dict[str, Any] - Cluster-Statistiken
Ruft einen Cluster per ID ab.
cluster = engine.get_cluster_by_id("cluster_1")Parameter:
cluster_id(str): Cluster-ID
Rückgabewert: Dict[str, Any] - Cluster-Informationen
Findet ähnliche Mails.
similar_mails = engine.get_similar_mails(mail, threshold=0.8)Parameter:
mail(MailItem): Referenz-Mailthreshold(float): Ähnlichkeitsschwelle
Rückgabewert: List[MailItem] - Liste ähnlicher Mails
Exportiert Cluster-Daten.
export_data = engine.export_cluster_data("cluster_1", format="json")Parameter:
cluster_id(str): Cluster-IDformat(str): Export-Format ("json", "csv", "excel")
Rückgabewert: str - Exportierte Daten
Importiert Cluster-Daten.
engine.import_cluster_data(export_data)Parameter:
data(str): Zu importierende Daten
Rückgabewert: bool - True bei Erfolg, False bei Fehler
Löscht alle Cluster.
engine.clear_clusters()Rückgabewert: None
Konfiguration für Clustering-Parameter.
num_clusters(int): Anzahl der Clustersubject_weight(float): Gewichtung des Betreffsbody_weight(float): Gewichtung des Inhaltsmin_cluster_size(int): Minimale Cluster-Größemax_cluster_size(int): Maximale Cluster-Größealgorithm(str): Clustering-Algorithmus ("kmeans", "lda", "hierarchical")similarity_threshold(float): Ähnlichkeitsschwellemax_features(int): Maximale Anzahl von Featuresrandom_state(int): Zufallszustandn_init(int): Anzahl der Initialisierungenmax_iter(int): Maximale Iterationentol(float): Toleranz für Konvergenz
Konvertiert die Konfiguration in ein Dictionary.
config_dict = cluster_config.to_dict()Rückgabewert: Dict[str, Any] - Konfiguration als Dictionary
Erstellt eine Konfiguration aus einem Dictionary.
cluster_config = ClusterConfig.from_dict(config_dict)Parameter:
data(Dict[str, Any]): Konfigurationsdaten
Rückgabewert: ClusterConfig - Konfigurationsobjekt
Validiert die Konfiguration.
is_valid = cluster_config.validate()Rückgabewert: bool - True bei gültiger Konfiguration, False bei ungültiger
Textvorverarbeitung für Mails.
from src.clustering.preprocessing import Preprocessor
preprocessor = Preprocessor()Verarbeitet eine einzelne Mail.
processed_mail = preprocessor.preprocess_mail(mail, subject_weight=0.3, body_weight=0.7)Parameter:
mail(MailItem): Zu verarbeitende Mailsubject_weight(float): Gewichtung des Betreffsbody_weight(float): Gewichtung des Inhalts
Rückgabewert: Dict[str, Any] - Verarbeitete Mail-Daten
Verarbeitet eine Liste von Mails.
processed_mails = preprocessor.preprocess_mails(mails, subject_weight=0.3, body_weight=0.7)Parameter:
mails(List[MailItem]): Liste von Mailssubject_weight(float): Gewichtung des Betreffsbody_weight(float): Gewichtung des Inhalts
Rückgabewert: List[List[str]] - Liste von verarbeiteten Mails
Tokenisiert Text.
tokens = preprocessor.tokenize_text("Dies ist ein Test-Text.")Parameter:
text(str): Zu tokenisierender Text
Rückgabewert: List[str] - Liste von Tokens
Entfernt Stop-Wörter.
filtered_tokens = preprocessor.remove_stopwords(tokens)Parameter:
tokens(List[str]): Liste von Tokens
Rückgabewert: List[str] - Gefilterte Tokens
Führt Wortstamm-Reduktion durch.
stemmed_tokens = preprocessor.stem_tokens(tokens)Parameter:
tokens(List[str]): Liste von Tokens
Rückgabewert: List[str] - Gestemmte Tokens
Extrahiert Schlüsselwörter.
keywords = preprocessor.extract_keywords("Text, aus dem Schlüsselwörter extrahiert werden sollen...", max_keywords=10)Parameter:
text(str): Text zur Schlüsselwort-Extraktionmax_keywords(int): Maximale Anzahl von Schlüsselwörtern
Rückgabewert: List[str] - Liste von