This commit is contained in:
team3
2026-06-15 18:27:08 +02:00
parent 466818c47c
commit b592944497

View File

@@ -138,14 +138,32 @@ function frageZeigen(text) {
pruefPhase.value = 'frage_offen' pruefPhase.value = 'frage_offen'
} }
// Dedup: schon gestellte Fragen erkennen (Generator wiederholt sich auf kleinen Bausteinen).
function normFrage(t) { return (t || '').toLowerCase().replace(/\s+/g, ' ').trim() }
function gestellteFragen() {
return new Set(pruefMessages.value.filter((m) => m.kind === 'frage').map((m) => normFrage(m.content)))
}
// Holt eine Frage; bis zu 3 Versuche, eine NICHT wiederholte zu bekommen. Sonst best-effort die letzte.
async function frageHolen() {
const gestellt = gestellteFragen()
let letzte = null
for (let i = 0; i < 3; i++) {
const res = await pruefeBaustein({
topic: props.topic, baustein: props.baustein, section: props.section,
provider: props.provider, aktion: 'frage', messages: pruefDialog(),
})
letzte = res.frage
if (!gestellt.has(normFrage(res.frage))) return res.frage
}
return letzte
}
// Nächste Frage im Hintergrund vorbereiten (überbrückt die Wartezeit). Ohne pruefLoading/pruefRun. // Nächste Frage im Hintergrund vorbereiten (überbrückt die Wartezeit). Ohne pruefLoading/pruefRun.
function prefetchFrage() { function prefetchFrage() {
if (naechsteFrage.value || prefetchPromise) return if (naechsteFrage.value || prefetchPromise) return
prefetchPromise = pruefeBaustein({ prefetchPromise = frageHolen()
topic: props.topic, baustein: props.baustein, section: props.section, .then((text) => { naechsteFrage.value = text })
provider: props.provider, aktion: 'frage', messages: pruefDialog(),
})
.then((res) => { naechsteFrage.value = res.frage })
.catch(() => {}) .catch(() => {})
.finally(() => { prefetchPromise = null }) .finally(() => { prefetchPromise = null })
} }
@@ -175,11 +193,23 @@ async function naechsteFrageZeigen() {
prefetchFrage() prefetchFrage()
return return
} }
// Fallback: kein Cache → frisch generieren. // Fallback: kein Cache → frisch holen (mit Dedup).
pruefSenden({ aktion: 'frage' }, (res) => { pruefLoading.value = true
frageZeigen(res.frage) try {
prefetchFrage() const text = await frageHolen()
}) if (text) {
frageZeigen(text)
pruefScroll()
nextTick(() => pruefInputEl.value?.focus())
prefetchFrage()
} else {
pruefMessages.value.push({ role: 'assistant', kind: 'fehler', content: 'Keine neue Frage — bitte erneut.' })
}
} catch {
pruefMessages.value.push({ role: 'assistant', kind: 'fehler', content: 'Hat nicht geklappt — bitte erneut.' })
} finally {
pruefLoading.value = false
}
} }
function nachfragen() { function nachfragen() {