/* Claude-powered letter generation + format detection for pediatric surgery */ // Pediatric-surgery eponyms and terms that MedGemma must preserve verbatim. // Having them in the prompt anchors the model so it doesn't "correct" them // or translate them to English equivalents. const GERMAN_GLOSSARY = `Eponyme und Fachbegriffe — MÜSSEN wortwörtlich erhalten bleiben: Rovsing-Zeichen, Blumberg-Zeichen (kontralateraler Loslassschmerz), Psoas-Zeichen, Murphy-Zeichen, McBurney-Punkt, Lanz-Punkt, Bragard-Zeichen, Lasègue-Zeichen, Courvoisier-Zeichen, Finkelstein-Test, Ortolani-Test, Barlow-Test, Appendizitis, Invagination, Leistenhernie, Nabelhernie, Hydrozele, Phimose, Pylorusstenose, Morbus Hirschsprung, Analfissur, Hodentorsion, Varikozele, Kryptorchismus, Laparoskopie, Herniotomie, Orchidopexie, Zirkumzision.`; const LANG_RULES = `Sprache: - Schreibe AUSSCHLIESSLICH auf Deutsch. Keine englischen Wörter im Fließtext. - Anglizismen nur wenn sie im Deutschen als Fachbegriff etabliert sind (z. B. SOAP, CT, MRT, Ultraschall-Scan). Nie übersetzen: "Assessment", "Plan" etc. im SOAP bleiben. - Medizinische Eponyme (Rovsing, Blumberg, Murphy, McBurney, Lanz, ...) IMMER wörtlich übernehmen — nicht lautmalerisch "korrigieren". - Deutsche Rechtschreibung (Umlaute ä/ö/ü, ß), keine Substitutionen wie "ae" statt "ä".`; const LETTER_FORMATS = { arztbrief: { key: "arztbrief", name: "Arztbrief", desc: "Klassischer Entlass-/Überweisungsbrief", structure: `Briefkopf (Praxis/Klinik) Anrede (Sehr geehrte Frau Kollegin / Sehr geehrter Herr Kollege,) Patient: Name, Geburtsdatum, Aufnahme-/Behandlungsdatum Diagnose(n) Anamnese Klinischer Untersuchungsbefund Diagnostik (Labor, Bildgebung) Therapie / Verlauf Procedere / Empfehlung Mit freundlichen kollegialen Grüßen`, }, konsult: { key: "konsult", name: "Konsultationsbericht", desc: "Kurze Notiz zum Ambulanzbesuch", structure: `Patient: Name, Geburtsdatum, Konsultationsdatum Vorstellungsgrund Anamnese (kurz) Befund Beurteilung Procedere`, }, soap: { key: "soap", name: "SOAP-Notiz", desc: "Subjective, Objective, Assessment, Plan", structure: `S (Subjective): subjektive Angaben Eltern/Kind O (Objective): Untersuchungsbefund, Vitalparameter, Diagnostik A (Assessment): Arbeitsdiagnose, Differentialdiagnosen P (Plan): Therapie, Kontrollen, Aufklärung`, }, opbericht: { key: "opbericht", name: "Operationsbericht", desc: "Dokumentation eines Eingriffs", structure: `Patient: Name, Geburtsdatum Operationsdatum, Operateur, Assistenz, Anästhesie Präoperative Diagnose Indikation Operation (Bezeichnung) Operationsverlauf (Lagerung, Zugang, Präparation, Befund, Rekonstruktion, Verschluss) Postoperative Diagnose Komplikationen Postoperatives Procedere`, }, }; async function detectFormat(transcript) { const prompt = `Du bist Assistent in der Kinderchirurgie. Analysiere das folgende Transkript eines ärztlichen Gesprächs und bestimme, welcher Brieftyp am besten passt. Optionen: - "arztbrief": klassischer Arztbrief für Zuweiser/Hausarzt (typisch nach stationärem Aufenthalt oder ausführlicher Abklärung) - "konsult": kurzer Konsultationsbericht (typisch nach einmaliger Ambulanzvorstellung) - "soap": SOAP-Notiz (kurze strukturierte Verlaufsnotiz) - "opbericht": Operationsbericht (wenn im Gespräch ein Eingriff/eine Operation beschrieben wird: Lagerung, Zugang, Präparation, Naht, Verschluss etc.) Wenn du dir nicht sicher bist oder zu wenig Information vorhanden ist, antworte mit "unsure". Transkript: """${transcript}""" Antworte AUSSCHLIESSLICH mit einem der Schlüssel: arztbrief, konsult, soap, opbericht, unsure. Keine weiteren Worte.`; try { const out = await window.claude.complete(prompt); const v = (out || "").trim().toLowerCase().replace(/[^a-z]/g, ""); if (["arztbrief","konsult","soap","opbericht","unsure"].includes(v)) return v; return "unsure"; } catch (e) { console.warn("detectFormat failed", e); return "unsure"; } } async function generateLetter(transcript, formatKey, specialty = "Kinderchirurgie") { const fmt = LETTER_FORMATS[formatKey] || LETTER_FORMATS.arztbrief; const prompt = `Du bist ein erfahrener Assistenzarzt in der ${specialty} und verfasst medizinische Dokumente in professionellem, präzisem klinischem Stil. Aus dem folgenden Transkript eines Gesprächs (Arzt-Patient/Arzt-Eltern oder Diktat) sollst du einen "${fmt.name}" verfassen. Struktur: ${fmt.structure} ${LANG_RULES} ${GERMAN_GLOSSARY} Inhalt: - In vollständigen Sätzen, sachlich-klinisch. - Verwende die korrekte medizinische Fachterminologie der ${specialty}. - Wenn Angaben fehlen (z. B. Geburtsdatum, Datum), schreibe einen Platzhalter in eckigen Klammern: [Geburtsdatum], [Datum], [Zuweiser]. - Erfinde keine medizinischen Befunde, die nicht im Transkript stehen. - Extrahiere Patientendaten (Name, Alter, Geburtsdatum) automatisch, wenn erwähnt. Formatierung in Markdown: - Hauptabschnitte als "## Überschrift". - Feld-Label (z. B. Patient, Diagnose, Operationsdatum) als "**Label:** Wert" am Zeilenanfang. - Aufzählungen mit "- " wo sinnvoll (z. B. Diagnosenliste, Medikamente, Komplikationen). - Absätze durch Leerzeilen trennen. - Keine Code-Blöcke, keine Tabellen, kein HTML. Gib NUR den Brief aus — keine einleitenden oder abschließenden Erklärungen, keine Meta-Kommentare, keine englischen Übersetzungen. Transkript: """${transcript}""" Generiere jetzt den vollständigen "${fmt.name}" in Markdown (auf Deutsch):`; try { const out = await window.claude.complete(prompt); return (out || "").trim(); } catch (e) { console.error("generateLetter failed", e); throw e; } } async function generateTitle(transcript) { const prompt = `Aus diesem Transkript eines ärztlichen Gesprächs in der Kinderchirurgie: erstelle einen sehr kurzen Titel (max. 6 Wörter, auf Deutsch) im Format "Nachname, Vorname — Kurzbeschreibung" oder wenn kein Name erwähnt wird nur die Kurzbeschreibung (z. B. "Leistenhernie links, 4 Jahre"). Antworte nur mit dem Titel, ohne Anführungszeichen. Transkript: """${transcript.slice(0, 2000)}"""`; try { const out = await window.claude.complete(prompt); return (out || "").trim().replace(/^["']|["']$/g, "").slice(0, 80) || "Neue Aufnahme"; } catch { return "Neue Aufnahme"; } } window.LETTER_FORMATS = LETTER_FORMATS; window.detectFormat = detectFormat; window.generateLetter = generateLetter; window.generateTitle = generateTitle;