import os import time import gradio as gr import google.generativeai as genai from mimetypes import MimeTypes # Configurar la API de Gemini genai.configure(api_key=os.environ["GEMINI_API_KEY"]) # Ruta personalizada para los archivos subidos UPLOAD_DIR = os.path.join(os.getcwd(), "uploads") # Crea una carpeta "uploads" en el directorio actual # Asegúrate de que la carpeta de subida exista if not os.path.exists(UPLOAD_DIR): os.makedirs(UPLOAD_DIR) # Función que sube y procesa archivos def upload_and_process_file(file): """ Sube y procesa un archivo para usarlo con el modelo de Gemini. Detecta automáticamente el tipo MIME del archivo. Procesa imágenes, PDFs y archivos de texto. """ # Guardar el archivo en la carpeta 'uploads' file_path = os.path.join(UPLOAD_DIR, file.name) with open(file_path, "wb") as f: f.write(file.read()) # Detectar el tipo MIME del archivo mime = MimeTypes() mime_type, _ = mime.guess_type(file_path) if not mime_type: raise ValueError("No se pudo determinar el tipo MIME del archivo.") # Subir el archivo a Gemini print(f"Subiendo el archivo '{file_path}' con MIME type '{mime_type}'...") uploaded_file = genai.upload_file(file_path, mime_type=mime_type) print(f"Archivo subido: {uploaded_file.display_name}, URI: {uploaded_file.uri}") # Esperar a que el archivo esté activo wait_for_files_active([uploaded_file]) return uploaded_file.uri # Devuelve la URI del archivo subido # Función para esperar que los archivos estén activos def wait_for_files_active(files): """ Espera a que los archivos subidos a Gemini estén activos y listos para su uso. """ print("Esperando el procesamiento de los archivos...") for file in files: status = genai.get_file(file.name) while status.state.name == "PROCESSING": print(".", end="", flush=True) time.sleep(5) # Intervalo de espera más corto para mejorar la experiencia del usuario status = genai.get_file(file.name) if status.state.name != "ACTIVE": raise Exception(f"El archivo {file.name} no pudo procesarse correctamente.") print("\nTodos los archivos están listos.") # Función para iniciar el chat con el modelo def start_chat_with_file(file, user_input): """ Inicia una conversación con el modelo utilizando un archivo como entrada. """ chat_session = model.start_chat( history=[ { "role": "user", "parts": [file], }, ] ) # Enviar mensaje al modelo response = chat_session.send_message(user_input) return response.text # Configuración del modelo generativo generation_config = { "temperature": 1, "top_p": 0.95, "top_k": 40, "max_output_tokens": 8192, "response_mime_type": "text/plain", } model = genai.GenerativeModel( model_name="gemini-1.5-flash", generation_config=generation_config, ) # Interfaz de Gradio def interface(user_input, file): """ Interfaz de Gradio que procesa el archivo subido y permite interactuar con el modelo. """ try: file_uri = upload_and_process_file(file) except Exception as e: return f"Error al procesar el archivo: {e}" response = start_chat_with_file(file_uri, user_input) return response # Crear la interfaz de Gradio iface = gr.Interface( fn=interface, inputs=[ gr.Textbox(label="Tu mensaje al modelo", placeholder="Escribe aquí tu mensaje...", lines=2), gr.File(label="Sube un archivo (Imagen, PDF o Texto)") ], outputs="text", title="Interacción con el Modelo Generativo de Gemini", description="Sube un archivo y escribe un mensaje para iniciar una conversación con el modelo.", ) # Iniciar la interfaz if __name__ == "__main__": iface.launch()