TITLE = """

Gemini Playground ✨

""" SUBTITLE = """

Play with Gemini Pro and Gemini Pro Vision

""" import os import time from typing import List, Tuple, Optional, Union import google.generativeai as genai import gradio as gr from dotenv import load_dotenv # Cargar las variables de entorno desde el archivo .env load_dotenv() # Obtener la clave de la API de las variables de entorno GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") if not GOOGLE_API_KEY: raise ValueError("GOOGLE_API_KEY is not set in environment variables.") # Configuración global genai.configure(api_key=GOOGLE_API_KEY) IMAGE_WIDTH = 512 CHAT_HISTORY = List[Tuple[Optional[str], Optional[str]]] # Inicializar el modelo y la sesión de chat model_name_default = "gemini-1.5-flash" generation_config = genai.types.GenerationConfig( temperature=0.7, max_output_tokens=8192, top_k=10, top_p=0.9 ) model = genai.GenerativeModel(model_name=model_name_default, generation_config=generation_config) chat = model.start_chat(history=[]) def transform_history(history: CHAT_HISTORY): """ Transforma el historial del formato Gradio al formato esperado por Gemini. """ new_history = [] for user_input, model_response in history: if user_input: new_history.append({"parts": [{"text": user_input}], "role": "user"}) if model_response: new_history.append({"parts": [{"text": model_response}], "role": "model"}) return new_history def user_input_handler(text_prompt: str, chatbot: CHAT_HISTORY): """ Agrega la entrada del usuario al historial y retorna la interfaz actualizada. """ if text_prompt.strip(): chatbot.append((text_prompt, None)) return "", chatbot def bot_response_handler( model_choice: str, system_instruction: Optional[str], chatbot: CHAT_HISTORY, ): """ Genera la respuesta del modelo basado en el historial y devuelve la interfaz actualizada. """ global chat if not GOOGLE_API_KEY: raise ValueError("GOOGLE_API_KEY is not set.") # Configurar el modelo y la instrucción del sistema model = genai.GenerativeModel( model_name=model_choice, generation_config=generation_config, system_instruction=system_instruction or "Default instruction" ) # Transformar el historial para la sesión del chat chat.history = transform_history(chatbot) # Obtener el mensaje más reciente user_message = chatbot[-1][0] if chatbot and chatbot[-1][0] else "" # Enviar el mensaje y procesar la respuesta response = chat.send_message(user_message) response.resolve() # Actualizar el historial con la respuesta del modelo chatbot[-1] = (user_message, response.text) # Devolver la respuesta por fragmentos para simular la experiencia de escritura for i in range(len(response.text)): time.sleep(0.01) yield chatbot # Componentes de la interfaz chatbot_component = gr.Chatbot(label="Gemini Chat", height=400) text_input_component = gr.Textbox(placeholder="Escribe tu mensaje aquí...", show_label=False) model_dropdown_component = gr.Dropdown( choices=["gemini-1.5-flash", "gemini-2.0-flash-exp", "gemini-1.5-pro"], value=model_name_default, label="Selecciona el modelo", ) system_instruction_component = gr.Textbox( placeholder="Instrucción para el modelo...", label="System Instruction", optional=True, ) run_button_component = gr.Button("Enviar") # Layout de la interfaz with gr.Blocks() as demo: gr.HTML(TITLE) gr.HTML(SUBTITLE) with gr.Column(): model_dropdown_component.render() chatbot_component.render() with gr.Row(): text_input_component.render() run_button_component.render() with gr.Accordion("System Instruction", open=False): system_instruction_component.render() # Conexiones de eventos run_button_component.click( user_input_handler, inputs=[text_input_component, chatbot_component], outputs=[text_input_component, chatbot_component], queue=False, ).then( bot_response_handler, inputs=[model_dropdown_component, system_instruction_component, chatbot_component], outputs=[chatbot_component], ) text_input_component.submit( user_input_handler, inputs=[text_input_component, chatbot_component], outputs=[text_input_component, chatbot_component], queue=False, ).then( bot_response_handler, inputs=[model_dropdown_component, system_instruction_component, chatbot_component], outputs=[chatbot_component], ) # Lanzar la aplicación demo.queue(max_size=99).launch(debug=True, show_error=True)