# -*- coding: utf-8 -*- """ Konfigurationskonstanten und Prompt-Strings für KG-Diktat Desktop. """ import os import sys from pathlib import Path _APPDATA_FOLDER_NAME = "AZA Desktop" _writable_data_dir_cache = None def get_writable_data_dir() -> str: """Writable directory for ALL user config/data files. Frozen (installed to Program Files): %APPDATA%/AZA Desktop Dev (running from source): directory containing this file """ global _writable_data_dir_cache if _writable_data_dir_cache is not None: return _writable_data_dir_cache if getattr(sys, "frozen", False): appdata = os.environ.get("APPDATA") if appdata: d = os.path.join(appdata, _APPDATA_FOLDER_NAME) else: d = os.path.join(str(Path.home()), "AppData", "Roaming", _APPDATA_FOLDER_NAME) os.makedirs(d, exist_ok=True) _writable_data_dir_cache = d else: _writable_data_dir_cache = os.path.dirname(os.path.abspath(__file__)) return _writable_data_dir_cache # ─── Modelle ─── TRANSCRIBE_MODEL = "gpt-4o-mini-transcribe" DEFAULT_SUMMARY_MODEL = "gpt-5.2" ALLOWED_SUMMARY_MODELS = ["gpt-5.2", "gpt-5-mini", "gpt-5-nano"] MODEL_LABELS = { "gpt-5.2": 'schnell ("teures" KI)', "gpt-5-mini": "mittleres KI", "gpt-5-nano": "langsameres (günstigeres KI)", } # ─── Config-Dateinamen ─── CONFIG_FILENAME = "kg_diktat_config.txt" WINDOW_CONFIG_FILENAME = "kg_diktat_window.txt" SIGNATURE_CONFIG_FILENAME = "kg_diktat_signature.txt" KORREKTUREN_CONFIG_FILENAME = "kg_diktat_korrekturen.json" ABLAGE_BASE_DIR = "kg_diktat_ablage" ABLAGE_SUBFOLDERS = ("KG", "Briefe", "Rezepte", "Kostengutsprachen", "Diktat", "Transkript") ABLAGE_LABELS = { "KG": "KG", "Briefe": "Brief", "Rezepte": "Rezept", "Kostengutsprachen": "KOGU", "Diktat": "Diktat", "Transkript": "Transkript", } PRUEFEN_WINDOW_CONFIG_FILENAME = "kg_diktat_pruefen_window.txt" ORDNER_WINDOW_CONFIG_FILENAME = "kg_diktat_ordner_window.txt" TEXT_WINDOW_CONFIG_FILENAME = "kg_diktat_text_window.txt" DIKTAT_WINDOW_CONFIG_FILENAME = "kg_diktat_diktat_window.txt" DISKUSSION_WINDOW_CONFIG_FILENAME = "kg_diktat_diskussion_window.txt" SETTINGS_WINDOW_CONFIG_FILENAME = "kg_diktat_settings_window.txt" TEXTBLOECKE_CONFIG_FILENAME = "kg_diktat_textbloecke.json" TEMPLATES_CONFIG_FILENAME = "kg_diktat_templates.txt" OP_BERICHT_TEMPLATE_CONFIG_FILENAME = "kg_diktat_op_bericht_template.txt" ARZTBRIEF_VORLAGE_CONFIG_FILENAME = "kg_diktat_arztbrief_vorlage.txt" TODO_CONFIG_FILENAME = "kg_diktat_todos.json" TODO_WINDOW_CONFIG_FILENAME = "kg_diktat_todo_window.txt" TODO_INBOX_CONFIG_FILENAME = "kg_diktat_todo_inbox.json" TODO_SETTINGS_CONFIG_FILENAME = "kg_diktat_todo_settings.json" NOTES_CONFIG_FILENAME = "kg_diktat_notes.json" CHECKLIST_CONFIG_FILENAME = "kg_diktat_checklists.json" USER_PROFILE_CONFIG_FILENAME = "kg_diktat_user_profile.json" OPACITY_CONFIG_FILENAME = "kg_diktat_opacity.txt" AUTOTEXT_CONFIG_FILENAME = "kg_diktat_autotext.json" FONT_SCALE_CONFIG_FILENAME = "kg_diktat_font_scale.txt" BUTTON_SCALE_CONFIG_FILENAME = "kg_diktat_button_scale.txt" TOKEN_USAGE_CONFIG_FILENAME = "kg_diktat_token_usage.txt" KG_DETAIL_LEVEL_CONFIG_FILENAME = "kg_diktat_detail_level.txt" SOAP_SECTION_LEVELS_CONFIG_FILENAME = "kg_diktat_soap_section_levels.json" FONT_SIZES_CONFIG_FILENAME = "text_font_sizes.json" PANED_POSITIONS_CONFIG_FILENAME = "paned_positions.json" KOGU_GRUSS_CONFIG_FILENAME = "kg_diktat_kogu_gruss.txt" KOGU_TEMPLATES_CONFIG_FILENAME = "kg_diktat_kogu_templates.txt" DISKUSSION_VORLAGE_CONFIG_FILENAME = "kg_diktat_diskussion_vorlage.txt" BRIEF_STYLE_PROFILES_FILENAME = "kg_diktat_brief_style_profiles.json" # ─── Opacity / Font / Button Scale Defaults ─── DEFAULT_OPACITY = 1.0 MIN_OPACITY = 0.4 FIXED_FONT_SCALE = 0.6 FIXED_BUTTON_SCALE = 1.4 DEFAULT_FONT_SCALE = FIXED_FONT_SCALE MIN_FONT_SCALE = FIXED_FONT_SCALE MAX_FONT_SCALE = FIXED_FONT_SCALE DEFAULT_BUTTON_SCALE = FIXED_BUTTON_SCALE MIN_BUTTON_SCALE = FIXED_BUTTON_SCALE MAX_BUTTON_SCALE = FIXED_BUTTON_SCALE OPTIMAL_FONT_SCALE = FIXED_FONT_SCALE OPTIMAL_BUTTON_SCALE = FIXED_BUTTON_SCALE # ─── Fenster-Defaults ─── DEFAULT_WINDOW_WIDTH = 850 DEFAULT_WINDOW_HEIGHT = 920 # ─── SOAP ─── _SOAP_SECTIONS = ("A", "S", "O", "B", "D", "T", "P") _SOAP_LABELS = {"A": "Anamnese", "S": "Subjektiv", "O": "Objektiv", "B": "Beurteilung", "D": "Diagnose", "T": "Therapie", "P": "Procedere"} SOAP_ORDER_CONFIG_FILENAME = "kg_diktat_soap_order.json" SOAP_VISIBILITY_CONFIG_FILENAME = "kg_diktat_soap_visibility.json" SOAP_PRESETS_CONFIG_FILENAME = "kg_diktat_soap_presets.json" DEFAULT_SOAP_ORDER = ["A", "S", "O", "B", "D", "T", "P"] NUM_SOAP_PRESETS = 3 # ─── Brief-Abschnitts-Profile ─── BRIEF_PRESETS_CONFIG_FILENAME = "kg_diktat_brief_presets.json" NUM_BRIEF_PRESETS = 3 BRIEF_PROFILE_DEFAULTS = [ { "name": "Arztbrief", "order": ["DI", "AN", "BF", "BE", "TP"], "labels": { "DI": "Diagnosen", "AN": "Anamnese", "BF": "Befunde", "BE": "Beurteilung", "TP": "Therapie / Procedere", }, "visibility": {"DI": True, "AN": True, "BF": True, "BE": True, "TP": True}, }, { "name": "Spitalarztbrief", "order": ["DI", "ZF", "EP", "AE", "BF", "VL", "TA", "MA", "PE"], "labels": { "DI": "Diagnosen", "ZF": "Zusammenfassung", "EP": "Epikrise", "AE": "Anamnese bei Eintritt", "BF": "Befunde", "VL": "Verlauf", "TA": "Therapie im Aufenthalt", "MA": "Medikation bei Austritt", "PE": "Procedere / Empfehlungen", }, "visibility": {k: True for k in ["DI", "ZF", "EP", "AE", "BF", "VL", "TA", "MA", "PE"]}, }, { "name": "Einfach", "order": ["DI", "BF", "BE", "TH"], "labels": { "DI": "Diagnose", "BF": "Befund", "BE": "Beurteilung", "TH": "Therapie", }, "visibility": {"DI": True, "BF": True, "BE": True, "TH": True}, }, ] # ─── KOGU Gruss ─── KOGU_GRUSS_OPTIONS = [ "Mit freundlichen Grüssen", "Freundliche Grüsse", "Mit freundlichen Grüssen und besten Wünschen", "Hochachtungsvoll", ] # ─── Korrekturen Defaults ─── _DEFAULT_KORREKTUREN = { "diagnosen": { "gesamte lassen": "Xanthelasma", "Gesamtlassen": "Xanthelasma", "Xanthel Asma": "Xanthelasma", "Xantel Asma": "Xanthelasma", "gesamte Lasma": "Xanthelasma", "Aktin ische": "Aktinische", "Kerato Akanthom": "Keratoakanthom", "Basalzell Karzinom": "Basalzellkarzinom", "Platte Nepithel": "Plattenepithel", }, "medikamente": {}, } # ─── Arztbrief Vorlage Default ─── ARZTBRIEF_VORLAGE_DEFAULT = """Reihenfolge: 1. Diagnose, 2. Anlass, 3. Befunde, 4. Empfehlung, Therapie Ordne den Arztbrief zwingend nach obiger Reihenfolge. Jeder Abschnitt mit eigener Überschrift (z. B. Diagnose:, Anlass:, Befunde:, Therapie:). Fehlende Abschnitte weglassen. Keine Sternchen (*). Diagnosen mit ICD-10-Code beibehalten.""" # ─── KG-Kommentar-Keywords ─── COMMENT_KEYWORDS = ( "ärztlich zu prüfen", "wirkstoff nicht genannt", "kontrolle", "vorsicht", "warnung", "weiterverordnung", "überprüfung", "blutkontrolle", "leberwerte", "red flag", "interaktion", "nebenwirkung", "kontraindikation", "aufklärung", ) # ─── Cloud-Sync ─── _SUPABASE_URL = "https://cqbqkejdlxesxjdtkpfr.supabase.co" _SUPABASE_ANON_KEY = "sb_publishable_r8YMw01FF-fYD9vHLnz7FQ_d8mhpVVQ" # ─── Aktivierung / Ablauf ─── APP_HARD_EXPIRY = "2027-03-31" APP_TRIAL_DAYS = 21 ACTIVATION_CONFIG_FILENAME = "kg_diktat_activation.json" ACTIVATION_HMAC_SECRET = "AZA-Praxis-2026-xK9mQ7" # ─── Token-Guthaben / Kapazität ─── DEFAULT_TOKEN_QUOTA = 500_000 SOFT_LOCK_THRESHOLD = 5_000 AVG_TOKENS_PER_REPORT = 3_000 # ─── Launcher ─── LAUNCHER_CONFIG_FILENAME = "kg_diktat_launcher.json" LAUNCHER_MODULES = ["ki", "kg", "notizen", "translator", "medwork_chat", "praxis_chat"] LAUNCHER_MODULE_LABELS = { "ki": "KI-Assistent", "kg": "Krankengeschichte", "notizen": "Audio-Notizen", "translator": "Übersetzer", "medwork_chat": "Ärzte-Netzwerk", "praxis_chat": "Praxis-Intern", } # ─── Globale Liste aller offenen Fenster für Skalierung ─── _ALL_WINDOWS = []