Spaces:
Running
Running
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() | |