...
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 = `
`;
} 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() {}
...