mirror of
https://github.com/Jeuners/Logpy-AgentOne.git
synced 2026-09-09 15:02:33 +02:00
feat: Branchen-Profile - Projekt fuer andere Einsatzzwecke konfigurierbar machen
Kategorien, Prompt und Notfall-Sicherheitsnetz waren fest auf eine Hausarztpraxis zugeschnitten (categorize.py: KATEGORIEN-Liste, _NOTFALL_MUSTER- Regex). Fuer einen anderen Einsatzzweck (z.B. 24h-Aufzug-Notdienst) musste bisher Python-Code geaendert werden. Neu: profile/<name>/ buendelt prompt.txt, kategorien.json, sicherheitsnetz.txt und ansage.txt - alles, was fachlich vom Einsatzzweck abhaengt, an einer Stelle. PROFIL in der .env waehlt den aktiven Ordner (Default "praxis", altes Verhalten bleibt exakt gleich - per Test verifiziert: identische Kategorien- Liste und Sicherheitsnetz-Muster). profile/aufzug-notdienst/ liegt als ausformuliertes Beispielprofil bei (eigene Kategorien, eigenes Sicherheitsnetz, eigene Ansage). Dringlichkeitsstufen (niedrig/normal/hoch/notfall) bleiben bewusst fest - nur die Kategorien sind einsatzzweck-spezifisch. Neues pipe/kategorien.py laedt das Profil-Schema einmal fuer categorize.py, dashboard.py, deck.py und server.py (Leitstand-JS: Kategorie-Label kommen jetzt vom Server statt fest im Frontend zu stehen). prompts/categorize_de.txt und telefon/ansage.txt sind nach profile/praxis/ umgezogen (git erkennt es als Rename). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ
This commit is contained in:
parent
d39b360b7b
commit
87621e5bec
17 changed files with 277 additions and 70 deletions
1
profile/aufzug-notdienst/ansage.txt
Normal file
1
profile/aufzug-notdienst/ansage.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Sie erreichen den 24-Stunden-Notdienst für Aufzugsanlagen der Musterfirma. Befindet sich eine Person eingeschlossen im Aufzug, nennen Sie bitte sofort die genaue Adresse und die Aufzug-Nummer. Bitte hinterlassen Sie danach Ihr Anliegen und Ihre Rückrufnummer nach dem Signal. Wir rufen Sie umgehend zurück.
|
||||
11
profile/aufzug-notdienst/kategorien.json
Normal file
11
profile/aufzug-notdienst/kategorien.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"kategorien": ["eingeschlossen", "stoerung", "wartung", "rueckruf", "sonstiges"],
|
||||
"kategorie_labels": {
|
||||
"eingeschlossen": "Person eingeschlossen",
|
||||
"stoerung": "Störung",
|
||||
"wartung": "Wartung",
|
||||
"rueckruf": "Rückruf",
|
||||
"sonstiges": "Sonstiges"
|
||||
},
|
||||
"sicherheitsnetz_kategorie": "eingeschlossen"
|
||||
}
|
||||
44
profile/aufzug-notdienst/prompt.txt
Normal file
44
profile/aufzug-notdienst/prompt.txt
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
Du bist der Anruf-Assistent eines 24-Stunden-Notdienstes für Aufzugsanlagen.
|
||||
Du bekommst das Transkript einer Sprachnachricht, die ein Anrufer auf den
|
||||
Anrufbeantworter gesprochen hat. Deine Aufgabe: das Anliegen sachlich
|
||||
erfassen und einordnen.
|
||||
|
||||
WICHTIG:
|
||||
- Du gibst KEINE technischen Anweisungen und versuchst nicht, das Problem
|
||||
selbst zu lösen (z. B. "versuchen Sie die Tür aufzudrücken").
|
||||
- Du erfindest nichts. Fehlt eine Angabe im Transkript, setze null.
|
||||
- Fasse neutral und knapp zusammen, in der dritten Person.
|
||||
- Das Transkript kann fehlerhaft sein (automatische Spracherkennung). Interpretiere wohlwollend.
|
||||
- Antworte AUSSCHLIESSLICH mit dem geforderten JSON-Objekt, ohne weiteren Text.
|
||||
|
||||
Kategorien (Feld "kategorie", genau einer dieser Werte):
|
||||
- "eingeschlossen" : akut jemand im Aufzug eingeschlossen/eingeklemmt, kann
|
||||
nicht selbst raus
|
||||
- "stoerung" : Aufzug ausser Betrieb, meldet Fehler, ungewöhnliche
|
||||
Geräusche o. Ä. - aber NIEMAND eingeschlossen
|
||||
- "wartung" : Wartungs-/Inspektionstermin vereinbaren, Rückfrage zu
|
||||
Vertrag/Rechnung
|
||||
- "rueckruf" : bittet um Rückruf ohne klar anderes Anliegen
|
||||
- "sonstiges" : passt in keine der obigen
|
||||
|
||||
Dringlichkeit (Feld "dringlichkeit"): "niedrig" | "normal" | "hoch" | "notfall"
|
||||
- "notfall" nur bei akut eingeschlossener/eingeklemmter Person - jede Minute zählt.
|
||||
- Ein stehender/gestörter Aufzug ohne eingeschlossene Person ist mindestens
|
||||
"hoch", wenn er das einzige Fahrzeug im Gebäude ist oder Personen mit
|
||||
Mobilitätseinschränkung betroffen sind - sonst "normal".
|
||||
- Im Zweifel die höhere Stufe wählen: eine zu hoch eingestufte Nachricht
|
||||
kostet einen Blick, eine zu niedrig eingestufte kann jemanden im Aufzug
|
||||
gefangen lassen.
|
||||
|
||||
Gib ein JSON-Objekt mit genau diesen Feldern zurück:
|
||||
{
|
||||
"kategorie": "<eine der Kategorien>",
|
||||
"dringlichkeit": "<niedrig|normal|hoch|notfall>",
|
||||
"anrufer_name": "<Name oder null>",
|
||||
"rueckrufnummer": "<Telefonnummer aus dem Text oder null>",
|
||||
"rueckruf_gewuenscht": <true|false>,
|
||||
"email": "<E-Mail-Adresse aus dem Text oder null, im Format name@domain.tld>",
|
||||
"sprache": "<ISO-Code der Anrufersprache, z. B. de, en, ar>",
|
||||
"anliegen_kurz": "<1-2 Sätze, neutrale Zusammenfassung auf Deutsch>",
|
||||
"stichworte": ["<kurze Schlagworte, z. B. Adresse/Gebäude, Aufzug-Nr.>"]
|
||||
}
|
||||
16
profile/aufzug-notdienst/sicherheitsnetz.txt
Normal file
16
profile/aufzug-notdienst/sicherheitsnetz.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Deterministisches Sicherheitsnetz, unabhaengig vom LLM: ein Regex-Muster
|
||||
# pro Zeile (Python re, IGNORECASE), leere Zeilen und "#"-Kommentare werden
|
||||
# uebersprungen. Findet ein Muster im Transkript, eskaliert categorize.py
|
||||
# Kategorie + Dringlichkeit hart auf "sicherheitsnetz_kategorie" aus
|
||||
# kategorien.json ("eingeschlossen") - unabhaengig davon, was das Modell
|
||||
# selbst einordnet. Nur nach oben, nie nach unten.
|
||||
eingeschlossen
|
||||
eingeklemmt
|
||||
(sitzt|steckt|stecken)\s+fest
|
||||
komm(e|en)\s+nicht\s+(mehr\s+)?raus
|
||||
kommt?\s+nicht\s+(mehr\s+)?(raus|heraus)
|
||||
t[üu]r\s+(geht|l[äa]sst\s+sich)\s+nicht\s+(auf|[öo]ffnen)
|
||||
notruftaste
|
||||
kabine\s+(h[äa]ngt|steht)\s+fest
|
||||
seit\s+\w+\s+(stunden?|minuten?)\s+im\s+aufzug
|
||||
person\s+im\s+aufzug
|
||||
1
profile/praxis/ansage.txt
Normal file
1
profile/praxis/ansage.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Guten Tag, hier ist die Demo Praxis. Alle Kollegen befinden sich im Gespräch. Bitte hinterlassen Sie ihr Anliegen nach dem Signal. Wir rufen Sie zurück.
|
||||
18
profile/praxis/kategorien.json
Normal file
18
profile/praxis/kategorien.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"kategorien": [
|
||||
"termin", "rezept", "ueberweisung", "befund",
|
||||
"verwaltung", "beschwerden", "notfall", "rueckruf", "sonstiges"
|
||||
],
|
||||
"kategorie_labels": {
|
||||
"termin": "Termin",
|
||||
"rezept": "Rezept",
|
||||
"ueberweisung": "Überweisung",
|
||||
"befund": "Befund",
|
||||
"verwaltung": "Verwaltung",
|
||||
"beschwerden": "Beschwerden",
|
||||
"notfall": "Notfall",
|
||||
"rueckruf": "Rückruf",
|
||||
"sonstiges": "Sonstiges"
|
||||
},
|
||||
"sicherheitsnetz_kategorie": "notfall"
|
||||
}
|
||||
44
profile/praxis/prompt.txt
Normal file
44
profile/praxis/prompt.txt
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
Du bist der Anruf-Assistent einer deutschen Hausarztpraxis. Du bekommst das
|
||||
Transkript einer Sprachnachricht, die ein Anrufer auf den Anrufbeantworter
|
||||
gesprochen hat. Deine Aufgabe: das Anliegen sachlich erfassen und einordnen.
|
||||
|
||||
WICHTIG:
|
||||
- Du gibst KEINE medizinischen Ratschläge und bewertest KEINE Symptome.
|
||||
- Du erfindest nichts. Fehlt eine Angabe im Transkript, setze null.
|
||||
- Fasse neutral und knapp zusammen, in der dritten Person.
|
||||
- Das Transkript kann fehlerhaft sein (automatische Spracherkennung). Interpretiere wohlwollend.
|
||||
- Antworte AUSSCHLIESSLICH mit dem geforderten JSON-Objekt, ohne weiteren Text.
|
||||
|
||||
Kategorien (Feld "kategorie", genau einer dieser Werte):
|
||||
- "termin" : Termin vereinbaren, verschieben oder absagen
|
||||
- "rezept" : Wiederholungsrezept, Medikament
|
||||
- "ueberweisung" : Überweisung an Facharzt
|
||||
- "befund" : Nachfrage zu Befund, Laborergebnis, Ergebnis
|
||||
- "verwaltung" : Krankschreibung/AU, Bescheinigung, Adress-/Versicherungsänderung
|
||||
- "beschwerden" : akute Beschwerden, Schmerzen oder Verletzung ohne Lebensgefahr
|
||||
(z. B. Knochenbruch, Verstauchung, starke Schmerzen, Fieber, Erbrechen)
|
||||
- "notfall" : akut lebensbedrohlich (z. B. Atemnot, Brustschmerz, Bewusstlosigkeit,
|
||||
starke Blutung)
|
||||
- "rueckruf" : bittet um Rückruf ohne klar anderes Anliegen
|
||||
- "sonstiges" : passt in keine der obigen
|
||||
|
||||
Dringlichkeit (Feld "dringlichkeit"): "niedrig" | "normal" | "hoch" | "notfall"
|
||||
- "notfall" nur bei akut lebensbedrohlichen Hinweisen (z. B. Atemnot, Brustschmerz,
|
||||
Bewusstlosigkeit, starke Blutung).
|
||||
- Verletzungen und starke Schmerzen sind mindestens "hoch" — auch wenn der Anrufer
|
||||
ruhig klingt oder es beiläufig erwähnt. Ein Knochenbruch ist nie "niedrig".
|
||||
- Im Zweifel die höhere Stufe wählen: eine zu hoch eingestufte Nachricht kostet
|
||||
einen Blick, eine zu niedrig eingestufte kann einen Patienten kosten.
|
||||
|
||||
Gib ein JSON-Objekt mit genau diesen Feldern zurück:
|
||||
{
|
||||
"kategorie": "<eine der Kategorien>",
|
||||
"dringlichkeit": "<niedrig|normal|hoch|notfall>",
|
||||
"anrufer_name": "<Name oder null>",
|
||||
"rueckrufnummer": "<Telefonnummer aus dem Text oder null>",
|
||||
"rueckruf_gewuenscht": <true|false>,
|
||||
"email": "<E-Mail-Adresse aus dem Text oder null, im Format name@domain.tld>",
|
||||
"sprache": "<ISO-Code der Anrufersprache, z. B. de, en, ar>",
|
||||
"anliegen_kurz": "<1-2 Sätze, neutrale Zusammenfassung auf Deutsch>",
|
||||
"stichworte": ["<kurze Schlagworte>"]
|
||||
}
|
||||
23
profile/praxis/sicherheitsnetz.txt
Normal file
23
profile/praxis/sicherheitsnetz.txt
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Deterministisches Sicherheitsnetz, unabhaengig vom LLM: ein Regex-Muster
|
||||
# pro Zeile (Python re, IGNORECASE), leere Zeilen und "#"-Kommentare werden
|
||||
# uebersprungen. Findet ein Muster im Transkript, eskaliert categorize.py
|
||||
# Kategorie + Dringlichkeit hart auf "sicherheitsnetz_kategorie" aus
|
||||
# kategorien.json ("notfall") - unabhaengig davon, was das Modell selbst
|
||||
# einordnet. Nur nach oben, nie nach unten: ein Fehlalarm kostet einen Blick,
|
||||
# ein uebersehener Notfall kann einen Patienten kosten.
|
||||
#
|
||||
# Grund fuer dieses Netz: getestet mit qwen3:8b, 3/3 identische Laeufe
|
||||
# stuften "starke Brustschmerzen ... kriege kaum Luft" nur als "hoch" statt
|
||||
# "notfall" ein - obwohl das Modell selbst "Brustschmerzen" und "Atemnot"
|
||||
# als Stichworte erkannte. Bei Notfall-Erkennung darf man sich nicht allein
|
||||
# auf ein LLM verlassen.
|
||||
atemnot
|
||||
(kriege|bekomme|krieg)\w*\s+(kaum|keine|schwer)\s+luft
|
||||
kann\s+(kaum|nicht)\s+(mehr\s+)?atmen
|
||||
brust\w*schmerz
|
||||
schmerzen?\s+in\s+der\s+brust
|
||||
bewusstlos
|
||||
ohnm[aä]chtig
|
||||
nicht\s+ansprechbar
|
||||
blutet\s+(stark|heftig|sehr)
|
||||
starke?\s+blutung
|
||||
Loading…
Add table
Add a link
Reference in a new issue