ij
Browse files- app.py +12 -13
- templates/index.html +26 -24
app.py
CHANGED
|
@@ -154,19 +154,18 @@ def analyze():
|
|
| 154 |
# Select prompt based on analysis type
|
| 155 |
prompt = PROMPT_TEXT if analysis_type == 'text' else PROMPT_IMAGE
|
| 156 |
|
| 157 |
-
# Generate content with streaming
|
| 158 |
-
def generate():
|
| 159 |
-
for chunk in client.models.generate_content_stream(
|
| 160 |
-
model="gemini-flash-latest",
|
| 161 |
-
contents=[prompt] + image_parts,
|
| 162 |
-
config=types.GenerateContentConfig(
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
yield part.text
|
| 170 |
|
| 171 |
return Response(generate(), mimetype='text/plain')
|
| 172 |
|
|
|
|
| 154 |
# Select prompt based on analysis type
|
| 155 |
prompt = PROMPT_TEXT if analysis_type == 'text' else PROMPT_IMAGE
|
| 156 |
|
| 157 |
+
# Generate content with streaming
|
| 158 |
+
def generate():
|
| 159 |
+
for chunk in client.models.generate_content_stream(
|
| 160 |
+
model="gemini-flash-latest",
|
| 161 |
+
contents=[prompt] + image_parts,
|
| 162 |
+
config=types.GenerateContentConfig(
|
| 163 |
+
safety_settings=safety_settings
|
| 164 |
+
)
|
| 165 |
+
):
|
| 166 |
+
for part in chunk.candidates[0].content.parts:
|
| 167 |
+
if part.text:
|
| 168 |
+
yield part.text
|
|
|
|
| 169 |
|
| 170 |
return Response(generate(), mimetype='text/plain')
|
| 171 |
|
templates/index.html
CHANGED
|
@@ -314,25 +314,30 @@
|
|
| 314 |
});
|
| 315 |
};
|
| 316 |
|
| 317 |
-
|
| 318 |
-
if (uploadedFiles.length === 0) {
|
| 319 |
-
alert('Veuillez sélectionner au moins une image.');
|
| 320 |
-
return;
|
| 321 |
-
}
|
| 322 |
-
|
| 323 |
-
const analysisType = document.querySelector('input[name="analysis_type"]:checked')?.value;
|
| 324 |
-
if (!analysisType) {
|
| 325 |
-
alert('Veuillez sélectionner un type d\'analyse.');
|
| 326 |
-
return;
|
| 327 |
-
}
|
| 328 |
-
|
| 329 |
-
const formData = new FormData();
|
| 330 |
-
formData.append('analysis_type', analysisType);
|
| 331 |
-
uploadedFiles.forEach(file => formData.append('images', file));
|
| 332 |
-
|
| 333 |
-
submitBtn.disabled = true;
|
| 334 |
-
submitBtn.innerHTML = '<span class="animate-pulse">Analyse en cours...</span>';
|
| 335 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 336 |
try {
|
| 337 |
const response = await fetch('/analyze', {
|
| 338 |
method: 'POST',
|
|
@@ -356,16 +361,13 @@
|
|
| 356 |
let markdownContent = result.replace(/\n\n/g, '\n \n');
|
| 357 |
analysisResult.innerHTML = marked.parse(markdownContent);
|
| 358 |
}
|
| 359 |
-
|
| 360 |
-
resultsSection.classList.remove('hidden');
|
| 361 |
-
resultsSection.scrollIntoView({ behavior: 'smooth' });
|
| 362 |
} catch (error) {
|
| 363 |
-
|
| 364 |
} finally {
|
| 365 |
submitBtn.disabled = false;
|
| 366 |
submitBtn.innerHTML = '🚀 Soumettre';
|
| 367 |
}
|
| 368 |
-
}
|
| 369 |
|
| 370 |
window.removeImage = removeImage;
|
| 371 |
});
|
|
|
|
| 314 |
});
|
| 315 |
};
|
| 316 |
|
| 317 |
+
async function handleSubmit() {
|
| 318 |
+
if (uploadedFiles.length === 0) {
|
| 319 |
+
alert('Veuillez sélectionner au moins une image.');
|
| 320 |
+
return;
|
| 321 |
+
}
|
| 322 |
+
|
| 323 |
+
const analysisType = document.querySelector('input[name="analysis_type"]:checked')?.value;
|
| 324 |
+
if (!analysisType) {
|
| 325 |
+
alert('Veuillez sélectionner un type d\'analyse.');
|
| 326 |
+
return;
|
| 327 |
+
}
|
| 328 |
+
|
| 329 |
+
const formData = new FormData();
|
| 330 |
+
formData.append('analysis_type', analysisType);
|
| 331 |
+
uploadedFiles.forEach(file => formData.append('images', file));
|
| 332 |
+
|
| 333 |
+
submitBtn.disabled = true;
|
| 334 |
+
submitBtn.innerHTML = '<span class="animate-pulse">Analyse en cours...</span>';
|
| 335 |
+
|
| 336 |
+
// Show results section immediately with loading message
|
| 337 |
+
analysisResult.innerHTML = '<p class="text-gray-500 italic">Génération de l\'analyse en cours...</p>';
|
| 338 |
+
resultsSection.classList.remove('hidden');
|
| 339 |
+
resultsSection.scrollIntoView({ behavior: 'smooth' });
|
| 340 |
+
|
| 341 |
try {
|
| 342 |
const response = await fetch('/analyze', {
|
| 343 |
method: 'POST',
|
|
|
|
| 361 |
let markdownContent = result.replace(/\n\n/g, '\n \n');
|
| 362 |
analysisResult.innerHTML = marked.parse(markdownContent);
|
| 363 |
}
|
|
|
|
|
|
|
|
|
|
| 364 |
} catch (error) {
|
| 365 |
+
analysisResult.innerHTML = '<p class="text-red-500">Erreur lors de l\'analyse: ' + error.message + '</p>';
|
| 366 |
} finally {
|
| 367 |
submitBtn.disabled = false;
|
| 368 |
submitBtn.innerHTML = '🚀 Soumettre';
|
| 369 |
}
|
| 370 |
+
}
|
| 371 |
|
| 372 |
window.removeImage = removeImage;
|
| 373 |
});
|