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 = = !empty($session['description']) ? 'true' : 'false' ?>;
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();
}