feat: implement AI-driven learning content generation service and interactive leaderboard functionality

This commit is contained in:
RaymondVerhoef
2026-05-11 20:16:56 +02:00
parent 0cf5758742
commit 2597dc751a
9 changed files with 727 additions and 176 deletions

View File

@@ -12,18 +12,18 @@ export const anthropicApi = {
// Check if simulation mode is on
const useSimulation = storage.get('admin:use_simulation') === true;
if (useSimulation) {
console.log('[API] Simulatie mode actief. Mock data wordt geretourneerd.');
console.log('[API] Simulation mode active. Mock data will be returned.');
return await simulateResponse();
}
const apiKey = storage.get('admin:anthropic_key') || import.meta.env.VITE_ANTHROPIC_API_KEY;
if (!apiKey) {
throw new Error('Geen Anthropic API key gevonden. Ga naar Admin -> Settings.');
throw new Error('No Anthropic API key found. Please configure it in Admin -> Settings.');
}
// Model is configurable from Admin > Settings, defaults to the original spec model
const model = storage.get('admin:model') || DEFAULT_MODEL;
console.log(`[API] Aanroep met model: ${model}`);
console.log(`[API] Calling with model: ${model}`);
let retries = 0;
while (retries <= maxRetries) {

View File

@@ -156,3 +156,38 @@ Apply the refinement and return the complete updated JSON object using the same
export function deleteCachedContent(topicId) {
storage.remove(getContentCacheKey(topicId));
}
/**
* Generate a new custom topic metadata on the fly from user input.
*/
export async function generateCustomTopic(label) {
const prompt = `A user wants to learn about "${label}".
Create a short description (2-3 sentences) and categorize it.
Return ONLY a JSON object with this structure:
{
"label": "Polished topic title",
"type": "concept", // one of: concept, role, process, fact
"description": "Short description"
}`;
const responseText = await anthropicApi.generateContent(
"You are a knowledge graph AI categorizing topics.",
prompt
);
let newTopic;
try {
const jsonMatch = responseText.match(/\{[\s\S]*\}/);
newTopic = JSON.parse(jsonMatch ? jsonMatch[0] : responseText);
newTopic.id = 'custom_' + Date.now().toString(36);
} catch (e) {
throw new Error('Could not process custom topic. Please try again.');
}
// Add to global knowledge base so others can see it too
const topics = storage.get('kb:topics', []);
storage.set('kb:topics', [...topics, newTopic]);
return newTopic;
}