feat: edu-search-service migriert, voice-service/geo-service entfernt
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 28s
CI / test-go-edu-search (push) Successful in 27s
CI / test-python-klausur (push) Successful in 1m45s
CI / test-python-agent-core (push) Successful in 16s
CI / test-nodejs-website (push) Successful in 21s

- edu-search-service von breakpilot-pwa nach breakpilot-lehrer kopiert (ohne vendor)
- opensearch + edu-search-service in docker-compose.yml hinzugefuegt
- voice-service aus docker-compose.yml entfernt (jetzt in breakpilot-core)
- geo-service aus docker-compose.yml entfernt (nicht mehr benoetigt)
- CI/CD: edu-search-service zu Gitea Actions und Woodpecker hinzugefuegt
  (Go lint, test mit go mod download, build, SBOM)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Boenisch
2026-02-15 18:36:38 +01:00
parent d4e1d6bab6
commit 414e0f5ec0
73 changed files with 23938 additions and 92 deletions

View File

@@ -0,0 +1,178 @@
# Doc-Type Klassifikationsregeln
# Scoring-basiert: höchster Score gewinnt
doc_types:
Lehrplan:
strong_terms: # +4 pro Match
- "lehrplan"
- "kompetenzerwartungen"
- "fachanforderungen"
- "bildungsplan"
- "kerncurriculum"
- "rahmenlehrplan"
- "schulcurriculum"
medium_terms: # +3 pro Match
- "kompetenzorientiert"
- "kompetenzbereiche"
- "inhaltsfelder"
- "anforderungsbereiche"
- "bildungsstandards"
- "stundentafel"
url_patterns: # +2 pro Match
- "/lehrplan"
- "/curriculum"
- "/kerncurriculum"
- "/rahmenlehrplan"
- "/bildungsplan"
Kerncurriculum:
strong_terms:
- "kerncurriculum"
- "kc "
medium_terms:
- "prozessbezogene kompetenzen"
- "inhaltsbezogene kompetenzen"
url_patterns:
- "/kerncurriculum"
- "/kc/"
Rahmenlehrplan:
strong_terms:
- "rahmenlehrplan"
- "rlp"
url_patterns:
- "/rahmenlehrplan"
- "/rlp/"
Erlass_Verordnung:
strong_terms: # +5 - rechtliche Texte haben Vorrang
- "erlass"
- "verordnung"
- "vo"
- "richtlinie"
- "amtsblatt"
- "gvbl"
- "gesetz"
medium_terms:
- "tritt in kraft"
- "gilt ab"
- "ausfertigungsdatum"
- "bekanntmachung"
url_patterns:
- "/amtsblatt"
- "/recht/"
- "/verordnungen"
- "/erlasse"
- "/bekanntmachung"
Arbeitsblatt:
strong_terms:
- "arbeitsblatt"
- "worksheet"
- "kopiervorlage"
- "loesungsblatt"
- "stationenlernen"
- "lerntheke"
medium_terms:
- "aufgabe 1"
- "aufgabe 2"
- "name:"
- "datum:"
- "klasse:"
url_patterns:
- "/arbeitsblatt"
- "/material/arbeitsblatt"
- "/download/arbeitsblatt"
- "/worksheet"
Unterrichtsentwurf:
strong_terms:
- "unterrichtsentwurf"
- "stundenentwurf"
- "verlaufsplan"
- "unterrichtsplanung"
medium_terms:
- "lernziele"
- "kompetenzziel"
- "einstieg"
- "sicherung"
- "transfer"
- "didaktische analyse"
- "methodische analyse"
url_patterns:
- "/unterrichtsentwurf"
- "/stundenentwurf"
Materialsammlung:
strong_terms:
- "materialsammlung"
- "materialpaket"
- "unterrichtsmaterial"
medium_terms:
- "materialien"
- "sammlung"
- "paket"
url_patterns:
- "/material"
- "/materialsammlung"
Pruefung_Abitur:
strong_terms:
- "abitur"
- "zentralabitur"
- "pruefungsaufgaben"
- "pruefung"
- "klausur"
- "aufgabenpool"
medium_terms:
- "hilfsmittel"
- "bearbeitungszeit"
- "bewertungshinweise"
- "loesungsvorschlag"
url_patterns:
- "/abitur"
- "/pruefung"
- "/klausur"
Studie_Bericht:
strong_terms:
- "studie"
- "bericht"
- "evaluation"
- "monitoring"
- "report"
medium_terms:
- "ergebnisse"
- "methodik"
- "stichprobe"
- "fragebogen"
- "datenanalyse"
url_patterns:
- "/studie"
- "/bericht"
- "/evaluation"
News_Blog:
strong_terms:
- "pressemitteilung"
- "aktuelles"
url_patterns:
- "/news"
- "/blog"
- "/presse"
- "/aktuelles"
- "/meldung"
# Konfliktauflösung
priority_order:
- Erlass_Verordnung # Rechtliche Texte immer zuerst
- Pruefung_Abitur
- Lehrplan
- Kerncurriculum
- Rahmenlehrplan
- Arbeitsblatt
- Unterrichtsentwurf
- Materialsammlung
- Studie_Bericht
- News_Blog
- Sonstiges

