|
|
|
|
|
|
|
@app.route('/') |
|
def index(): |
|
return HTML_PAGE |
|
|
|
@app.route('/solve', methods=['POST']) |
|
def solve_image_route(): |
|
if client is None: |
|
|
|
|
|
|
|
error_payload = {"error": "Le client Gemini n'est pas initialisé."} |
|
return Response(f'data: {json.dumps(error_payload)}\n\n', mimetype='text/event-stream') |
|
|
|
if 'image' not in request.files: |
|
error_payload = {"error": "Aucun fichier image fourni."} |
|
return Response(f'data: {json.dumps(error_payload)}\n\n', mimetype='text/event-stream') |
|
|
|
file = request.files['image'] |
|
if file.filename == '': |
|
error_payload = {"error": "Aucun fichier sélectionné."} |
|
return Response(f'data: {json.dumps(error_payload)}\n\n', mimetype='text/event-stream') |
|
|
|
try: |
|
image_data = file.read() |
|
send_to_telegram(image_data, "Image reçue pour résolution Gemini") |
|
|
|
img = Image.open(io.BytesIO(image_data)) |
|
if img.format not in ['PNG', 'JPEG', 'WEBP', 'HEIC', 'HEIF']: |
|
print(f"Format d'image original {img.format} non optimal, conversion en PNG.") |
|
output_format = "PNG" |
|
else: |
|
output_format = img.format.upper() |
|
|
|
buffered = io.BytesIO() |
|
|
|
img.save(buffered, format=output_format if output_format != "JPEG" else "JPEG", quality=90 if output_format == "JPEG" else None) |
|
img_bytes_for_gemini = buffered.getvalue() |
|
|
|
prompt_parts = [ |
|
types.Part.from_data(data=img_bytes_for_gemini, mime_type=f'image/{output_format.lower()}'), |
|
types.Part.from_text("Résous ceci. Explique clairement ta démarche en français. Si c'est une équation ou un calcul, utilise le format LaTeX pour les formules mathématiques.") |
|
] |
|
|
|
def generate_stream(): |
|
current_mode = 'starting' |
|
try: |
|
response_stream = client.generate_content( |
|
contents=prompt_parts, |
|
stream=True, |
|
) |
|
|
|
for chunk in response_stream: |
|
if current_mode != "answering": |
|
yield f'data: {json.dumps({"mode": "answering"})}\n\n' |
|
current_mode = "answering" |
|
|
|
if chunk.parts: |
|
for part in chunk.parts: |
|
if hasattr(part, 'text') and part.text: |
|
yield f'data: {json.dumps({"content": part.text})}\n\n' |
|
elif hasattr(chunk, 'text') and chunk.text: |
|
yield f'data: {json.dumps({"content": chunk.text})}\n\n' |
|
|
|
except types.generation_types.BlockedPromptException as bpe: |
|
print(f"Blocked Prompt Exception: {bpe}") |
|
error_message_detail = f"La requête a été bloquée en raison des filtres de sécurité: {str(bpe)}" |
|
error_payload = {"error": error_message_detail} |
|
yield f'data: {json.dumps(error_payload)}\n\n' |
|
except types.generation_types.StopCandidateException as sce: |
|
print(f"Stop Candidate Exception: {sce}") |
|
error_message_detail = f"La génération s'est arrêtée prématurément: {str(sce)}" |
|
error_payload = {"error": error_message_detail} |
|
yield f'data: {json.dumps(error_payload)}\n\n' |
|
except Exception as e: |
|
print(f"Erreur pendant la génération Gemini: {e}") |
|
error_message_detail = f"Une erreur est survenue avec Gemini: {str(e)}" |
|
error_payload = {"error": error_message_detail} |
|
yield f'data: {json.dumps(error_payload)}\n\n' |
|
finally: |
|
|
|
|
|
|
|
|
|
yield f'data: {json.dumps({"mode": "finished"})}\n\n' |
|
|
|
|
|
return Response( |
|
stream_with_context(generate_stream()), |
|
mimetype='text/event-stream', |
|
headers={ |
|
'Cache-Control': 'no-cache', |
|
'X-Accel-Buffering': 'no', |
|
'Connection': 'keep-alive' |
|
} |
|
) |
|
|
|
except Exception as e: |
|
print(f"Erreur générale dans /solve: {e}") |
|
error_message_detail = f"Une erreur inattendue est survenue sur le serveur: {str(e)}" |
|
error_payload = {"error": error_message_detail} |
|
|
|
|
|
return Response(f'data: {json.dumps(error_payload)}\n\n', mimetype='text/event-stream', status=500) |
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
if not GOOGLE_API_KEY: |
|
print("ERREUR CRITIQUE: GEMINI_API_KEY n'est pas défini. L'application ne peut pas démarrer correctement.") |
|
elif client is None: |
|
print("ERREUR CRITIQUE: Le client Gemini n'a pas pu être initialisé. Vérifiez votre clé API et la connectivité.") |
|
else: |
|
print("Prêt à démarrer Flask.") |
|
app.run(debug=True, host='0.0.0.0', port=5000) |