Hier das AppleScript:
-- Zwischenablage: bestimmte Sonderzeichen entfernen
set patternsToRemove to {"#", quote, "“", "”", "„"} -- z.B. ## und verschiedene Anführungszeichen
try
-- 1) Text aus der Zwischenablage holen
set t to (the clipboard as text)
on error
display alert "Die Zwischenablage enthält keinen Text."
return
end try
-- 2) Jedes Muster entfernen (durch leere Zeichenkette ersetzen)
repeat with p in patternsToRemove
set AppleScript's text item delimiters to (p as text)
set t to (text items of t)
set AppleScript's text item delimiters to ""
set t to (t as text)
end repeat
-- 3) Aufräumen & zurück in die Zwischenablage
set AppleScript's text item delimiters to ""
set the inputString to t
------------------------------------------------------------
-- Auswahl des Prompts
-- Benutzer-Auswahl anzeigen
set userChoice to choose from list {"Arztbericht", "Schlaflabor", "CT", "Gutachtenauftrag"} with prompt "Bitte eine Auswahl treffen:" default items {"Arztbericht"}
-- Falls der Benutzer abbricht
if userChoice is false then
return
end if
set userChoice to item 1 of userChoice
set prompt to ""
-- Je nach Auswahl Text setzen
if userChoice is "Arztbericht" then
set auftrag to "Fasse den folgenden Arztbericht zusammen. Die erste Zeile soll wie folgt formuliert werden: Arztbericht (kurz gefasster Name der Klinik / Praxis / Einrichtung, Ort, keine Adresse), Aufenthalt von XXX - XXX bzw. am XXXX. Bilde dann Rubriken und beginne jede Rubrik in einer neuen Zeile mit dem Rubriknamen. Nach jeder Rubrik eine Leerzeile. Bilde folgende Rubriken: Diagnosen, Aufnahmeanlass, Diagnostik (kurzgefasst), Therapie, Empfehlung, auffällige Laborwerte. Benutze keine Formatierungszeichen.
Stelle keine Fragen und mache keine eigenen Vorschläge für das weitere Vorgehen."
else if userChoice is "Schlaflabor" then
set auftrag to "Du bist Arzt-Assistent in einer pneumologischen Praxis. Du sollst lange Arztbriefe zu einer möglichst übersichtlichen und vor allem kurz gefassten Zusammenfassung verarbeiten. Hier ist ein Schlaflaborbericht auszuwerten. Beginne den Text mit der Zeile @@Schlaflabor Delmenhorst## Nenne nun kurz (beginne für jeden Ausdruck eine neue Zeile und setze @@ davor und ein ## nach der Antwort, z.B. @@ESS: 3/24##, @@ Druck: 5 mbar##): Datum der Untersuchung, Diagnosen (Text und ICD-Code), Schlafarchitektur (sehr kurz formuliert), ESS, RDI (diagnostisch), RDI (Therapie). Entnehme die folgenden Parameter aus dem letzten Absatz (Therapie/Zusammenfassung): Druck, Flex-Stufe oder Soft-PAP (nenne nur die Zahl), Warmluftbefeuchter, Rampendruck, Rampendauer, Maske, Maskengröße, Toleranz der CPAP-Therapie durch den Patienten, Empfohlenes Vorgehen: Kontrolle wo und durch wen? Nenne keine Kontaktdaten"
else if userChoice is "CT" then
set auftrag to "Als Pneumologe wertest Du Radiologische Befunde aus. Bilde Rubriken in der Form @@Rubrikname: Inhalt/Text##, keine Nummerierung. Wenn zu einer Rubrik keine Informationen vorliegen, schreibe nicht beschrieben, wenn zu einer Rubrik das Bestehen eines Befundes explizit verneint wird, schreibe unauffällig. Wenn das Stichwort Lokalisation in einer Rubrik genannt wird, nutze dafür nur die Begriffe links, rechts, zentral, beidseits, peripher, diffus, basal, apikal, Oberlappen, Unterlappen, Mittellappen. Rubrik: Datum (Datum der Untersuchung im Format dd.mm.yyyy). Rubrik: Praxis (nenne hier den Namen der radiologischen Praxis oder Klinik, z.B. Radiologie am St. Josef-Stift, Radiologie am RKK, Radiologie Bremen, ZEMODI, MVZ Delmenhorst, Radiologie Klinikum Bremen-Ost, Radiologie Klinikum Bremen-Mitte, Radiologie DIAKO). Rubrik: Art der Untersuchung (hier nur die Begriffe: Thorax-CT, Thorax-/Oberbauch-CT, Thorax-/Abdomen-CT, Abdomen-CT, low dose/low-dose). Rubrik: KM-Gabe (Begriffe: nativ, mit KM-Gabe). Rubrik: Klinische Angaben (hierhin alle Information, die zur Befundung vorgelegen haben). Voruntersuchung (nur das Datum der Voruntersuchung). Rubrik: Befund (Befundtext ohne Beurteilung oder klinische Angaben). Beurteilung (hier den Text der abschließenden Beurteilung). Rubrik: Emphysem (hier nur die Begriffe Empyhsem, zentroazinär, zentrilobulär, panlobulär, paraseptal verwenden). Rubrik: Fissuren (Begriffe: geschlossen, nicht geschlossen, links rechts, großer Lappenspalt, kleiner Lappenspalt). Rubrike: Pleura (Begriffe: Pleuraschwiele, Pleuraschwarte, Pleuraerguss, Pleuraverkalkung, links, rechts). Rubrik: Pneumothorax (beschreibe die Lokalisation; Begriffe: gering, ausgeprägt, gekammert, Seropneumothorax). Rubrik: Infiltrate (Begriffe: umschrieben, diffus, retikulär, interstitiell, konsolidierend, bronchiolitisch), Lokalisation. Rubrik: Lymphknoten (Begriffe: mediastinal, hilär, links, rechts, subkarinal, paraaortal, beschreibe die Größe in mm). Rubrik: Lungenrundherd (Begriffe Lungenrundherd, Lokalisation, Größe in Millimeter anwenden, solide, subsolide, verkalkt, teilweise verkalkt verwenden, wenn mehrere Rundherde beschreiben sind bitte numerieren). Rubrik: Dystelektase (setze Dystelektase und Belüftungsstörung gleich; Begriffe gering, ausgeprägt, beschreibe die Lokalisation). Rubrik Raumforderung (Begriffe: Raumforderung, links, rechts, Oberlappen, Unterlappen, Mittellappen, zentral, peripher, beschreibe die Größe in Zentimeter). Rubrik: TNM (Tumorformel gemäß TNM). Rubrik: ILD (Begriffe UIP-Muster, NSIP-Muster, Milchglastrübung, Honeycombing, Traktionsbronchiektasen verwenden, beschreibe die Lokalisation). Rubrik: Bronchitis (Begriffe Bronchialwandverdickung, mucus plugging). Rubrik: Arteriosklerose (Begriffe: Koronarsklerose). Rubrik: Pulmonalgefässe (Begriffe: Hinweis auf pulmonale Hypertonie; Lungenembolie; beschreibe die Lokalisation). Rubrik: Bronchiektasen (Begriffe: sacciform, gering, ausgeprägt; beschreibe die Lokalisation). Rubrik: Skelettsystem (alles bzgl. Skelett und Knochen). Rubrik: Sonstiges (alles, was in den obigen Rubriken nicht berücksichtigt wurde, Stichpunkte). Rubrik: Verlauf (beschreibe hier unter Verwendung der o.g. Rubrikennamen evtl. beschriebene Veränderungen; Begriffe unverändert, zunehmend, rückläufig). Rubrik: Empfehlungen (nur wenn im Text genannt, Stichpunkte)"
else if userChoice is "Gutachtenauftrag" then
set auftrag to "Du bist Arzt-Assistent in einer pneumologischen Praxis. Du sollst einen Begutachtungsauftrag mit vielen einzelnen Fragen im unveränderten Originaltext erfassen und in einer besonders strukturierten Form ausgeben. Achte streng darauf, dass keinerlei Änderungen am Originaltext der Fragen vorgenommen werden. Die Fragen des Gutachtenauftrags sind nummeriert. Beginne den Text mit der Zeile @@Gutachtenauftrag## Setze nun vor jede Frage @@, dann die Nummer der Frage, die Frage selbst und ein ## am Ende der Frage. Setze zwischen den Fragen eine Leerzeile."
end if
set prompt to auftrag & inputString
-- Ausgabe zur Kontrolle
display dialog "Deine Auswahl: " & userChoice & return & "Variable: " & prompt buttons {"OK"} default button 1
----------------------------------------------
-- Übergabe an Ollama
-- Python-Snippet: ruft die lokale Ollama Chat API auf (nur stdlib)
set pyCode to "
import os, sys, json, urllib.request, urllib.error
OLLAMA_URL = 'http://localhost:11434/api/chat'
MODEL = os.environ.get('USER_MODEL', 'gpt-oss:20b')
prompt = os.environ.get('USER_PROMPT', '')
payload = {
'model': MODEL,
'messages': [{'role': 'user', 'content': prompt}],
'stream': False
}
req = urllib.request.Request(
OLLAMA_URL,
data=json.dumps(payload).encode('utf-8'),
headers={'Content-Type': 'application/json'},
method='POST'
)
try:
with urllib.request.urlopen(req, timeout=120) as resp:
data = json.loads(resp.read().decode('utf-8'))
# Ollama liefert die Antwort unter data['message']['content']
content = data.get('message', {}).get('content', '').strip()
sys.stdout.write(content)
except urllib.error.HTTPError as e:
msg = e.read().decode('utf-8', errors='ignore')
sys.stderr.write(f'HTTPError {e.code}: {msg}\\n')
sys.exit(1)
except Exception as e:
sys.stderr.write(f'ERROR: {e}\\n')
sys.exit(1)
"
-- Wir übergeben den Prompt sicher via Env-Var, damit kein Quoting-Ärger entsteht.
set shellCmd to "/usr/bin/env /bin/zsh -lc " & quoted form of ("export USER_PROMPT=" & quoted form of prompt & "; " & "python3 - <<'PY'
" & pyCode & "
PY")
try
set resultText to do shell script shellCmd
on error errmsg number errNum
display dialog ("Fehler beim API-Aufruf:
" & errmsg) buttons {"OK"} with icon stop
return
end try
-- Ergebnis in die Zwischenablage legen
set the clipboard to resultText
-- Hinweis-Fenster
display dialog "Fertig: Auswertung befindet sich in der Zwischenablage." buttons {"OK"} default button 1 with icon note