... async function callGeminiAPI(prompt, title, type, imageData = null) { const langData = translations.fr; // ----------------------------------------------------- // >>> IMPORTANT: YOUR API KEY IS NOW INSERTED HERE <<< // ----------------------------------------------------- const apiKey = "AIzaSyBGWOfzddC82pRE3AuNfaS4pQM8ZvSrVxI"; // ----------------------------------------------------- const modal = document.getElementById('gemini-modal'); const modalTitle = document.getElementById('gemini-modal-title'); const loading = document.getElementById('gemini-loading'); const textResponse = document.getElementById('gemini-response-text'); const imageResponse = document.getElementById('gemini-response-image'); const downloadButton = document.getElementById('download-content-button'); modalTitle.textContent = title; textResponse.innerHTML = ''; imageResponse.innerHTML = ''; downloadButton.classList.add('hidden'); lastGeneratedText = ""; lastGeneratedTitle = ""; loading.style.display = 'block'; modal.classList.remove('hidden'); modal.classList.add('flex'); const isImageRequest = type.includes('image'); // NOTE: The models below are "preview" models and may need updates over time. const model = isImageRequest ? 'gemini-2.5-flash-image-preview' : 'gemini-2.5-flash-preview-05-20'; const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`; const parts = [{ text: prompt }]; if (imageData) { parts.push({ inlineData: { mimeType: imageData.mimeType, data: imageData.data } }); } const payload = { contents: [{ parts }] }; if (isImageRequest) { payload.generationConfig = { responseModalities: ['IMAGE'] }; } try { const response = await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); if (!response.ok) { // Read and log the error response body for debugging const errorBody = await response.text(); console.error('Gemini API HTTP Error:', response.status, errorBody); throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); if (isImageRequest) { const base64Data = result?.candidates?.[0]?.content?.parts?.find(p => p.inlineData)?.inlineData?.data; if (base64Data) { imageResponse.innerHTML = `${title}`; } else { textResponse.textContent = result.candidates?.[0]?.content?.parts?.[0]?.text || langData.geminiError; } } else { const text = result.candidates?.[0]?.content?.parts?.[0]?.text; if (text) { lastGeneratedText = text; lastGeneratedTitle = title.replace(/[^a-z0-9]/gi, '_').toLowerCase(); textResponse.innerHTML = text.replace(/\*\*(.*?)\*\*/g, '$1').replace(/\n/g, '
'); downloadButton.classList.remove('hidden'); } else { textResponse.textContent = langData.geminiError; } } } catch (error) { console.error('Gemini API call failed:', error); textResponse.textContent = langData.geminiRetryError; } finally { loading.style.display = 'none'; } } function attachObserver() {} ...