View File

@@ -0,0 +1,121 @@
# School Level Tagging Regeln
levels:
Primar:
strong:
- "grundschule"
- "primarstufe"
- "klasse 1"
- "klasse 2"
- "klasse 3"
- "klasse 4"
- "1. klasse"
- "2. klasse"
- "3. klasse"
- "4. klasse"
- "sachunterricht"
- "schuleingangsphase"
weak:
- "anfangsunterricht"
- "schreibenlernen"
- "erstlesen"
negative: []
SekI:
strong:
- "sekundarstufe i"
- "sek i"
- "klasse 5"
- "klasse 6"
- "klasse 7"
- "klasse 8"
- "klasse 9"
- "klasse 10"
- "jahrgang 5"
- "jahrgang 6"
- "jahrgang 7"
- "jahrgang 8"
- "jahrgang 9"
- "jahrgang 10"
- "mittlere schule"
- "realschule"
- "hauptschule"
- "mittelschule"
- "erprobungsstufe"
weak:
- "5. klasse"
- "6. klasse"
- "7. klasse"
- "8. klasse"
- "9. klasse"
- "10. klasse"
negative: []
SekII:
strong:
- "sekundarstufe ii"
- "sek ii"
- "oberstufe"
- "gymnasiale oberstufe"
- "ef"
- "q1"
- "q2"
- "11. klasse"
- "12. klasse"
- "13. klasse"
- "jahrgang 11"
- "jahrgang 12"
- "jahrgang 13"
- "abitur"
- "abiturvorbereitung"
- "leistungskurs"
- "grundkurs"
- "qualifikationsphase"
- "einfuehrungsphase"
weak:
- "oberstufenschueler"
- "kursstufe"
negative: []
Beruf:
strong:
- "berufsschule"
- "ausbildung"
- "ihk"
- "lernfeld"
- "berufliches gymnasium"
- "berufskolleg"
- "berufsfachschule"
- "fachschule"
- "duales system"
- "auszubildende"
weak:
- "betrieb"
- "praxis"
negative: []
Hochschule:
strong:
- "modulhandbuch"
- "ects"
- "seminar universitaet"
- "vorlesung"
- "studiengang"
- "bachelor"
- "master"
- "dissertation"
- "hochschuldidaktik"
weak:
- "studierende"
- "hochschule"
negative: []
# Konfliktauflösung
# Wenn mehrere Levels matchen, gewinnt der spezifischere
priority_order:
- Primar
- SekI
- SekII
- Beruf
- Hochschule
- NA

View File

