Spaces:
Running
Running
File size: 3,970 Bytes
9a49cc3 1082b79 9a49cc3 fabf5df 1082b79 9a49cc3 b2b0e4b 9a49cc3 1082b79 9a49cc3 8d51e47 9a49cc3 8d51e47 899339a 9a49cc3 1082b79 8d51e47 1082b79 9a49cc3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
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()
|