from flask import Flask, render_template, request, jsonify import os import tempfile from PIL import Image from google import genai from google.genai import types import uuid app = Flask(__name__) app.config['UPLOAD_FOLDER'] = 'static/uploads' app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16 MB max upload # Ensure upload directory exists os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) # Google Gemini API setup def init_gemini(): api_key = os.environ.get('GOOGLE_API_KEY') if not api_key: print("WARNING: GOOGLE_API_KEY environment variable not set") return None return genai.Client(api_key=api_key) client = init_gemini() # Prompts for analysis ICONOGRAPHIC_PROMPT = """ je souhaite faire mon travail d'espagnol qui consiste à de l'analyse de documents iconographique. j'aimerais que tu le phase en respectant scrupuleusement la méthodologie suivante. j'aimerais que tu fasses ce travail en espagnol en donnant également la traduction française Metodología del comentario de un documento iconográfico Un documento iconográfico es un documento centrado en una imagen. Puede ser: una foto, un cuadro, una publicidad, un dibujo, un tebeo, una tira dibujada, una caricatura, etc. Su comentario respeta las etapas siguientes: la presentación, la descripción, el análisis y la conclusión. La presentación Se trata de resaltar los elementos esenciales para identificar el documento: El título (si existe) La naturaleza (si es una foto/dibujo/cuadro, en color o blanco y negro) El autor (el fotógrafo/el dibujante/el publicista...) La fuente (si existe) El tema evocado La descripción Se trata de decir lo que vemos. Dominar el vocabulario relativo a la imagen. Dominar el vocabulario de la situación en el espacio (arriba, abajo, delante, detrás, etc.) Conocer la organización interna de la descripción. ¿Qué debemos hacer concretamente? Determinar el número de planos o términos. (Ej: La imagen tiene dos planos/tres planos/un plan único) Hacer la descripción plano por plano y acabar antes de pasar al siguiente si hay más de un plano. Ej: en el primer plano vemos... Ordenar la descripción de cada plano ( a la derecha, a la izquierda, arriba, abajo, delante, detrás, en el centro, a lo lejos... ¿Qué se debe describir? Los protagonistas (los personajes): Los protagonistas Sexo, edad (hombre o mujer, joven o adulto) Las posturas (de pie, sentado, arrodillado, etc.) Los vestidos (ropas) Los rasgos físicos (color de pelo, gordo, flaco, etc.) Los rasgos sicológicos (triste, optimista, activo, pasivo, etc.) Las actitudes (está riendo, triste, llorando, contento, etc.) Las acciones (lo que están haciendo) Los objetos alrededor, los colores (fríos o cálidos), los contrastes... El análisis Interpretamos y comentamos los elementos de la descripción para comprender el mensaje del autor. La interpretación debe apoyarse en la descripción porque no se trata de un comentario libre. Empleamos fórmulas subjetivas porque expresamos hipótesis e impresiones. Ej: Cuando examinamos...podemos decir que.../ la postura de..., los vestidos...nos permiten imaginar que.../ lo que nos llama la atención es... porque/ los colores cálidos sugieren que... La conclusión Se trata de hacer un balance (resumen) de lo dicho de dar una impresión personal. Así: Anunciamos la conclusión: para concluir/ en suma/en conclusión... podemos decir que... Precisamos el medio de expresión utilizado: a través de esta foto/mediante este dibujo... Anunciamos la intención del autor: el dibujante quiere denunciar/ el fotógrafo pretende criticar/ el pintor quiere relevar, sensibilizar, mostrar. Dar la impresión personal: esta foto (no) me parece interesante/escandaloso/pertinente. Justificamos nuestra impresión: porque revela una realidad social/política/cultural... Un modelo: a través de este cuadro, el pintor quiere denunciar las injusticias sociales en África. El cuadro me parece interesante porque releva un fenómeno social recurrente que incita las autoridades a la responsabilidad. La propia imagen ilustra muy bien el tema de las injusticias entre ricos y ricos... """ TEXT_PROMPT = """ Je souhaite faire une analyse de texte en espagnol en respectant scrupuleusement la méthodologie suivante. J'aimerais que tu fasses ce travail en espagnol en donnant également la traduction française. Metodología del comentario de texto en español: 1. Presentación del documento - Autor y contexto histórico - Naturaleza del texto (literario, periodístico, discurso, etc.) - Tema principal 2. Análisis de la estructura - División en partes lógicas - Identificación de la organización de las ideas 3. Análisis del contenido - Ideas principales y secundarias - Intención del autor - Recursos lingüísticos utilizados - Vocabulario y campo semántico 4. Conclusión - Síntesis del análisis - Aportación personal - Relevancia del texto en su contexto Por favor, analiza este texto según la metodología indicada, proporcionando el análisis completo en español y su traducción al francés. """ def generate_response(file_path, file_type): """Generate response using Gemini API based on file type""" try: if not client: return "Error: Google API key not configured properly." if file_type == 'image': image_data = Image.open(file_path) response = client.models.generate_content( model="gemini-2.5-flash-preview-04-17", contents=[image_data, ICONOGRAPHIC_PROMPT], config=types.GenerateContentConfig( thinking_config=types.ThinkingConfig( thinking_budget=8000 ) ), ) return response.candidates[0].content.parts[0].text.strip() elif file_type == 'text': with open(file_path, 'r', encoding='utf-8') as f: text_content = f.read() response = client.models.generate_content( model="gemini-2.5-flash-preview-04-17", contents=[text_content, TEXT_PROMPT], config=types.GenerateContentConfig( thinking_config=types.ThinkingConfig( thinking_budget=8000 ) ), ) return response.candidates[0].content.parts[0].text.strip() except Exception as e: print(f"Error generating response: ") return f"Error durante el análisis: " @app.route('/') def index(): return render_template('index.html') @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: return jsonify({'error': 'No file part'}), 400 file = request.files['file'] file_type = request.form.get('fileType', 'image') if file.filename == '': return jsonify({'error': 'No selected file'}), 400 if file: # Generate a unique filename filename = f"{uuid.uuid4()}_{file.filename}" file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) # Generate analysis analysis = generate_response(file_path, file_type) return jsonify({ 'success': True, 'file_url': f"/static/uploads/{filename}", 'analysis': analysis }) if __name__ == '__main__': app.run(debug=True)