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()