update
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user