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, 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 [] model = genai.GenerativeModel(model_choice) 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 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 ) user_inputs = [ text_prompt_component, chatbot_component ] bot_inputs = [ upload_button_component, model_choice_component, chatbot_component ] with gr.Blocks() as demo: gr.HTML(TITLE) gr.HTML(SUBTITLE) with gr.Column(): chatbot_component.render() with gr.Row(): text_prompt_component.render() upload_button_component.render() run_button_component.render() model_choice_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 ) demo.queue(max_size=99).launch(debug=False, show_error=True)