@@ -0,0 +1,285 @@
# Subject (Fach) Tagging Regeln
# Format: strong (+3), weak (+1), negative (-2)
subjects:
Mathe:
strong:
- "mathematik"
- "mathe"
- "algebra"
- "geometrie"
- "stochastik"
- "analysis"
- "prozentrechnung"
- "gleichungen"
- "funktionen"
- "trigonometrie"
- "wahrscheinlichkeit"
weak:
- "zahlen"
- "terme"
- "diagramme"
- "brueche"
- "dreisatz"
- "rechnen"
negative: []
Deutsch:
strong:
- "deutschunterricht"
- "grammatik"
- "rechtschreibung"
- "aufsatz"
- "textanalyse"
- "literatur"
- "argumentation"
- "erzaehlung"
- "lyrik"
- "drama"
- "epik"
weak:
- "lesen"
- "schreiben"
- "woerter"
- "satzglieder"
negative:
- "deutschland"
- "deutsche geschichte"
Englisch:
strong:
- "englischunterricht"
- "english"
- "grammar"
- "vocabulary"
- "reading comprehension"
- "listening"
- "speaking"
weak:
- "text"
- "dialogue"
negative: []
Franzoesisch:
strong:
- "franzoesisch"
- "francais"
- "french"
- "grammaire"
weak:
- "texte"
negative: []
Latein:
strong:
- "latein"
- "lateinunterricht"
- "grammatik latein"
weak:
- "uebersetzung"
- "vokabel"
negative: []
Biologie:
strong:
- "biologie"
- "bio"
- "oekologie"
- "evolution"
- "genetik"
- "zellbiologie"
- "stoffwechsel"
- "neurobiologie"
weak:
- "zelle"
- "organismus"
- "lebewesen"
negative: []
Chemie:
strong:
- "chemie"
- "chemieunterricht"
- "organische chemie"
- "anorganische chemie"
- "reaktionsgleichung"
- "periodensystem"
weak:
- "element"
- "verbindung"
- "reaktion"
negative: []
Physik:
strong:
- "physik"
- "physikunterricht"
- "mechanik"
- "elektrizitaet"
- "optik"
- "thermodynamik"
- "quantenphysik"
weak:
- "energie"
- "kraft"
- "bewegung"
negative: []
Informatik:
strong:
- "informatik"
- "programmierung"
- "algorithmus"
- "datenstruktur"
- "python"
- "java"
- "sql"
- "netzwerke"
weak:
- "code"
- "daten"
- "computer"
negative: []
Geschichte:
strong:
- "geschichtsunterricht"
- "historisch"
- "weimarer republik"
- "nationalsozialismus"
- "mittelalter"
- "aufklaerung"
- "industrialisierung"
- "antike"
- "renaissance"
weak:
- "quelle"
- "chronologie"
- "epoche"
negative: []
Politik_Sozialkunde:
strong:
- "politik"
- "politikunterricht"
- "sozialkunde"
- "gemeinschaftskunde"
- "demokratie"
- "grundgesetz"
- "bundestag"
- "wahlen"
- "parteien"
weak:
- "rechte"
- "pflichten"
- "institutionen"
negative:
- "europaeische union" # zu allgemein
Geographie:
strong:
- "geographie"
- "geografie"
- "erdkunde"
- "topographie"
- "klimazonen"
- "plattentektonik"
weak:
- "karte"
- "landschaft"
- "kontinent"
negative: []
Religion_Ethik:
strong:
- "religionsunterricht"
- "ethik"
- "philosophie"
- "weltreligionen"
- "bibel"
- "christentum"
- "islam"
- "judentum"
weak:
- "werte"
- "moral"
negative: []
Kunst:
strong:
- "kunstunterricht"
- "bildende kunst"
- "malerei"
- "zeichnen"
- "gestaltung"
- "kunstgeschichte"
weak:
- "bild"
- "farbe"
negative:
- "kunststoff"
Musik:
strong:
- "musikunterricht"
- "musiktheorie"
- "notenlehre"
- "rhythmus"
- "harmonie"
- "instrument"
weak:
- "lied"
- "melodie"
negative: []
Sport:
strong:
- "sportunterricht"
- "bewegung sport"
- "leichtathletik"
- "ballsport"
- "turnen"
- "schwimmen unterricht"
weak:
- "spiel"
- "fitness"
negative:
- "sportlich"
- "esport"
Wirtschaft:
strong:
- "wirtschaftsunterricht"
- "oekonomie"
- "volkswirtschaft"
- "betriebswirtschaft"
- "marktwirtschaft"
weak:
- "unternehmen"
- "markt"
negative: []
Sachunterricht:
strong:
- "sachunterricht"
- "heimat- und sachunterricht"
- "hsu"
weak:
- "grundschule thema"
negative: []
DaZ_DaF:
strong:
- "deutsch als zweitsprache"
- "deutsch als fremdsprache"
- "daz"
- "daf"
- "alphabetisierung"
weak:
- "sprachfoerderung"
- "integration"
negative: []
# Threshold für Subject-Assignment
threshold: 4 # Mindest-Score um Subject zuzuweisen
max_subjects: 3 # Maximal 3 Subjects pro Dokument

