Spaces:
Running
Running
import os | |
import time | |
import uuid | |
import google.generativeai as genai | |
import gradio as gr | |
from PIL import Image | |
from dotenv import load_dotenv | |
# Cargar las variables de entorno | |
load_dotenv() | |
API_KEY = os.getenv("GOOGLE_API_KEY") | |
if not API_KEY: | |
raise ValueError("La clave de API 'GOOGLE_API_KEY' no est谩 configurada en el archivo .env") | |
# Configuraci贸n del modelo Gemini | |
generation_config = { | |
"temperature": 1, | |
"top_p": 0.95, | |
"top_k": 40, | |
"max_output_tokens": 8192, | |
"response_mime_type": "text/plain", | |
} | |
genai.configure(api_key=API_KEY) | |
model = genai.GenerativeModel( | |
model_name="gemini-1.5-flash", | |
generation_config=generation_config, | |
) | |
# Inicializar la sesi贸n de chat | |
chat = model.start_chat(history=[]) | |
# Funci贸n para transformar el historial de Gradio al formato de Gemini | |
def transform_history(history): | |
new_history = [] | |
for chat in history: | |
new_history.append({"parts": [{"text": chat[0]}], "role": "user"}) | |
new_history.append({"parts": [{"text": chat[1]}], "role": "model"}) | |
return new_history | |
# Funci贸n de respuesta que maneja el texto y los archivos multimodales | |
def response(message, history): | |
global chat | |
# Transformar el historial al formato esperado por Gemini | |
chat.history = transform_history(history) | |
# Enviar el mensaje al modelo y obtener la respuesta | |
response = chat.send_message(message["text"]) | |
response.resolve() | |
# Mostrar la respuesta car谩cter por car谩cter | |
for i in range(len(response.text)): | |
time.sleep(0.01) | |
yield response.text[: i + 1] | |
# Funci贸n para manejar las im谩genes cargadas | |
def handle_uploaded_images(files): | |
"""Procesa las im谩genes cargadas, las redimensiona y las guarda""" | |
image_paths = [] | |
for file in files: | |
image = Image.open(file).convert('RGB') # Abrir y convertir la imagen a RGB | |
image_height = int(image.height * 512 / image.width) # Mantener la proporci贸n | |
image_resized = image.resize((512, image_height)) # Redimensionar la imagen | |
image_filename = f"{uuid.uuid4()}.jpeg" # Crear un nombre 煤nico para la imagen | |
image_path = f"/tmp/{image_filename}" # Ruta de almacenamiento temporal | |
image_resized.save(image_path, "JPEG") # Guardar la imagen | |
image_paths.append(image_path) # Agregar la ruta al resultado | |
return image_paths | |
# Funci贸n para contar las im谩genes cargadas | |
def count_images(message, history): | |
num_images = len(message["files"]) # Contar las im谩genes cargadas en el mensaje actual | |
total_images = 0 | |
for msg in history: # Contar todas las im谩genes en el historial | |
if isinstance(msg["content"], tuple): # Si el contenido es una tupla, es un archivo | |
total_images += 1 | |
return f"You just uploaded {num_images} images, total uploaded: {total_images + num_images}" | |
# Funci贸n que se invoca al cargar im谩genes | |
def upload_images_handler(files, history): | |
# Procesar las im谩genes cargadas | |
image_paths = handle_uploaded_images(files) | |
# Actualizar el historial con las im谩genes procesadas | |
history.append((None, image_paths)) | |
return history, count_images({"files": files}, history) | |
# Crear la interfaz de Gradio | |
demo = gr.ChatInterface( | |
fn=response, # Funci贸n de chat para manejar texto y archivos | |
examples=[ # Ejemplos iniciales de mensajes | |
{"text": "No files", "files": []} | |
], | |
cache_examples=True, | |
multimodal=True, # Activar la modalidad multimodal | |
textbox=gr.MultimodalTextbox( # Configuraci贸n del cuadro de texto multimodal | |
file_count="multiple", # Permitir m煤ltiples archivos | |
file_types=["image"], # Aceptar solo im谩genes | |
sources=["upload", "microphone"] # Fuentes de entrada: carga de archivos y micr贸fono | |
) | |
) | |
# Conectar la funci贸n de carga de im谩genes con el evento de Gradio | |
demo.add_event("file_upload", upload_images_handler) | |
# Iniciar la interfaz | |
demo.launch() | |