JeCabrera's picture
Update app.py
c9d4da2 verified
import gradio as gr
import google.generativeai as genai
import os
from dotenv import load_dotenv
from gradio import Markdown
import textwrap
# Cargar variables de entorno
load_dotenv()
# Configurar la API de Google Gemini
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
def upload_to_gemini(path, mime_type=None):
"""Sube el archivo a Google Gemini."""
file = genai.upload_file(path, mime_type=mime_type)
print(f"Uploaded file '{file.display_name}' as: {file.uri}")
return file
def to_markdown(text):
text = text.replace('•', ' *')
return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
def identify_plant(image, model_name, temperature, top_p, top_k, max_output_tokens):
if image is None:
return "Por favor, carga una imagen."
# Subir la imagen a Gemini
uploaded_file = upload_to_gemini(image, mime_type="image/jpeg")
# Configurar el modelo seleccionado
generation_config = {
"temperature": temperature,
"top_p": top_p,
"top_k": top_k,
"max_output_tokens": max_output_tokens,
"response_mime_type": "text/plain",
}
model = genai.GenerativeModel(
model_name=model_name,
generation_config=generation_config,
)
# Crear una sesión de chat para interactuar con Gemini
chat_session = model.start_chat(
history=[
{
"role": "user",
"parts": [
uploaded_file, # El archivo subido a Gemini
"""
Analiza esta imagen de una planta e identifica su especie. Proporciona la siguiente información:
1. Nombre común
2. Nombre científico
3. Familia
4. Características principales
5. Cuidados básicos
6. Simbolismo histórico (Este apartado analizará el significado cultural e histórico de la planta, explorando cómo se ha utilizado en mitologías, rituales o medicinas tradicionales en diferentes culturas. ¡Una manera de conectar con el pasado a través de la naturaleza!)
7. Compatibilidad emocional (Esta sección explora cómo la planta podría influir en el ambiente emocional de un espacio. Basado en la cromoterapia, la energía vital de la planta, o su apariencia, podríamos descubrir qué emociones o vibraciones aporta, lo cual podría interesar a los usuarios que buscan mejorar el bienestar personal o la atmósfera en sus hogares.)
8. Interacción con la tecnología (Una visión futurista sobre cómo la planta podría tener un papel en el avance de tecnologías emergentes, como la biotecnología, la ingeniería genética, o incluso su rol en ambientes que dependen de IA. ¡Una conexión interesante entre la naturaleza y el futuro tecnológico!)
""",
],
},
]
)
# Enviar el mensaje y obtener la respuesta
response = chat_session.send_message("Analiza la planta")
# Usar to_markdown para formatear la respuesta
return to_markdown(response.text)
# Configurar la interfaz de Gradio
css = """
<style>
body { font-family: Arial, sans-serif; }
.gradio-container { max-width: 800px; margin: auto; }
.image-upload { border: 2px dashed #ccc; padding: 20px; text-align: center; }
.output-text { background-color: #f0f0f0; padding: 15px; border-radius: 5px; }
</style>
"""
with gr.Blocks(css=css) as iface:
gr.HTML("<h1 class='text-3xl font-bold text-center mb-6'>Identificador de Plantas</h1>")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="Sube una imagen de una planta", type="filepath")
model_selector = gr.Dropdown(choices=["gemini-1.5-pro", "gemini-1.5-flash"], value="gemini-1.5-pro", label="Selecciona el modelo")
# Agrupar parámetros en un desplegable
with gr.Accordion("Configuración del Modelo", open=False):
temperature = gr.Slider(minimum=0.0, maximum=1.0, value=0.9, label="Temperature", step=0.1)
top_p = gr.Slider(minimum=0.0, maximum=1.0, value=0.95, label="Top P", step=0.01)
top_k = gr.Slider(minimum=1, maximum=100, value=64, label="Top K", step=1)
max_output_tokens = gr.Slider(minimum=1, maximum=2048, value=1024, label="Max Output Tokens", step=1)
with gr.Column():
output_text = gr.Markdown(label="Información de la Planta")
submit_btn = gr.Button("Identificar Planta", variant="primary")
submit_btn.click(fn=identify_plant, inputs=[input_image, model_selector, temperature, top_p, top_k, max_output_tokens], outputs=output_text)
# Lanzar la interfaz
iface.launch()