View File

@@ -0,0 +1,117 @@
# Trust Score Regeln für Education Search
# Score-Berechnung: Summe aller matchenden Regeln, dann clamp(0, 1)
domain_boosts:
# Bundesebene (höchste Vertrauensstufe)
- match: "*.kmk.org"
add: 0.50
reason: "KMK - Kultusministerkonferenz"
- match: "*.bildungsserver.de"
add: 0.50
reason: "Deutscher Bildungsserver"
- match: "*.bpb.de"
add: 0.45
reason: "Bundeszentrale für politische Bildung"
- match: "*.bmbf.de"
add: 0.50
reason: "BMBF"
- match: "*.iqb.hu-berlin.de"
add: 0.50
reason: "IQB Bildungsstandards"
# Landesministerien
- match: "*.bayern.de"
add: 0.45
reason: "Bayern offiziell"
- match: "*.nrw.de"
add: 0.45
reason: "NRW offiziell"
- match: "*.berlin.de"
add: 0.45
reason: "Berlin offiziell"
- match: "*.sachsen.de"
add: 0.45
reason: "Sachsen offiziell"
- match: "*.niedersachsen.de"
add: 0.45
reason: "Niedersachsen offiziell"
- match: "*.hessen.de"
add: 0.45
reason: "Hessen offiziell"
- match: "*.brandenburg.de"
add: 0.45
reason: "Brandenburg offiziell"
- match: "*.thueringen.de"
add: 0.45
reason: "Thüringen offiziell"
# Bildungsserver der Länder
- match: "*.nibis.de"
add: 0.40
reason: "Niedersachsen Bildungsserver"
- match: "*.learnline.nrw.de"
add: 0.40
reason: "NRW Bildungsserver"
- match: "*.schule-bw.de"
add: 0.40
reason: "BW Bildungsserver"
# Universitäten
- match: "*.uni-*.de"
add: 0.30
reason: "Deutsche Universität"
- match: "*.tu-*.de"
add: 0.30
reason: "Technische Universität"
- match: "*.fh-*.de"
add: 0.25
reason: "Fachhochschule"
# Etablierte Portale
- match: "*.zum.de"
add: 0.25
reason: "ZUM - Zentrale für Unterrichtsmedien"
- match: "*.lehrer-online.de"
add: 0.20
reason: "Lehrer-Online Portal"
- match: "*.4teachers.de"
add: 0.20
reason: "4teachers Portal"
tld_boosts:
- tld: ".gov"
add: 0.40
reason: "Government TLD"
- tld: ".edu"
add: 0.35
reason: "Education TLD"
penalties:
# URL-Muster die Werbung/Tracking andeuten
- if_url_contains: ["utm_", "affiliate", "partner=", "ref="]
add: -0.10
reason: "Tracking/Affiliate Parameter"
# Kommerzielle Signale
- if_url_contains: ["shop", "kaufen", "bestellen", "warenkorb"]
add: -0.20
reason: "E-Commerce Signale"
# SEO-Spam Indikatoren
- if_url_contains: ["gratis-", "kostenlos-download", "sofort-"]
add: -0.15
reason: "SEO-Spam Muster"
# Content-basierte Strafen (werden vom Extractor gesetzt)
content_penalties:
- if_ad_density_gt: 0.20
add: -0.30
reason: "Hoher Werbeanteil"
- if_link_density_gt: 0.40
add: -0.20
reason: "Hohe Link-Dichte (Linkfarm)"
- if_content_length_lt: 200
add: -0.25
reason: "Sehr wenig Content"