TITLE = """

Gemini Playground ✨

""" SUBTITLE = """

Play with Gemini Pro and Gemini Pro Vision

""" import os import time import uuid from typing import List, Tuple, Optional, Union import google.generativeai as genai import gradio as gr from PIL import Image from dotenv import load_dotenv # Cargar las variables de entorno desde el archivo .env load_dotenv() print("google-generativeai:", genai.__version__) # Obtener la clave de la API de las variables de entorno GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") # Verificar que la clave de la API esté configurada if not GOOGLE_API_KEY: raise ValueError("GOOGLE_API_KEY is not set in environment variables.") IMAGE_CACHE_DIRECTORY = "/tmp" IMAGE_WIDTH = 512 CHAT_HISTORY = List[Tuple[Optional[Union[Tuple[str], str]], Optional[str]]] def preprocess_image(image: Image.Image) -> Optional[Image.Image]: if image: image_height = int(image.height * IMAGE_WIDTH / image.width) return image.resize((IMAGE_WIDTH, image_height)) def cache_pil_image(image: Image.Image) -> str: image_filename = f"{uuid.uuid4()}.jpeg" os.makedirs(IMAGE_CACHE_DIRECTORY, exist_ok=True) image_path = os.path.join(IMAGE_CACHE_DIRECTORY, image_filename) image.save(image_path, "JPEG") return image_path def upload(files: Optional[List[str]], chatbot: CHAT_HISTORY) -> CHAT_HISTORY: for file in files: image = Image.open(file).convert('RGB') image_preview = preprocess_image(image) if image_preview: # Display a preview of the uploaded image gr.Image(image_preview).render() image_path = cache_pil_image(image) chatbot.append(((image_path,), None)) return chatbot def user(text_prompt: str, chatbot: CHAT_HISTORY): if text_prompt: chatbot.append((text_prompt, None)) return "", chatbot def bot( files: Optional[List[str]], model_choice: str, system_instruction: Optional[str], # Parámetro para la instrucción del sistema chatbot: CHAT_HISTORY ): if not GOOGLE_API_KEY: raise ValueError("GOOGLE_API_KEY is not set.") # Configurar la API con la clave genai.configure(api_key=GOOGLE_API_KEY) generation_config = genai.types.GenerationConfig( temperature=0.7, # Valor predeterminado max_output_tokens=8192, # Fijar el límite de tokens a 8,192 top_k=10, # Valor predeterminado top_p=0.9 # Valor predeterminado ) text_prompt = [chatbot[-1][0]] if chatbot and chatbot[-1][0] and isinstance(chatbot[-1][0], str) else [] image_prompt = [preprocess_image(Image.open(file).convert('RGB')) for file in files] if files else [] # Crear el modelo con la instrucción del sistema si está definida model = genai.GenerativeModel( model_name=model_choice, generation_config=generation_config, system_instruction=system_instruction if system_instruction else None ) response = model.generate_content(text_prompt + image_prompt, stream=True, generation_config=generation_config) chatbot[-1][1] = "" for chunk in response: for i in range(0, len(chunk.text), 10): section = chunk.text[i:i + 10] chatbot[-1][1] += section time.sleep(0.01) yield chatbot # Componente para ingresar la instrucción del sistema system_instruction_component = gr.Textbox( placeholder="Enter system instruction...", show_label=True, scale=8, visible=False # Por defecto no visible ) def toggle_system_instruction(option: str): return gr.update(visible=option == "Enable") # Definir los componentes de entrada y salida chatbot_component = gr.Chatbot( label='Gemini', bubble_full_width=False, scale=2, height=300 ) text_prompt_component = gr.Textbox( placeholder="Message...", show_label=False, autofocus=True, scale=8 ) upload_button_component = gr.UploadButton( label="Upload Images", file_count="multiple", file_types=["image"], scale=1 ) run_button_component = gr.Button(value="Run", variant="primary", scale=1) model_choice_component = gr.Dropdown( choices=["gemini-1.5-flash", "gemini-2.0-flash-exp", "gemini-1.5-pro"], value="gemini-1.5-flash", label="Select Model", scale=2 ) system_instruction_toggle = gr.Dropdown( label="System Instruction", choices=["Disable", "Enable"], value="Disable", scale=1 ) user_inputs = [ text_prompt_component, chatbot_component ] bot_inputs = [ upload_button_component, model_choice_component, # El campo de modelo está ahora arriba system_instruction_component, # Instrucción del sistema sigue siendo separada chatbot_component ] # Definir la interfaz de usuario with gr.Blocks() as demo: gr.HTML(TITLE) gr.HTML(SUBTITLE) with gr.Column(): # Campo de selección de modelo arriba model_choice_component.render() chatbot_component.render() with gr.Row(): text_prompt_component.render() upload_button_component.render() run_button_component.render() system_instruction_toggle.render() system_instruction_toggle.change( fn=toggle_system_instruction, inputs=[system_instruction_toggle], outputs=[system_instruction_component] ) system_instruction_component.render() run_button_component.click( fn=user, inputs=user_inputs, outputs=[text_prompt_component, chatbot_component], queue=False ).then( fn=bot, inputs=bot_inputs, outputs=[chatbot_component], ) text_prompt_component.submit( fn=user, inputs=user_inputs, outputs=[text_prompt_component, chatbot_component], queue=False ).then( fn=bot, inputs=bot_inputs, outputs=[chatbot_component], ) upload_button_component.upload( fn=upload, inputs=[upload_button_component, chatbot_component], outputs=[chatbot_component], queue=False ) # Lanzar la aplicación demo.queue(max_size=99).launch(debug=False, show_error=True)