/** * WIJZIGING IN P1B_WP3.html * ───────────────────────────────────────────────────────────────── * Zoek deze functie (rond regel 575): * * async function callClaude(prompt, onChunk, onDone) { * try { * const res = await fetch('https://api.anthropic.com/v1/messages', { * method: 'POST', * headers: { 'content-type': 'application/json' }, * body: JSON.stringify({ * model: 'claude-sonnet-4-20250514', * max_tokens: 1200, * system: buildSystemPrompt(), * messages: [{ role: 'user', content: prompt }], * stream: true, * }) * }); * * VERVANG door dit: */ async function callClaude(prompt, onChunk, onDone) { try { // ── GEWIJZIGD: via eigen proxy, geen API key in browser ── const res = await fetch('/.netlify/functions/claude-proxy', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ model: 'claude-sonnet-4-20250514', max_tokens: 1200, system: buildSystemPrompt(), messages: [{ role: 'user', content: prompt }], // stream: true ← verwijderd, proxy ondersteunt geen streaming }) }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error?.message || `HTTP ${res.status}`); } // ── GEWIJZIGD: geen streaming reader, direct JSON lezen ── const data = await res.json(); const fullText = data.content?.[0]?.text || ''; // Simuleer streaming output voor de terminal UI (karakter voor karakter) for (let i = 0; i < fullText.length; i++) { if (onChunk) onChunk(fullText[i]); // Kleine delay voor terminal effect (optioneel — verwijder als te traag) if (i % 20 === 0) await new Promise(r => setTimeout(r, 1)); } if (onDone) onDone(fullText, data.usage?.input_tokens || 0, data.usage?.output_tokens || 0); } catch (err) { throw err; // Wordt afgevangen door bestaande handleError() functie } }