IA Intermedio

Streaming en la terminal con Gemini: respuestas “en vivo” con POO en Python

En este tutorial construimos un mini chat de consola con Gemini y Python que muestra las respuestas “en vivo”, token a token. Aprovechamos el SDK google-genai y una arquitectura sencilla orientada a …

Publicado: 10/12/2025 Por: Juan Felipe Orozco Cortés Duración: 30 minutos Nivel: Intermedio
Contenido del tutorial

En este tutorial vas a montar un mini chat de consola que se conecta con Gemini y muestra las respuestas en vivo, token a token, como si alguien estuviera escribiendo frente a ti. Al final tendrás un script sencillo, pero muy útil, para probar ideas rápido desde la terminal y ver cómo funciona el streaming de texto en tiempo real.

(.venv) $ python -m stream_chat_gemini
Escribe tu pregunta (o 'salir'):

Tú: ¿colores de la bandera de colombia?
Modelo: Los colores de la bandera de Colombia son:

1.  **Amarillo:** Ocupa la mitad superior de la bandera.
2.  **Azul:** Ocupa la segunda franja horizontal, un cuarto de la bandera.
3.  **Rojo:** Ocupa la tercera y última franja horizontal, el cuarto restante.
Tú: ^C
Hasta luego.

Lo importante es que no vamos a esperar al “JSON gigante del final”. Vamos a usar streaming para ir imprimiendo texto a medida que el modelo lo genera, como si vieras pensar a Gemini en tiempo real.

En el camino vas a ver:

  • Cómo usar el SDK google-genai en modo streaming.
  • Cómo pasar la API key correctamente sin hardcodearla.
  • Cómo separar el proyecto en varios archivos usando programación orientada a objetos:
  • Configuración.
  • Cliente de IA.
  • Interfaz de consola.
  • Punto de entrada del programa.

1. Estructura del proyecto

Vamos a trabajar con un proyecto pequeño pero organizado en varios archivos. Primero verás el árbol de carpetas completo y luego iremos recorriendo cada pieza (configuración, cliente de IA, consola y punto de entrada) para que entiendas qué hace y dónde va cada cosa.

stream_chat_gemini/
├── __init__.py
├── __main__.py
├── config.py
├── main.py
├── repl.py
├── requirements.txt
└── streamer.py

2. Requisitos previos

Para seguir este tutorial necesitas tres cosas básicas: tener instalado Python 3.9 o superior (en tu caso lo haremos desde WSL, pero funciona igual en Linux, macOS o Windows), trabajar dentro de un entorno virtual creado con python -m venv .venv y disponer de una API key de Gemini obtenida desde Google AI Studio.

Entorno virtual rápido (ejemplo típico)

En la carpeta donde tengas stream_chat_gemini/ vas a crear y activar un entorno virtual para aislar las dependencias de este proyecto.

python3 -m venv .venv
source .venv/bin/activate

Luego instalamos las dependencias usando el archivo requirements.txt (lo vemos enseguida), para que puedas recrear el entorno del proyecto con un solo comando.

pip install -r stream_chat_gemini/requirements.txt

Exportamos la API key en la sesión:

export GEMINI_API_KEY="TU_NUEVA_API_KEY_SEGURA"

3. Archivo por archivo

3.1 requirements.txt

Empezamos por lo más simple: el archivo de dependencias. Aquí solo declaramos el SDK que necesitamos. Esto hace que cualquiera en la comunidad pueda recrear el entorno del proyecto con un solo comando.

google-genai==1.54.0
En este bloque estás mostrando cómo definir un requirements.txt mínimo, fijado a una versión específica del SDK que sabes que funciona bien, y el comando que cualquier persona puede usar para instalar esas dependencias en su entorno.

En resumen:

  • Un requirements.txt pequeño y reproducible.
  • El comando exacto para instalarlo con pip.
pip install -r requirements.txt

3.2 __init__.py

Este archivo puede estar completamente vacío. Su función importante aquí es decirle a Python: “esta carpeta stream_chat_gemini es un paquete.”

Gracias a eso puedes hacer cosas como ejecutar el proyecto con python -m stream_chat_gemini y usar imports relativos del estilo from .config import ModelConfig sin que Python se queje.

3.3 __main__.py

Este archivo responde a la pregunta clave: “¿Qué pasa cuando alguien ejecuta python -m stream_chat_gemini?”

En lugar de obligar a la gente a recordar comandos más largos como python -m stream_chat_gemini.main, aquí definimos un punto de entrada por defecto. Así, tu paquete se siente más profesional y fácil de usar: basta con invocarlo como módulo y Python sabe automáticamente qué función debe arrancar.

from .main import main
raise SystemExit(main())

Estás mostrando cómo usar __main__.py como punto de entrada del paquete, de modo que python -m stream_chat_gemini sepa qué ejecutar.

También introduces un patrón limpio: toda la lógica se delega a una función main() central, y __main__.py solo se encarga de llamarla. Esto hace que tu código sea más fácil de probar, reutilizar y mantener.

3.4 config.py

No queremos tener nombres de modelo ni “números mágicos” regados por todo el código. En vez de eso, centralizamos todo en una dataclass inmutable que guarda la configuración del modelo.

Así, si mañana cambias el nombre del modelo, el máximo de tokens o el modo de seguridad, lo haces en un solo archivo y el resto del proyecto sigue limpio y fácil de leer.

from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True)
class ModelConfig:
    """
    Configuración mínima del modelo para el microproyecto.
    """
    model: str = "gemini-2.5-flash"
    temperature: float = 0.2
    max_output_tokens: int = 512

Estás viendo solo el 60% del contenido. Hazte Premium para acceder al tutorial completo.

Comunidad

Comentarios y valoraciones

No hay comentarios aún. ¡Sé el primero en opinar!