Saltearse al contenido

🐍 Python + Streamlit = MVP en minutos

En este tutorial, construiremos un Producto Mínimo Viable (MVP) para análisis de sentimientos utilizando Streamlit y la API de Gemini, mostrando los resultados de forma visual.

Streamlit es un framework que transforma tus scripts Python aplicaciones web. Cuenta con una galería de widgets que facilita el desarrollo de interfaces.

Crea un directorio y dentro del mismo ejecuta los siguientes comandos.

Ventana de terminal
uv init
uv add streamlit google-genai

Activa el entorno virtual según tu S.O.

Ventana de terminal
source .venv/bin/activate

En tu archivo main.py importa Streamlit y agrega un widget de texto.

Puedes ver los widgets disponibles en la documentación de Streamlit

main.py
import streamlit as st
def main():
st.text("Hola mundo!")
if __name__ == "__main__"
main()

Ejecuta el siguiente comando para abrir tu app en el navegador. Asegúrate de tener activado el entorno virtual.

Ventana de terminal
streamlit run main.py

Streamlit abrirá tu navegador en http://localhost:8501.

Crea un archivo secrets.toml dentro del directorio .streamlit en la raíz del proyecto.

  • Directorymi-proyecto
    • Directory.streamlit
      • secrets.toml
    • main.py

Agrega la API key de Gemini al archivo.

secrets.toml
GEMINI_API_KEY = "AIzaS..."

Carga la API key en tu app usando st.secrets, un sistema seguro para manejar secretos.

main.py
GEMINI_API_KEY = st.secrets["GEMINI_API_KEY"]

Para graficar las respuestas necesitamos una estructura manejable, Gemini es capaz de responder en formato JSON.

Primero agregamos un modelo de Pydantic con la estructura para cada sentimiento.

main.py
from pydantic import BaseModel
class Sentiment(BaseModel):
label: str
score: int
reason: str

Luego, agregamos una función para enviar el texto del usuario a Gemini, obteniendo una lista de resultados para cada sentimiento. Es necesario agregar el esquema y tipo de respuesta para obtener la respuesta estructurada.

main.py
def get_gemini_response(text):
prompt = f"""
Clasifica del 0 al 100 el siguiente texto entre comillas bajo los siguientes sentimientos:
- Alegría
- Tristeza
- Enojo
- Miedo
- Desagrado
Texto: "{text}"
"""
return client.models.generate_content(
model="gemini-2.0-flash",
contents=prompt,
config={
"response_mime_type": "application/json",
"response_schema": list[Sentiment],
},
)

Empezamos con widgets básicos st.title y st.text.

Continuamos con un formulario para obtener el texto del usuario y un botón para enviarlo. Cuando el texto es enviado, se muestra un spinner mientras se espera la respuesta de Gemini, la cual se visualiza con el widget st.json.

main.py
def main():
st.title("Clasificador de sentimientos")
st.text("Introduce un texto para clasificarlo en diferentes sentimientos")
with st.form("form"):
text = st.text_area("Introduce un texto")
submit = st.form_submit_button("Analizar", type="primary")
if submit:
with st.spinner("Clasificando..."):
response = get_gemini_response(text)
st.json(response.text)

Podemos acceder a la lista de modelos Pydantic en response.parsed, necesitamos convertirla en un dataframe de Pandas para mostrarla en una tabla y un gráfico de barras.

main.py
import pandas as pd
...
sentiments: list[Sentiment] = response.parsed
sentiments_data = [s.model_dump() for s in sentiments]
st.dataframe(sentiments_data)
sentiments_df = pd.DataFrame(sentiments_data)
st.bar_chart(
sentiments_df,
x="label",
y="score",
color="label",
horizontal=True
)
  1. Crea un repositorio en GitHub y sube el proyecto, asegúrate de no incluir el archivo .streamlit/secrets.toml.
  2. Crea una cuenta en share.streamlit.io y conecta tu cuenta de GitHub.
  3. Selecciona tu repositorio y especifica main.py como archivo principal, también puedes editar la url y validar si está disponible.
  4. En “Advanced settings” copia y pega el contenido de tu archivo secrets.toml.
  5. Clickea en “Deploy” y tu app estará en internet 🌐.