feat: Aufgaben mit Abbildungen (docling-Markdown), mit Gegenprobe beim Ablesen

Eingebettete Base64-Bilder und Bilddateien werden aus dem Aufgabentext gelöst und nur
der Verstehensstufe als Bild übergeben; sie überträgt jede Abbildung in Text. Eine
zweite, unabhängige Lesung wird Zahl für Zahl verglichen (bei Abweichung entscheidet
eine dritte, sonst reliable=False). Alle weiteren Stufen rechnen mit der Übertragung,
der Report zeigt Original und Übertragung nebeneinander. LLM_MODEL_UNDERSTANDING
wählt das Bildmodell.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-17 17:52:52 +02:00
commit b07dd16143

View file

@ -24,13 +24,16 @@ EINFACHES_VERSTAENDNIS = TaskUnderstanding(
class FakeSession:
"""Liefert vorgegebene Antworten je Antwort-Typ in fester Reihenfolge."""
def __init__(self, specs, reviews, codes=(), understandings=None):
def __init__(self, specs, reviews, codes=(), understandings=None, readings=()):
from core.model_schema import FigureReading
self.queues = {
OptimizationModelSpecification: list(specs),
AssumptionReview: list(reviews),
SolverCode: list(codes),
TaskUnderstanding: list(understandings if understandings is not None else []),
FigureReading: list(readings),
}
self.contents = [] # (Stufe, Inhalt der letzten Nachricht) – prüft, wer Bilder zu sehen bekommt
self.usage = LLMUsage(model="fake", provider="fake")
self.calls = {kind: 0 for kind in self.queues}
self.steps = []
@ -42,6 +45,7 @@ class FakeSession:
def create(self, response_model, messages, step="unbenannt"):
self.letzter_prompt = messages[-1]["content"]
self.contents.append((step, messages[-1]["content"]))
if step == "Extraktion":
self.tasks.append(messages[-1]["content"])
self.calls[response_model] += 1