🔧 Fix Socratic teaching logic

- Fixed the critical issue where AI was giving direct answers instead of asking guiding questions
- Now when child answers 'no' or 'don't know', system calls /api/ask for Socratic guidance
- When child gives substantial answers, system calls /api/respond-to-answer for validation
- Applied fix to both chat mode and step-by-step mode
- Enhanced answer analysis to detect negative/unknown responses vs substantial answers
- Updated response handling to work with both guidance format and simple response format

This ensures the AI acts as a true Socratic teacher, guiding discovery rather than giving answers.
This commit is contained in:
root
2025-06-30 11:32:19 +02:00
parent 7c98ab3094
commit b7c7bbfcb1

View File

@@ -415,21 +415,48 @@ class KidsAIExplorer {
? this.currentSteps[stepIndex].text
: 'the current question';
console.log('📤 Sending request to /api/respond-to-answer:', { answer, currentQuestion });
// Analyze the answer to determine the appropriate response type
const answerLower = answer.toLowerCase().trim();
const isNegative = answerLower === 'no' || answerLower === 'nein' || answerLower === 'nope' || answerLower === 'nei';
const isDontKnow = answerLower.includes("don't know") || answerLower.includes('weiß nicht') || answerLower.includes('keine ahnung') || answer.trim().length < 3;
// Call server API for contextual response
const response = await fetch('/api/respond-to-answer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
answer: answer,
question: currentQuestion,
language: this.currentLanguage,
stepIndex: stepIndex
})
});
let response;
if (isNegative || isDontKnow) {
// For "no" or "don't know" answers, get Socratic guidance questions
console.log('📤 Sending guidance request to /api/ask for Socratic questioning');
const guidancePrompt = this.currentLanguage === 'de'
? `Ein Kind hat "${answer}" geantwortet auf die Frage "${currentQuestion}". Führe es durch Socratic Fragen zur Entdeckung, ohne direkte Antworten zu geben.`
: `A child answered "${answer}" to the question "${currentQuestion}". Guide them through Socratic questions to discovery without giving direct answers.`;
response = await fetch('/api/ask', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
question: guidancePrompt,
language: this.currentLanguage
})
});
} else {
// For substantial answers, acknowledge and validate
console.log('📤 Sending validation request to /api/respond-to-answer');
response = await fetch('/api/respond-to-answer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
answer: answer,
question: currentQuestion,
language: this.currentLanguage,
stepIndex: stepIndex
})
});
}
console.log('📥 Server response status:', response.status);
@@ -440,7 +467,25 @@ class KidsAIExplorer {
const data = await response.json();
console.log('✅ Server response data:', data);
if (data.success && data.response) {
let responseContent = '';
if (data.success) {
if (data.guidance && data.guidance.steps) {
// Response from /api/ask with Socratic guidance steps
const steps = data.guidance.steps.slice(0, 3); // Limit to 3 steps
responseContent = steps.map((step, index) =>
`<p><strong>${index + 1}.</strong> ${step.text}</p>`
).join('');
} else if (data.response) {
// Simple response from /api/respond-to-answer
responseContent = `<p>${data.response}</p>`;
} else {
// Fallback
responseContent = this.currentLanguage === 'de'
? '<p>🤔 Das ist eine interessante Frage! Lass uns zusammen darüber nachdenken...</p>'
: '<p>🤔 That\'s an interesting question! Let\'s think about it together...</p>';
}
responseDiv.innerHTML = `
<div class="ai-response-content">
<div class="message-header">
@@ -448,7 +493,7 @@ class KidsAIExplorer {
<span class="ai-label">${this.getTranslation('ai-teacher')}</span>
</div>
<div class="message-content">
<p>${data.response}</p>
${responseContent}
</div>
</div>
`;
@@ -509,26 +554,49 @@ class KidsAIExplorer {
// Get the original topic for better context
const originalQuestion = this.questionInput ? this.questionInput.value.trim() : '';
console.log('📤 Sending chat request to /api/respond-to-answer:', { answer, currentQuestion, originalQuestion });
// Analyze the answer to determine the appropriate response type
const answerLower = answer.toLowerCase().trim();
const isNegative = answerLower === 'no' || answerLower === 'nein' || answerLower === 'nope' || answerLower === 'nei';
const isDontKnow = answerLower.includes("don't know") || answerLower.includes('weiß nicht') || answerLower.includes('keine ahnung') || answer.trim().length < 3;
// Call server API for contextual response
const response = await fetch('/api/respond-to-answer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
answer: answer,
question: currentQuestion,
originalTopic: originalQuestion,
language: this.currentLanguage,
stepIndex: questionIndex,
context: 'guided_learning_conversation',
instructions: this.currentLanguage === 'de'
? 'Du bist ein geduldiger Lernbegleiter für Kinder. Gib NIEMALS direkte Antworten. Stelle stattdessen Folgefragen, die das Kind zum Nachdenken anregen. Verwende die Sokratische Methode - führe das Kind durch Fragen zur Entdeckung. Sei ermutigend und neugierig.'
: 'You are a patient learning companion for children. NEVER give direct answers. Instead, ask follow-up questions that encourage the child to think deeper. Use the Socratic method - guide the child to discovery through questions. Be encouraging and curious.'
})
});
let response;
if (isNegative || isDontKnow) {
// For "no" or "don't know" answers, get Socratic guidance questions
console.log('📤 Sending guidance request to /api/ask for Socratic questioning');
const guidancePrompt = this.currentLanguage === 'de'
? `Ein Kind hat "${answer}" geantwortet auf die Frage "${currentQuestion}" über das Thema "${originalQuestion}". Führe es durch Socratic Fragen zur Entdeckung, ohne direkte Antworten zu geben.`
: `A child answered "${answer}" to the question "${currentQuestion}" about the topic "${originalQuestion}". Guide them through Socratic questions to discovery without giving direct answers.`;
response = await fetch('/api/ask', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
question: guidancePrompt,
language: this.currentLanguage
})
});
} else {
// For substantial answers, acknowledge and validate
console.log('📤 Sending validation request to /api/respond-to-answer');
response = await fetch('/api/respond-to-answer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
answer: answer,
question: currentQuestion,
originalTopic: originalQuestion,
language: this.currentLanguage,
stepIndex: questionIndex
})
});
}
console.log('📥 Chat server response status:', response.status);
@@ -539,7 +607,25 @@ class KidsAIExplorer {
const data = await response.json();
console.log('✅ Chat server response data:', data);
if (data.success && data.response) {
let responseContent = '';
if (data.success) {
if (data.guidance && data.guidance.steps) {
// Response from /api/ask with Socratic guidance steps
const steps = data.guidance.steps.slice(0, 3); // Limit to 3 steps
responseContent = steps.map((step, index) =>
`<p><strong>${index + 1}.</strong> ${step.text}</p>`
).join('');
} else if (data.response) {
// Simple response from /api/respond-to-answer
responseContent = `<p>${data.response}</p>`;
} else {
// Fallback
responseContent = this.currentLanguage === 'de'
? '<p>🤔 Das ist eine interessante Frage! Lass uns zusammen darüber nachdenken...</p>'
: '<p>🤔 That\'s an interesting question! Let\'s think about it together...</p>';
}
// Add AI response bubble
const responseBubble = document.createElement('div');
responseBubble.className = 'chat-message ai-message';
@@ -549,7 +635,7 @@ class KidsAIExplorer {
<span class="ai-label">${this.getTranslation('ai-teacher')}</span>
</div>
<div class="message-content">
<p>${data.response}</p>
${responseContent}
</div>
`;