Bug Cards

This commit is contained in:
2026-05-02 19:59:05 +02:00
parent 4e823bc403
commit 8b024bf0f3
2 changed files with 45 additions and 8 deletions

View File

@@ -184,6 +184,8 @@ def build_lesson_reply(db: Session, student_id: int, user_message: str, lesson_c
"Si un nombre n'est pas affiché ou autorisé dans ce contexte, tu n'en parles pas. " "Si un nombre n'est pas affiché ou autorisé dans ce contexte, tu n'en parles pas. "
"Ne propose jamais 'un autre nombre' si le contexte ne donne pas cet autre nombre. " "Ne propose jamais 'un autre nombre' si le contexte ne donne pas cet autre nombre. "
"Si l'élève veut continuer mais que la card courante est terminée, mets `advance_lesson_step` à true. " "Si l'élève veut continuer mais que la card courante est terminée, mets `advance_lesson_step` à true. "
"Quand `advance_lesson_step` vaut true, ta réponse doit seulement dire: "
"`Très bien, on passe à la suite.` Ne répète pas le nombre de la card terminée. "
"N'utilise pas l'historique des séances précédentes pour choisir le thème de ta réponse. " "N'utilise pas l'historique des séances précédentes pour choisir le thème de ta réponse. "
"Ta réponse visible doit être très courte: maximum 24 mots, 1 phrase d'explication " "Ta réponse visible doit être très courte: maximum 24 mots, 1 phrase d'explication "
"puis éventuellement 1 question courte. Évite les phrases longues avec plusieurs propositions. " "puis éventuellement 1 question courte. Évite les phrases longues avec plusieurs propositions. "

View File

@@ -730,15 +730,40 @@ function TutorApp({ currentUser, onLogout }) {
} }
function goToNextLessonStep() { function goToNextLessonStep() {
const nextStep = getNextLessonStep()
if (!nextStep) return
setActiveAssetIndex(nextStep.assetIndex)
setActiveSectionIndex(nextStep.sectionIndex)
}
function getNextLessonStep() {
const sectionCount = activeSections.length || 1 const sectionCount = activeSections.length || 1
if (activeSectionIndex < sectionCount - 1) { if (activeSectionIndex < sectionCount - 1) {
setActiveSectionIndex((index) => index + 1) return {
return assetIndex: activeAssetIndex,
sectionIndex: activeSectionIndex + 1,
asset: activeAsset,
section: activeSections[activeSectionIndex + 1],
}
} }
if (activeAssetIndex < lessonAssets.length - 1) { if (activeAssetIndex < lessonAssets.length - 1) {
setActiveAssetIndex((index) => index + 1) const nextAsset = lessonAssets[activeAssetIndex + 1]
setActiveSectionIndex(0) return {
assetIndex: activeAssetIndex + 1,
sectionIndex: 0,
asset: nextAsset,
section: nextAsset?.sections?.[0] || null,
}
} }
return null
}
function buildNextCardInstruction(nextStep) {
const title = nextStep?.section?.title || nextStep?.asset?.title || 'la suite'
if (title.toLowerCase().startsWith('exemple')) {
return `Très bien, on passe à ${title}. Lis seulement le nombre affiché.`
}
return `Très bien, on passe à ${title}. Regarde cette card.`
} }
function getSectionKey(asset, section) { function getSectionKey(asset, section) {
@@ -926,15 +951,25 @@ function TutorApp({ currentUser, onLogout }) {
...getLessonContextPayload(), ...getLessonContextPayload(),
}), }),
}) })
appendMessage('assistant', data.reply)
setCurrentInstruction(data.reply)
if (data.advance_lesson_step) { if (data.advance_lesson_step) {
rememberActiveCard({ score: 100, validated: true }) rememberActiveCard({ score: 100, validated: true })
goToNextLessonStep() const nextStep = getNextLessonStep()
const transitionReply = nextStep
? buildNextCardInstruction(nextStep)
: 'Très bien, cette fiche est terminée.'
if (nextStep) {
setActiveAssetIndex(nextStep.assetIndex)
setActiveSectionIndex(nextStep.sectionIndex)
}
appendMessage('assistant', transitionReply)
setCurrentInstruction(transitionReply)
speak(transitionReply)
} else { } else {
rememberActiveCard({ score: 40, validated: false }) rememberActiveCard({ score: 40, validated: false })
appendMessage('assistant', data.reply)
setCurrentInstruction(data.reply)
speak(data.reply)
} }
speak(data.reply)
} }
async function transcribeRecording(audioBlob, mimeType, { autoSend = false } = {}) { async function transcribeRecording(audioBlob, mimeType, { autoSend = false } = {}) {