diff --git a/html/kidsai/script-new.js b/html/kidsai/script-new.js index a8c6142..5d092e7 100644 --- a/html/kidsai/script-new.js +++ b/html/kidsai/script-new.js @@ -717,18 +717,17 @@ class KidsAIExplorer { // If child has said "don't know" 2 or more times recently, OR asked a question then said don't know, they need help const needsExplanationDueToRepeatedDontKnow = recentDontKnowCount >= 2 || isAskingQuestionThenDontKnowStep; - // Check if child is asking for a definition or explanation - const isAskingForDefinition = answerLower.startsWith('was ist') || answerLower.startsWith('what is') || - answerLower.includes('was bedeutet') || answerLower.includes('what does') || - answerLower.includes('was heißt') || answerLower.includes('what means') || - answerLower.includes('was hat') || answerLower.includes('what has') || - answerLower.includes('wo ist') || answerLower.includes('where is') || - answerLower.includes('wo sind') || answerLower.includes('where are') || - answerLower.includes('wie funktioniert') || answerLower.includes('how does') || - answerLower.includes('warum ist') || answerLower.includes('why is') || - answerLower.includes('was passiert') || answerLower.includes('what happens') || - answerLower.includes('was geschieht') || answerLower.includes('what occurs') || - (answerLower.includes('?') && (answerLower.includes('ist ein') || answerLower.includes('is a'))); + // Use AI to determine if child is asking for information/explanation + let isAskingForDefinition = false; + + // Quick check: if it contains a question mark and isn't just expressing uncertainty + if (answer.includes('?') && !isPureDontKnow && !isExpressingConfusion) { + isAskingForDefinition = true; + } else { + // For non-obvious cases, we'll let the AI determine this in the server response + // The server can detect question patterns better than hard-coded rules + isAskingForDefinition = false; + } let response; diff --git a/html/kidsai/server.js b/html/kidsai/server.js index 9c27c2d..c6c212f 100755 --- a/html/kidsai/server.js +++ b/html/kidsai/server.js @@ -779,6 +779,114 @@ Give a simple, understandable explanation for children. Use everyday examples. E } } + // Use AI to intelligently detect if child is asking a question that needs a direct answer + if (process.env.OPENAI_API_KEY && !isDontKnowResponse && context !== 'repeated_dont_know') { + console.log('🤖 Using AI to analyze if child is asking a question...'); + + try { + const questionDetectionPrompt = isGerman ? + `Analysiere diese Antwort eines Kindes: "${answer}" + +Kontext: Das Kind wurde gefragt: "${question}" + +Bestimme: Stellt das Kind eine direkte Frage, die eine Erklärung braucht? + +Beispiele für JA: +- "Was passiert denn da?" +- "Wie geht das?" +- "Warum ist das so?" +- "Was bedeutet das?" +- "Wo ist das?" + +Beispiele für NEIN: +- "Ich weiß nicht" +- "Vielleicht wegen der Temperatur" +- "Ist es wegen dem Wetter?" +- "Hmm, keine Ahnung" + +Antworte nur mit "JA" oder "NEIN".` : + `Analyze this child's response: "${answer}" + +Context: The child was asked: "${question}" + +Determine: Is the child asking a direct question that needs an explanation? + +Examples of YES: +- "What happens there?" +- "How does that work?" +- "Why is that?" +- "What does that mean?" +- "Where is that?" + +Examples of NO: +- "I don't know" +- "Maybe because of temperature" +- "Is it because of weather?" +- "Hmm, no idea" + +Reply only with "YES" or "NO".`; + + const detectionCompletion = await openai.chat.completions.create({ + model: "gpt-4o-mini", + messages: [ + { + role: "system", + content: questionDetectionPrompt + } + ], + max_tokens: 10, + temperature: 0.1 + }); + + const detectionResult = detectionCompletion.choices[0]?.message?.content?.trim().toUpperCase(); + console.log(`🔍 AI question detection result: "${detectionResult}"`); + + if (detectionResult === 'JA' || detectionResult === 'YES') { + console.log('📤 AI detected a question - providing explanation'); + + const explanationPrompt = isGerman ? + `Das Kind stellt eine direkte Frage und braucht eine Erklärung. + +KIND'S FRAGE: "${answer}" +KONTEXT: Wir haben über "${originalTopic || question}" gesprochen + +Gib eine klare, kindgerechte Antwort. Verwende einfache Sprache und Beispiele. Lade das Kind ein, mehr zu fragen oder selbst zu experimentieren. Beantworte die spezifische Frage des Kindes direkt.` : + `The child is asking a direct question and needs an explanation. + +CHILD'S QUESTION: "${answer}" +CONTEXT: We were discussing "${originalTopic || question}" + +Give a clear, child-friendly answer. Use simple language and examples. Invite the child to ask more or experiment themselves. Answer the child's specific question directly.`; + + const explanationCompletion = await openai.chat.completions.create({ + model: "gpt-4o-mini", + messages: [ + { + role: "system", + content: explanationPrompt + } + ], + max_tokens: 300, + temperature: 0.6 + }); + + const explanationResponse = explanationCompletion.choices[0]?.message?.content?.trim(); + + if (explanationResponse && explanationResponse.length > 10) { + console.log('✅ AI-detected question explanation generated successfully'); + return res.json({ + success: true, + response: explanationResponse, + source: 'OpenAI GPT-4o-mini (AI-Detected Question)' + }); + } + } + } catch (aiError) { + console.log('❌ AI question detection error:', aiError.message); + // Continue with normal flow if AI detection fails + } + } + const contextualPrompt = isGerman ? `Du bist ein Socratic Lernbegleiter für Kinder. Ein Kind hat gerade auf eine Frage geantwortet.