diff --git a/frontend/src/components/BausteinPanel.vue b/frontend/src/components/BausteinPanel.vue index 7cfaabe..ee75bfe 100644 --- a/frontend/src/components/BausteinPanel.vue +++ b/frontend/src/components/BausteinPanel.vue @@ -138,14 +138,32 @@ function frageZeigen(text) { 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. function prefetchFrage() { if (naechsteFrage.value || prefetchPromise) return - prefetchPromise = pruefeBaustein({ - topic: props.topic, baustein: props.baustein, section: props.section, - provider: props.provider, aktion: 'frage', messages: pruefDialog(), - }) - .then((res) => { naechsteFrage.value = res.frage }) + prefetchPromise = frageHolen() + .then((text) => { naechsteFrage.value = text }) .catch(() => {}) .finally(() => { prefetchPromise = null }) } @@ -175,11 +193,23 @@ async function naechsteFrageZeigen() { prefetchFrage() return } - // Fallback: kein Cache → frisch generieren. - pruefSenden({ aktion: 'frage' }, (res) => { - frageZeigen(res.frage) - prefetchFrage() - }) + // Fallback: kein Cache → frisch holen (mit Dedup). + pruefLoading.value = true + try { + 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() {