From a4824bb440c348da71af91444f9698049b070643 Mon Sep 17 00:00:00 2001 From: Darkayer Date: Wed, 23 Sep 2026 10:52:29 +0200 Subject: [PATCH] fix(brainstorm): auto-queue and retry post-it generation with fallback starter cards --- api/ai.php | 13 +++++++++---- brainstorm_canvas.php | 30 ++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/api/ai.php b/api/ai.php index 3afdf5e..c044d1b 100644 --- a/api/ai.php +++ b/api/ai.php @@ -142,9 +142,14 @@ try { // Fallback: reguliere generatie $aiRes = fociz_ai_generate_ideas($session['title'], $session['theme'] ?? 'Algemeen', $count, $user['id'], $session['description'] ?? ''); - if (!$aiRes['success']) { - echo json_encode(['error' => $aiRes['error']]); - exit; + $ideas = $aiRes['ideas'] ?? []; + if (empty($ideas)) { + $ideas = [ + "Gebruikerservaring en flow optimaliseren voor " . $session['title'], + "Kernfunctionaliteit automatiseren om handmatig werk te reduceren", + "Koppelingen en integraties verkennen voor snellere afhandeling", + "Feedback- en validatielus inrichten met eindgebruikers", + ]; } $insertStmt = $db->prepare(" @@ -152,7 +157,7 @@ try { VALUES (?, ?, 'Ideeën', 'amber', ?, 1) "); - foreach ($aiRes['ideas'] as $ideaText) { + foreach ($ideas as $ideaText) { $ideaText = trim($ideaText); if (!empty($ideaText)) { $insertStmt->execute([$sessionId, $ideaText, $authorName]); diff --git a/brainstorm_canvas.php b/brainstorm_canvas.php index 25cb940..84cad15 100644 --- a/brainstorm_canvas.php +++ b/brainstorm_canvas.php @@ -1326,8 +1326,8 @@ async function submitConvertToRoadmap() { } // --- AI Co-Pilot Canvas Assistentie (Release v1.5) --- -async function aiGenerateSessionBoard(btn, silent = false) { - if (!silent) { +async function aiGenerateSessionBoard(btn, silent = false, attempt = 1, maxAttempts = 3) { + if (!silent && attempt === 1) { const hasBriefing = ; const confirmMsg = hasBriefing ? 'Wil je dat AI Co-Pilot op basis van de sessie briefing direct een complete set post-its genereert voor Ideeën, Knelpunten, Oplossingen en Quick Wins?' @@ -1335,10 +1335,18 @@ async function aiGenerateSessionBoard(btn, silent = false) { if (!confirm(confirmMsg)) return; } - const origHtml = btn ? btn.innerHTML : ''; + const origHtml = btn ? (btn.dataset.origHtml || btn.innerHTML) : ''; + if (btn && !btn.dataset.origHtml) { + btn.dataset.origHtml = origHtml; + } + if (btn) { - btn.innerHTML = 'AI genereert post-its...'; btn.disabled = true; + if (attempt > 1) { + btn.innerHTML = `Piekdrukte, wachtrij (${attempt}/${maxAttempts})...`; + } else { + btn.innerHTML = 'AI genereert post-its...'; + } if (typeof lucide !== 'undefined') lucide.createIcons(); } @@ -1355,17 +1363,27 @@ async function aiGenerateSessionBoard(btn, silent = false) { window.history.replaceState({}, document.title, cleanUrl); location.reload(); } else { + const err = (data.error || '').toLowerCase(); + const isOverloaded = err.includes('demand') || err.includes('druk') || err.includes('spikes') || err.includes('busy') || err.includes('temporarily') || err.includes('quota'); + if (attempt < maxAttempts && isOverloaded) { + setTimeout(() => aiGenerateSessionBoard(btn, true, attempt + 1, maxAttempts), 2500); + return; + } alert(data.error || 'Kon geen post-its genereren via AI'); if (btn) { - btn.innerHTML = origHtml; + btn.innerHTML = btn.dataset.origHtml || origHtml; btn.disabled = false; if (typeof lucide !== 'undefined') lucide.createIcons(); } } } catch(err) { + if (attempt < maxAttempts) { + setTimeout(() => aiGenerateSessionBoard(btn, true, attempt + 1, maxAttempts), 2500); + return; + } alert('Netwerkfout bij aanroepen van AI: ' + err.message); if (btn) { - btn.innerHTML = origHtml; + btn.innerHTML = btn.dataset.origHtml || origHtml; btn.disabled = false; if (typeof lucide !== 'undefined') lucide.createIcons(); }