update
This commit is contained in:
@@ -80,6 +80,8 @@ const pruefLoading = ref(false)
|
|||||||
const aktuelleFrage = ref('') // ankert Bewertung/Diskussion
|
const aktuelleFrage = ref('') // ankert Bewertung/Diskussion
|
||||||
const letztesFeedback = ref('') // Kontext für die Diskussion über eine Bewertung
|
const letztesFeedback = ref('') // Kontext für die Diskussion über eine Bewertung
|
||||||
const scoreVorFrage = ref(0) // Score, als die aktuelle Frage gestellt wurde → driftfreies (Re-)Bewerten
|
const scoreVorFrage = ref(0) // Score, als die aktuelle Frage gestellt wurde → driftfreies (Re-)Bewerten
|
||||||
|
const naechsteFrage = ref(null) // im Hintergrund vorbereitete nächste Frage (Prefetch)
|
||||||
|
let prefetchPromise = null // laufender Hintergrund-Abruf (verhindert Doppel-Prefetch)
|
||||||
const pruefMessagesEl = ref(null)
|
const pruefMessagesEl = ref(null)
|
||||||
const pruefInputEl = ref(null)
|
const pruefInputEl = ref(null)
|
||||||
const pruefStick = ref(true) // nur auto-scrollen, wenn der Nutzer (fast) unten ist
|
const pruefStick = ref(true) // nur auto-scrollen, wenn der Nutzer (fast) unten ist
|
||||||
@@ -127,14 +129,56 @@ async function pruefSenden(payload, onOk) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Frage anzeigen (frisch oder vorgemerkt). scoreVorFrage = LIVE-Score zur Anzeigezeit (driftfrei).
|
||||||
|
function frageZeigen(text) {
|
||||||
|
aktuelleFrage.value = text
|
||||||
|
letztesFeedback.value = ''
|
||||||
|
scoreVorFrage.value = st.value.gute_antworten
|
||||||
|
pruefMessages.value.push({ role: 'assistant', kind: 'frage', content: text })
|
||||||
|
pruefPhase.value = 'frage_offen'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 })
|
||||||
|
.catch(() => {})
|
||||||
|
.finally(() => { prefetchPromise = null })
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erste Frage (Phase idle): frisch generieren, dann die nächste vorbereiten.
|
||||||
function frageAnfordern() {
|
function frageAnfordern() {
|
||||||
if (pruefLoading.value) return
|
if (pruefLoading.value) return
|
||||||
pruefSenden({ aktion: 'frage' }, (res) => {
|
pruefSenden({ aktion: 'frage' }, (res) => {
|
||||||
aktuelleFrage.value = res.frage
|
frageZeigen(res.frage)
|
||||||
letztesFeedback.value = ''
|
prefetchFrage()
|
||||||
scoreVorFrage.value = res.gute_antworten // Basis für (Re-)Bewertung dieser Frage
|
})
|
||||||
pruefMessages.value.push({ role: 'assistant', kind: 'frage', content: res.frage })
|
}
|
||||||
pruefPhase.value = 'frage_offen'
|
|
||||||
|
// „Nächste Frage": vorgemerkte sofort zeigen, sonst auf den Prefetch warten, sonst frisch holen.
|
||||||
|
async function naechsteFrageZeigen() {
|
||||||
|
if (pruefLoading.value) return
|
||||||
|
if (!naechsteFrage.value && prefetchPromise) {
|
||||||
|
pruefLoading.value = true
|
||||||
|
try { await prefetchPromise } finally { pruefLoading.value = false }
|
||||||
|
}
|
||||||
|
if (naechsteFrage.value) {
|
||||||
|
const text = naechsteFrage.value
|
||||||
|
naechsteFrage.value = null
|
||||||
|
frageZeigen(text)
|
||||||
|
pruefScroll()
|
||||||
|
nextTick(() => pruefInputEl.value?.focus())
|
||||||
|
prefetchFrage()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Fallback: kein Cache → frisch generieren.
|
||||||
|
pruefSenden({ aktion: 'frage' }, (res) => {
|
||||||
|
frageZeigen(res.frage)
|
||||||
|
prefetchFrage()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +328,7 @@ function neuBewerten() {
|
|||||||
<template v-else>
|
<template v-else>
|
||||||
<button class="bp-action" :disabled="pruefLoading || !pruefInput.trim()" @click="nachfragen">Nachhaken</button>
|
<button class="bp-action" :disabled="pruefLoading || !pruefInput.trim()" @click="nachfragen">Nachhaken</button>
|
||||||
<button class="bp-action" :disabled="pruefLoading" @click="neuBewerten">Neu bewerten</button>
|
<button class="bp-action" :disabled="pruefLoading" @click="neuBewerten">Neu bewerten</button>
|
||||||
<button class="bp-action primary" :disabled="pruefLoading" @click="frageAnfordern">Nächste Frage</button>
|
<button class="bp-action primary" :disabled="pruefLoading" @click="naechsteFrageZeigen">Nächste Frage</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user