diff --git a/poweron/pricing.html b/poweron/pricing.html new file mode 100644 index 0000000..1622869 --- /dev/null +++ b/poweron/pricing.html @@ -0,0 +1,285 @@ + + + + + + AI Enterprise Suite - Preise + + + +
+
+

PowerOn

+

Integrierte AI Plattform für DeineDaten - E-Mail, Kalender & SharePoint Integration

+
+ +
+
+

Starter

+
CHF 1'190
+
pro Monat
+
Setup: CHF 7'900
+
    +
  • 1'000 AI-Abfragen/Monat
  • +
  • E-Mail Integration
  • +
  • Basis-Dashboard
  • +
  • E-Mail Support
  • +
  • Professional Services: CHF 195/h
  • +
  • Einsparung: <1 FTE/Jahr
  • +
+ +
+ + + +
+

Enterprise

+
CHF 7'990
+
pro Monat
+
Setup: CHF 19'900
+
    +
  • 50'000 AI-Abfragen/Monat
  • +
  • Google Workspace Integration
  • +
  • Dedicated Server Option
  • +
  • White-Label Lösung
  • +
  • 24/7 Support
  • +
  • Professional Services: CHF 195/h
  • +
  • Einsparung: 12+ FTE/Jahr
  • +
+ +
+
+ + +
+ + \ No newline at end of file diff --git a/test_neutralizer/__init__.py b/test_neutralizer/__init__.py new file mode 100644 index 0000000..f15889d --- /dev/null +++ b/test_neutralizer/__init__.py @@ -0,0 +1,14 @@ +""" +Test Neutralizer Package +""" + +from .neutralizer import DataAnonymizer, ChatDataProcessor, RegionalPatterns, SensitivePattern + +__version__ = '1.0.0' + +__all__ = [ + 'DataAnonymizer', + 'ChatDataProcessor', + 'RegionalPatterns', + 'SensitivePattern' +] \ No newline at end of file diff --git a/test_neutralizer/neutralizer.py b/test_neutralizer/neutralizer.py new file mode 100644 index 0000000..97e37bb --- /dev/null +++ b/test_neutralizer/neutralizer.py @@ -0,0 +1,201 @@ +""" +DSGVO-konformer Daten-Neutralisierer für KI-Agentensysteme +Unterstützt TXT, JSON, CSV, Excel und Word-Dateien +Mehrsprachig: DE, EN, FR, IT +""" + +import re +import json +import pandas as pd +import docx +from pathlib import Path +from typing import Dict, List, Tuple, Any, Union +from dataclasses import dataclass +import uuid +import logging +import sys + +# Add the parent directory to the Python path +sys.path.append(str(Path(__file__).parent.parent)) + +# Konfiguration für Logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +@dataclass +class SensitivePattern: + """Definiert ein Pattern für sensitive Daten""" + name: str + pattern: str + languages: List[str] + replacement_template: str + + +class DataAnonymizer: + """Hauptklasse für die Datenanonymisierung""" + + def __init__(self): + self.patterns = self._initialize_patterns() + self.anonymization_map = {} + + def _initialize_patterns(self) -> List[SensitivePattern]: + """Initialisiert die Regex-Pattern für verschiedene Sprachen""" + return [ + # E-Mail Adressen + SensitivePattern( + name="email", + pattern=r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', + languages=["de", "en", "fr", "it", "ch"], + replacement_template="EMAIL_{}" + ), + + # Telefonnummern (verschiedene Formate) + SensitivePattern( + name="phone", + pattern=r'(\+\d{1,3}[-.\s]?)?\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,9}', + languages=["de", "en", "fr", "it", "ch"], + replacement_template="PHONE_{}" + ), + + # Deutsche Telefonnummern spezifisch + SensitivePattern( + name="phone_de", + pattern=r'(\+49|0049|0)\s?(\d{2,5})\s?(\d{3,8})', + languages=["de"], + replacement_template="PHONE_DE_{}" + ), + + # Schweizer Telefonnummern + SensitivePattern( + name="phone_ch", + pattern=r'(\+41|0041|0)\s?(\d{2})\s?(\d{3})\s?(\d{2})\s?(\d{2})', + languages=["ch"], + replacement_template="PHONE_CH_{}" + ), + + # IBAN + SensitivePattern( + name="iban", + pattern=r'\b[A-Z]{2}\d{2}[A-Z0-9]{4}\d{7}([A-Z0-9]?){0,16}\b', + languages=["de", "en", "fr", "it", "ch"], + replacement_template="IBAN_{}" + ), + + # Kreditkartennummern + SensitivePattern( + name="credit_card", + pattern=r'\b(?:\d{4}[-\s]?){3}\d{4}\b', + languages=["de", "en", "fr", "it", "ch"], + replacement_template="CREDITCARD_{}" + ), + + # Deutsche Sozialversicherungsnummer + SensitivePattern( + name="social_security_de", + pattern=r'\b\d{2}\s?\d{6}\s?[A-Z]\s?\d{3}\b', + languages=["de"], + replacement_template="SSN_DE_{}" + ), + + # Schweizer AHV/AVS Nummer + SensitivePattern( + name="ahv_number", + pattern=r'\b(756\.\d{4}\.\d{4}\.\d{2}|756\s\d{4}\s\d{4}\s\d{2})\b', + languages=["ch"], + replacement_template="AHV_CH_{}" + ), + + # IP-Adressen + SensitivePattern( + name="ip_address", + pattern=r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b', + languages=["de", "en", "fr", "it", "ch"], + replacement_template="IP_{}" + ), + + # Postleitzahlen (Deutschland) + SensitivePattern( + name="postal_code_de", + pattern=r'\b\d{5}\b', + languages=["de"], + replacement_template="PLZ_{}" + ), + + # Schweizer Postleitzahlen + SensitivePattern( + name="postal_code_ch", + pattern=r'\b[1-9]\d{3}\b', + languages=["ch"], + replacement_template="PLZ_CH_{}" + ), + + # Namen (einfache Heuristik - kann erweitert werden) + SensitivePattern( + name="names", + pattern=r'\b(Herr|Frau|Mr\.|Mrs\.|Ms\.|Monsieur|Madame|Signore|Signora)\s+[A-ZÄÖÜ][a-zäöüß]+\s+[A-ZÄÖÜ][a-zäöüß]+\b', + languages=["de", "en", "fr", "it", "ch"], + replacement_template="NAME_{}" + ), + + # Adressen (vereinfacht) + SensitivePattern( + name="address", + pattern=r'\b[A-ZÄÖÜ][a-zäöüß]+straße\s+\d+[a-z]?\b|\b[A-ZÄÖÜ][a-zäöüß]+\s+Street\s+\d+\b|\b\d+\s+[A-ZÄÖÜ][a-zäöüß]+\s+Street\b', + languages=["de", "en", "ch"], + replacement_template="ADDRESS_{}" + ), + + # Schweizer UID/IDE Nummer + SensitivePattern( + name="uid_number", + pattern=r'\bCHE-\d{3}\.\d{3}\.\d{3}\b', + languages=["ch"], + replacement_template="UID_CH_{}" + ), + + # Schweizer Bankkontonummern (BC-Nummern) + SensitivePattern( + name="bank_account_ch", + pattern=r'\b\d{2}-\d{2,6}-\d{1}\b', + languages=["ch"], + replacement_template="BANK_CH_{}" + ), + ] + +def main(): + """Einfaches Beispiel für die Verwendung des Daten-Neutralisierers""" + anonymizer = DataAnonymizer() + + # Beispieltext + sample_text = """ + Sehr geehrte Frau Müller, + + vielen Dank für Ihre E-Mail an max.mustermann@beispiel.de. + Ihre Telefonnummer 030-12345678 wurde in unserem System hinterlegt. + Die Rechnung wird an folgende Adresse gesendet: + Musterstraße 123, 12345 Berlin + + Ihre IBAN: DE89 3704 0044 0532 0130 00 + + Mit freundlichen Grüßen + Max Mustermann + """ + + # Anonymisierung + anonymized_text, mapping = anonymizer.anonymize_text(sample_text, "de") + + print("Originaler Text:") + print(sample_text) + print("\n" + "="*50 + "\n") + + print("Anonymisierter Text:") + print(anonymized_text) + print("\n" + "="*50 + "\n") + + print("Mapping:") + for placeholder, original in mapping.items(): + print(f"{placeholder} -> {original}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/test_neutralizer/test_app.py b/test_neutralizer/test_app.py new file mode 100644 index 0000000..47a1a33 --- /dev/null +++ b/test_neutralizer/test_app.py @@ -0,0 +1,133 @@ +""" +Test-Anwendung für den Daten-Neutralisierer +Demonstriert die Funktionalität mit verschiedenen Testdaten +""" + +import os +import json +from pathlib import Path +import sys + +# Add the parent directory to the Python path +sys.path.append(str(Path(__file__).parent.parent)) + +# Import directly from the package +from test_neutralizer import DataAnonymizer, ChatDataProcessor, TEST_DATA + +def test_text_anonymization(): + """Testet die Text-Anonymisierung für verschiedene Sprachen""" + anonymizer = DataAnonymizer() + + for language in ["de", "ch", "fr", "it"]: + print(f"\n{'='*20} Test für Sprache: {language} {'='*20}") + + # Text anonymisieren + anonymized_text, mapping = anonymizer.anonymize_text(TEST_DATA[language], language) + + print("\nOriginaler Text:") + print(TEST_DATA[language]) + + print("\nAnonymisierter Text:") + print(anonymized_text) + + print("\nMapping:") + for placeholder, original in mapping.items(): + print(f"{placeholder} -> {original}") + + # Test der Deanonymisierung + ai_response = f"Basierend auf dem Text können wir sehen, dass NAME_1 an EMAIL_1 geschrieben hat." + restored_response = anonymizer.deanonymize_text(ai_response, mapping) + + print("\nKI-Antwort (anonymisiert):") + print(ai_response) + + print("\nKI-Antwort (deanonymisiert):") + print(restored_response) + +def test_file_processing(): + """Testet die Verarbeitung verschiedener Dateiformate""" + anonymizer = DataAnonymizer() + + # Temporäre Testdateien erstellen + test_dir = Path("test_files") + test_dir.mkdir(exist_ok=True) + + # JSON-Datei erstellen + json_path = test_dir / "test.json" + with open(json_path, "w", encoding="utf-8") as f: + json.dump(TEST_DATA["json"], f, indent=2) + + # CSV-Datei erstellen + csv_path = test_dir / "test.csv" + with open(csv_path, "w", encoding="utf-8") as f: + f.write(TEST_DATA["csv"]) + + # Dateien verarbeiten + print("\n" + "="*20 + " JSON-Verarbeitung " + "="*20) + json_result = anonymizer.process_file(str(json_path), "de") + print("\nAnonymisierte JSON-Daten:") + print(json.dumps(json_result["anonymized_content"], indent=2)) + + print("\n" + "="*20 + " CSV-Verarbeitung " + "="*20) + csv_result = anonymizer.process_file(str(csv_path), "de") + print("\nAnonymisierte CSV-Daten:") + for row in csv_result["anonymized_content"]: + print(row) + + # Aufräumen + json_path.unlink() + csv_path.unlink() + test_dir.rmdir() + +def test_chat_processor(): + """Testet die Chat-Integration""" + processor = ChatDataProcessor() + + # Temporäre Testdatei erstellen + test_dir = Path("test_files") + test_dir.mkdir(exist_ok=True) + + txt_path = test_dir / "test.txt" + with open(txt_path, "w", encoding="utf-8") as f: + f.write(TEST_DATA["de"]) + + # Chat-Nachricht verarbeiten + print("\n" + "="*20 + " Chat-Verarbeitung " + "="*20) + result = processor.process_chat_message("user123", str(txt_path), "de") + + print("\nSession-ID:", result["session_id"]) + print("\nAnonymisierte Daten:") + print(result["content"]) + + # KI-Antwort verarbeiten + ai_response = "Basierend auf den Daten können wir sehen, dass NAME_1 an EMAIL_1 geschrieben hat." + restored = processor.restore_ai_response(result["session_id"], ai_response) + + print("\nKI-Antwort (anonymisiert):") + print(ai_response) + + print("\nKI-Antwort (deanonymisiert):") + print(restored["restored_response"]) + + # Aufräumen + txt_path.unlink() + test_dir.rmdir() + processor.cleanup_session(result["session_id"]) + +def main(): + """Hauptfunktion für die Test-Ausführung""" + print("Starte Tests für den Daten-Neutralisierer...") + + # Text-Anonymisierung testen + test_text_anonymization() + + # Dateiverarbeitung testen + test_file_processing() + + # Chat-Integration testen + test_chat_processor() + + print("\nAlle Tests abgeschlossen!") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/test_neutralizer/test_data.py b/test_neutralizer/test_data.py new file mode 100644 index 0000000..035354a --- /dev/null +++ b/test_neutralizer/test_data.py @@ -0,0 +1,96 @@ +""" +Testdaten für den Daten-Neutralisierer +Enthält Beispieldaten für verschiedene Sprachen und Regionen +""" + +# Deutsche Testdaten +DE_TEST_DATA = """ +Sehr geehrte Frau Müller, + +vielen Dank für Ihre E-Mail an max.mustermann@beispiel.de. +Ihre Telefonnummer 030-12345678 wurde in unserem System hinterlegt. +Die Rechnung wird an folgende Adresse gesendet: +Musterstraße 123, 12345 Berlin + +Ihre IBAN: DE89 3704 0044 0532 0130 00 +Steuernummer: 123/456/78901 +Personalausweis: A12345678 + +Mit freundlichen Grüßen +Max Mustermann +""" + +# Schweizer Testdaten +CH_TEST_DATA = """ +Sehr geehrte Frau Weber, + +vielen Dank für Ihre E-Mail an maria.weber@example.ch. +Ihre Telefonnummer +41 44 123 45 67 wurde in unserem System hinterlegt. +Die Rechnung wird an folgende Adresse gesendet: +Bahnhofstrasse 1, 8001 Zürich + +Ihre AHV-Nummer: 756.1234.5678.90 +UID-Nummer: CHE-123.456.789 +Bankkonto: 01-234567-8 + +Mit freundlichen Grüssen +Maria Weber +""" + +# Französische Testdaten +FR_TEST_DATA = """ +Cher Monsieur Dupont, + +Merci pour votre email à jean.dupont@example.fr. +Votre numéro de téléphone +33 1 23 45 67 89 a été enregistré dans notre système. +La facture sera envoyée à l'adresse suivante: +123 Rue de Paris, 75001 Paris + +Votre numéro de sécurité sociale: 123456789012345 +IBAN: FR76 1234 5678 9012 3456 7890 123 + +Cordialement, +Jean Dupont +""" + +# Italienische Testdaten +IT_TEST_DATA = """ +Gentile Signora Rossi, + +Grazie per la sua email a anna.rossi@example.it. +Il suo numero di telefono +39 02 1234 5678 è stato registrato nel nostro sistema. +La fattura sarà inviata al seguente indirizzo: +Via Roma 123, 20100 Milano + +Il suo codice fiscale: ABCDEF12G34H567I +IBAN: IT60 X123 4567 8901 2345 6789 012 + +Cordiali saluti, +Anna Rossi +""" + +# Testdaten für verschiedene Dateiformate +TEST_JSON_DATA = { + "customer": { + "name": "Max Mustermann", + "email": "max.mustermann@beispiel.de", + "phone": "+49 30 12345678", + "address": "Musterstraße 123, 12345 Berlin", + "iban": "DE89 3704 0044 0532 0130 00" + } +} + +TEST_CSV_DATA = """name,email,phone,address,iban +Max Mustermann,max.mustermann@beispiel.de,+49 30 12345678,Musterstraße 123 12345 Berlin,DE89 3704 0044 0532 0130 00 +Maria Weber,maria.weber@example.ch,+41 44 123 45 67,Bahnhofstrasse 1 8001 Zürich,CH93 0076 7000 E529 0767 9 +""" + +# Dictionary mit allen Testdaten +TEST_DATA = { + "de": DE_TEST_DATA, + "ch": CH_TEST_DATA, + "fr": FR_TEST_DATA, + "it": IT_TEST_DATA, + "json": TEST_JSON_DATA, + "csv": TEST_CSV_DATA +} \ No newline at end of file