Files
breakpilot-lehrer/klausur-service/backend/eh_templates.py
Benjamin Boenisch 5a31f52310 Initial commit: breakpilot-lehrer - Lehrer KI Platform
Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website,
Klausur-Service, School-Service, Voice-Service, Geo-Service,
BreakPilot Drive, Agent-Core

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:26 +01:00

659 lines
24 KiB
Python

"""
Erwartungshorizont Templates for Vorabitur Mode
Provides pre-defined templates based on German Abitur text analysis types:
- Textanalyse (pragmatische Texte)
- Sachtextanalyse
- Gedichtanalyse / Lyrikinterpretation
- Dramenanalyse
- Epische Textanalyse / Prosaanalyse
- Eroerterung (textgebunden / frei)
- Literarische Eroerterung
- Materialgestuetztes Schreiben
Each template includes:
- Structured criteria with weights
- Typical expectations per section
- NiBiS-aligned evaluation points
"""
from typing import Dict, List, Optional
from dataclasses import dataclass, field, asdict
from datetime import datetime
import uuid
# =============================================
# TEMPLATE TYPES
# =============================================
AUFGABENTYPEN = {
"textanalyse_pragmatisch": {
"name": "Textanalyse (pragmatische Texte)",
"description": "Analyse von Sachtexten, Reden, Kommentaren, Essays",
"category": "analyse"
},
"sachtextanalyse": {
"name": "Sachtextanalyse",
"description": "Analyse von informativen und appellativen Sachtexten",
"category": "analyse"
},
"gedichtanalyse": {
"name": "Gedichtanalyse / Lyrikinterpretation",
"description": "Analyse und Interpretation lyrischer Texte",
"category": "interpretation"
},
"dramenanalyse": {
"name": "Dramenanalyse",
"description": "Analyse dramatischer Texte und Szenen",
"category": "interpretation"
},
"prosaanalyse": {
"name": "Epische Textanalyse / Prosaanalyse",
"description": "Analyse von Romanauszuegen, Kurzgeschichten, Novellen",
"category": "interpretation"
},
"eroerterung_textgebunden": {
"name": "Textgebundene Eroerterung",
"description": "Eroerterung auf Basis eines Sachtextes",
"category": "argumentation"
},
"eroerterung_frei": {
"name": "Freie Eroerterung",
"description": "Freie Eroerterung zu einem Thema",
"category": "argumentation"
},
"eroerterung_literarisch": {
"name": "Literarische Eroerterung",
"description": "Eroerterung zu literarischen Fragestellungen",
"category": "argumentation"
},
"materialgestuetzt": {
"name": "Materialgestuetztes Schreiben",
"description": "Verfassen eines Textes auf Materialbasis",
"category": "produktion"
}
}
# =============================================
# TEMPLATE STRUCTURES
# =============================================
@dataclass
class EHKriterium:
"""Single criterion in an Erwartungshorizont."""
id: str
name: str
beschreibung: str
gewichtung: int # Percentage weight (0-100)
erwartungen: List[str] # Expected points/elements
max_punkte: int = 100
def to_dict(self):
return asdict(self)
@dataclass
class EHTemplate:
"""Complete Erwartungshorizont template."""
id: str
aufgabentyp: str
name: str
beschreibung: str
kriterien: List[EHKriterium]
einleitung_hinweise: List[str]
hauptteil_hinweise: List[str]
schluss_hinweise: List[str]
sprachliche_aspekte: List[str]
created_at: datetime = field(default_factory=lambda: datetime.now())
def to_dict(self):
d = {
'id': self.id,
'aufgabentyp': self.aufgabentyp,
'name': self.name,
'beschreibung': self.beschreibung,
'kriterien': [k.to_dict() for k in self.kriterien],
'einleitung_hinweise': self.einleitung_hinweise,
'hauptteil_hinweise': self.hauptteil_hinweise,
'schluss_hinweise': self.schluss_hinweise,
'sprachliche_aspekte': self.sprachliche_aspekte,
'created_at': self.created_at.isoformat()
}
return d
# =============================================
# PRE-DEFINED TEMPLATES
# =============================================
def get_textanalyse_template() -> EHTemplate:
"""Template for pragmatic text analysis."""
return EHTemplate(
id="template_textanalyse_pragmatisch",
aufgabentyp="textanalyse_pragmatisch",
name="Textanalyse pragmatischer Texte",
beschreibung="Vorlage fuer die Analyse von Sachtexten, Reden, Kommentaren und Essays",
kriterien=[
EHKriterium(
id="inhalt",
name="Inhaltliche Leistung",
beschreibung="Erfassung und Wiedergabe des Textinhalts",
gewichtung=40,
erwartungen=[
"Korrekte Erfassung der Textaussage/These",
"Vollstaendige Wiedergabe der Argumentationsstruktur",
"Erkennen von Intention und Adressatenbezug",
"Einordnung in den historischen/gesellschaftlichen Kontext",
"Beruecksichtigung aller relevanten Textaspekte"
]
),
EHKriterium(
id="struktur",
name="Aufbau und Struktur",
beschreibung="Logischer Aufbau und Gliederung der Analyse",
gewichtung=15,
erwartungen=[
"Sinnvolle Einleitung mit Basisinformationen",
"Logische Gliederung des Hauptteils",
"Stringente Gedankenfuehrung",
"Angemessener Schluss mit Fazit/Wertung",
"Absatzgliederung und Ueberlaenge"
]
),
EHKriterium(
id="analyse",
name="Analytische Qualitaet",
beschreibung="Tiefe und Qualitaet der Analyse",
gewichtung=15,
erwartungen=[
"Erkennen rhetorischer Mittel",
"Funktionale Deutung der Stilmittel",
"Analyse der Argumentationsweise",
"Beruecksichtigung von Wortwahl und Satzbau",
"Verknuepfung von Form und Inhalt"
]
),
EHKriterium(
id="rechtschreibung",
name="Sprachliche Richtigkeit (Rechtschreibung)",
beschreibung="Orthografische Korrektheit",
gewichtung=15,
erwartungen=[
"Korrekte Rechtschreibung",
"Korrekte Gross- und Kleinschreibung",
"Korrekte Getrennt- und Zusammenschreibung",
"Korrekte Fremdwortschreibung"
]
),
EHKriterium(
id="grammatik",
name="Sprachliche Richtigkeit (Grammatik)",
beschreibung="Grammatische Korrektheit und Zeichensetzung",
gewichtung=15,
erwartungen=[
"Korrekter Satzbau",
"Korrekte Flexion",
"Korrekte Zeichensetzung",
"Korrekte Bezuege und Kongruenz"
]
)
],
einleitung_hinweise=[
"Nennung von Autor, Titel, Textsorte, Erscheinungsjahr",
"Benennung des Themas",
"Formulierung der Kernthese/Hauptaussage",
"Ggf. Einordnung in den Kontext"
],
hauptteil_hinweise=[
"Systematische Analyse der Argumentationsstruktur",
"Untersuchung der sprachlichen Gestaltung",
"Funktionale Deutung der Stilmittel",
"Beruecksichtigung von Adressatenbezug und Intention",
"Textbelege durch Zitate"
],
schluss_hinweise=[
"Zusammenfassung der Analyseergebnisse",
"Bewertung der Ueberzeugungskraft",
"Ggf. aktuelle Relevanz",
"Persoenliche Stellungnahme (wenn gefordert)"
],
sprachliche_aspekte=[
"Fachsprachliche Begriffe korrekt verwenden",
"Konjunktiv fuer indirekte Rede",
"Praesens als Tempus der Analyse",
"Sachlicher, analytischer Stil"
]
)
def get_gedichtanalyse_template() -> EHTemplate:
"""Template for poetry analysis."""
return EHTemplate(
id="template_gedichtanalyse",
aufgabentyp="gedichtanalyse",
name="Gedichtanalyse / Lyrikinterpretation",
beschreibung="Vorlage fuer die Analyse und Interpretation lyrischer Texte",
kriterien=[
EHKriterium(
id="inhalt",
name="Inhaltliche Leistung",
beschreibung="Erfassung und Deutung des Gedichtinhalts",
gewichtung=40,
erwartungen=[
"Korrekte Erfassung des lyrischen Ichs und der Sprechsituation",
"Vollstaendige inhaltliche Erschliessung aller Strophen",
"Erkennen der zentralen Motive und Themen",
"Epochenzuordnung und literaturgeschichtliche Einordnung",
"Deutung der Bildlichkeit und Symbolik"
]
),
EHKriterium(
id="struktur",
name="Aufbau und Struktur",
beschreibung="Logischer Aufbau der Interpretation",
gewichtung=15,
erwartungen=[
"Einleitung mit Basisinformationen",
"Systematische strophenweise oder aspektorientierte Analyse",
"Verknuepfung von Form- und Inhaltsanalyse",
"Schluessige Gesamtdeutung im Schluss"
]
),
EHKriterium(
id="formanalyse",
name="Formale Analyse",
beschreibung="Analyse der lyrischen Gestaltungsmittel",
gewichtung=15,
erwartungen=[
"Bestimmung von Metrum und Reimschema",
"Analyse der Klanggestaltung",
"Erkennen von Enjambements und Zaesuren",
"Deutung der formalen Mittel",
"Verknuepfung von Form und Inhalt"
]
),
EHKriterium(
id="rechtschreibung",
name="Sprachliche Richtigkeit (Rechtschreibung)",
beschreibung="Orthografische Korrektheit",
gewichtung=15,
erwartungen=[
"Korrekte Rechtschreibung",
"Korrekte Gross- und Kleinschreibung",
"Korrekte Getrennt- und Zusammenschreibung"
]
),
EHKriterium(
id="grammatik",
name="Sprachliche Richtigkeit (Grammatik)",
beschreibung="Grammatische Korrektheit und Zeichensetzung",
gewichtung=15,
erwartungen=[
"Korrekter Satzbau",
"Korrekte Flexion",
"Korrekte Zeichensetzung"
]
)
],
einleitung_hinweise=[
"Autor, Titel, Entstehungsjahr/Epoche",
"Thema/Motiv des Gedichts",
"Erste Deutungshypothese",
"Formale Grunddaten (Strophen, Verse)"
],
hauptteil_hinweise=[
"Inhaltliche Analyse (strophenweise oder aspektorientiert)",
"Formale Analyse (Metrum, Reim, Klang)",
"Sprachliche Analyse (Stilmittel, Bildlichkeit)",
"Funktionale Verknuepfung aller Ebenen",
"Textbelege durch Zitate mit Versangabe"
],
schluss_hinweise=[
"Zusammenfassung der Interpretationsergebnisse",
"Bestaetigung/Modifikation der Deutungshypothese",
"Einordnung in Epoche/Werk des Autors",
"Aktualitaetsbezug (wenn sinnvoll)"
],
sprachliche_aspekte=[
"Fachbegriffe der Lyrikanalyse verwenden",
"Zwischen lyrischem Ich und Autor unterscheiden",
"Praesens als Analysetempus",
"Deutende statt beschreibende Formulierungen"
]
)
def get_eroerterung_template() -> EHTemplate:
"""Template for textgebundene Eroerterung."""
return EHTemplate(
id="template_eroerterung_textgebunden",
aufgabentyp="eroerterung_textgebunden",
name="Textgebundene Eroerterung",
beschreibung="Vorlage fuer die textgebundene Eroerterung auf Basis eines Sachtextes",
kriterien=[
EHKriterium(
id="inhalt",
name="Inhaltliche Leistung",
beschreibung="Qualitaet der Argumentation",
gewichtung=40,
erwartungen=[
"Korrekte Wiedergabe der Textposition",
"Differenzierte eigene Argumentation",
"Vielfaeltige und ueberzeugende Argumente",
"Beruecksichtigung von Pro und Contra",
"Sinnvolle Beispiele und Belege",
"Eigenstaendige Schlussfolgerung"
]
),
EHKriterium(
id="struktur",
name="Aufbau und Struktur",
beschreibung="Logischer Aufbau der Eroerterung",
gewichtung=15,
erwartungen=[
"Problemorientierte Einleitung",
"Klare Gliederung der Argumentation",
"Logische Argumentationsfolge",
"Sinnvolle Ueberlaetze",
"Begruendetes Fazit"
]
),
EHKriterium(
id="textbezug",
name="Textbezug",
beschreibung="Verknuepfung mit dem Ausgangstext",
gewichtung=15,
erwartungen=[
"Angemessene Textwiedergabe",
"Kritische Auseinandersetzung mit Textposition",
"Korrekte Zitierweise",
"Verknuepfung eigener Argumente mit Text"
]
),
EHKriterium(
id="rechtschreibung",
name="Sprachliche Richtigkeit (Rechtschreibung)",
beschreibung="Orthografische Korrektheit",
gewichtung=15,
erwartungen=[
"Korrekte Rechtschreibung",
"Korrekte Gross- und Kleinschreibung"
]
),
EHKriterium(
id="grammatik",
name="Sprachliche Richtigkeit (Grammatik)",
beschreibung="Grammatische Korrektheit und Zeichensetzung",
gewichtung=15,
erwartungen=[
"Korrekter Satzbau",
"Korrekte Zeichensetzung",
"Variationsreicher Ausdruck"
]
)
],
einleitung_hinweise=[
"Hinfuehrung zum Thema",
"Nennung des Ausgangstextes",
"Formulierung der Leitfrage/These",
"Ueberleitung zum Hauptteil"
],
hauptteil_hinweise=[
"Kurze Wiedergabe der Textposition",
"Systematische Argumentation (dialektisch oder linear)",
"Jedes Argument: These - Begruendung - Beispiel",
"Gewichtung der Argumente",
"Verknuepfung mit Textposition"
],
schluss_hinweise=[
"Zusammenfassung der wichtigsten Argumente",
"Eigene begruendete Stellungnahme",
"Ggf. Ausblick oder Appell"
],
sprachliche_aspekte=[
"Argumentative Konnektoren verwenden",
"Sachlicher, ueberzeugender Stil",
"Eigene Meinung kennzeichnen",
"Konjunktiv fuer Textpositionen"
]
)
def get_prosaanalyse_template() -> EHTemplate:
"""Template for prose/narrative text analysis."""
return EHTemplate(
id="template_prosaanalyse",
aufgabentyp="prosaanalyse",
name="Epische Textanalyse / Prosaanalyse",
beschreibung="Vorlage fuer die Analyse von Romanauszuegen, Kurzgeschichten und Novellen",
kriterien=[
EHKriterium(
id="inhalt",
name="Inhaltliche Leistung",
beschreibung="Erfassung und Deutung des Textinhalts",
gewichtung=40,
erwartungen=[
"Korrekte Erfassung der Handlung",
"Charakterisierung der Figuren",
"Erkennen der Erzaehlsituation",
"Deutung der Konflikte und Motive",
"Einordnung in den Gesamtzusammenhang"
]
),
EHKriterium(
id="struktur",
name="Aufbau und Struktur",
beschreibung="Logischer Aufbau der Analyse",
gewichtung=15,
erwartungen=[
"Informative Einleitung",
"Systematische Analyse im Hauptteil",
"Verknuepfung der Analyseergebnisse",
"Schluessige Gesamtdeutung"
]
),
EHKriterium(
id="erzaehltechnik",
name="Erzaehltechnische Analyse",
beschreibung="Analyse narrativer Gestaltungsmittel",
gewichtung=15,
erwartungen=[
"Bestimmung der Erzaehlperspektive",
"Analyse von Zeitgestaltung",
"Raumgestaltung und Atmosphaere",
"Figurenrede und Bewusstseinsdarstellung",
"Funktionale Deutung"
]
),
EHKriterium(
id="rechtschreibung",
name="Sprachliche Richtigkeit (Rechtschreibung)",
beschreibung="Orthografische Korrektheit",
gewichtung=15,
erwartungen=[
"Korrekte Rechtschreibung",
"Korrekte Gross- und Kleinschreibung"
]
),
EHKriterium(
id="grammatik",
name="Sprachliche Richtigkeit (Grammatik)",
beschreibung="Grammatische Korrektheit und Zeichensetzung",
gewichtung=15,
erwartungen=[
"Korrekter Satzbau",
"Korrekte Zeichensetzung"
]
)
],
einleitung_hinweise=[
"Autor, Titel, Textsorte, Erscheinungsjahr",
"Einordnung des Auszugs in den Gesamttext",
"Thema und Deutungshypothese"
],
hauptteil_hinweise=[
"Kurze Inhaltsangabe des Auszugs",
"Analyse der Handlungsstruktur",
"Figurenanalyse mit Textbelegen",
"Erzaehltechnische Analyse",
"Sprachliche Analyse",
"Verknuepfung aller Ebenen"
],
schluss_hinweise=[
"Zusammenfassung der Analyseergebnisse",
"Bestaetigung der Deutungshypothese",
"Bedeutung fuer Gesamtwerk",
"Ggf. Aktualitaetsbezug"
],
sprachliche_aspekte=[
"Fachbegriffe der Erzaehltextanalyse",
"Zwischen Erzaehler und Autor unterscheiden",
"Praesens als Analysetempus",
"Deutende Formulierungen"
]
)
def get_dramenanalyse_template() -> EHTemplate:
"""Template for drama analysis."""
return EHTemplate(
id="template_dramenanalyse",
aufgabentyp="dramenanalyse",
name="Dramenanalyse",
beschreibung="Vorlage fuer die Analyse dramatischer Texte und Szenen",
kriterien=[
EHKriterium(
id="inhalt",
name="Inhaltliche Leistung",
beschreibung="Erfassung und Deutung des Szeneninhalts",
gewichtung=40,
erwartungen=[
"Korrekte Erfassung der Handlung",
"Analyse der Figurenkonstellation",
"Erkennen des dramatischen Konflikts",
"Einordnung in den Handlungsverlauf",
"Deutung der Szene im Gesamtzusammenhang"
]
),
EHKriterium(
id="struktur",
name="Aufbau und Struktur",
beschreibung="Logischer Aufbau der Analyse",
gewichtung=15,
erwartungen=[
"Einleitung mit Kontextualisierung",
"Systematische Szenenanalyse",
"Verknuepfung der Analyseergebnisse",
"Schluessige Deutung"
]
),
EHKriterium(
id="dramentechnik",
name="Dramentechnische Analyse",
beschreibung="Analyse dramatischer Gestaltungsmittel",
gewichtung=15,
erwartungen=[
"Analyse der Dialoggestaltung",
"Regieanweisungen und Buehnenraum",
"Dramatische Spannung",
"Monolog/Dialog-Formen",
"Funktionale Deutung"
]
),
EHKriterium(
id="rechtschreibung",
name="Sprachliche Richtigkeit (Rechtschreibung)",
beschreibung="Orthografische Korrektheit",
gewichtung=15,
erwartungen=[
"Korrekte Rechtschreibung"
]
),
EHKriterium(
id="grammatik",
name="Sprachliche Richtigkeit (Grammatik)",
beschreibung="Grammatische Korrektheit und Zeichensetzung",
gewichtung=15,
erwartungen=[
"Korrekter Satzbau",
"Korrekte Zeichensetzung"
]
)
],
einleitung_hinweise=[
"Autor, Titel, Uraufführungsjahr, Dramenform",
"Einordnung der Szene in den Handlungsverlauf",
"Thema und Deutungshypothese"
],
hauptteil_hinweise=[
"Situierung der Szene",
"Analyse des Dialogverlaufs",
"Figurenanalyse im Dialog",
"Sprachliche Analyse",
"Dramentechnische Mittel",
"Bedeutung fuer den Konflikt"
],
schluss_hinweise=[
"Zusammenfassung der Analyseergebnisse",
"Funktion der Szene im Drama",
"Bedeutung fuer die Gesamtdeutung"
],
sprachliche_aspekte=[
"Fachbegriffe der Dramenanalyse",
"Praesens als Analysetempus",
"Korrekte Zitierweise mit Akt/Szene/Zeile"
]
)
# =============================================
# TEMPLATE REGISTRY
# =============================================
TEMPLATES: Dict[str, EHTemplate] = {}
def initialize_templates():
"""Initialize all pre-defined templates."""
global TEMPLATES
TEMPLATES = {
"textanalyse_pragmatisch": get_textanalyse_template(),
"gedichtanalyse": get_gedichtanalyse_template(),
"eroerterung_textgebunden": get_eroerterung_template(),
"prosaanalyse": get_prosaanalyse_template(),
"dramenanalyse": get_dramenanalyse_template(),
}
def get_template(aufgabentyp: str) -> Optional[EHTemplate]:
"""Get a template by Aufgabentyp."""
if not TEMPLATES:
initialize_templates()
return TEMPLATES.get(aufgabentyp)
def list_templates() -> List[Dict]:
"""List all available templates."""
if not TEMPLATES:
initialize_templates()
return [
{
"aufgabentyp": typ,
"name": AUFGABENTYPEN.get(typ, {}).get("name", typ),
"description": AUFGABENTYPEN.get(typ, {}).get("description", ""),
"category": AUFGABENTYPEN.get(typ, {}).get("category", "other"),
}
for typ in TEMPLATES.keys()
]
def get_aufgabentypen() -> Dict:
"""Get all Aufgabentypen definitions."""
return AUFGABENTYPEN
# Initialize on import
initialize_templates()