Ir al contenido

Streaming en tiempo real

Cuando usas ChatGPT, no esperas a que la respuesta completa esté lista para empezar a leer; las palabras aparecen “mágicamente” una por una. Esto se llama Streaming.

Técnicamente, reduce la latencia percibida. En lugar de esperar 3 segundos por toda la respuesta, el usuario ve actividad en 0.5 segundos.

  • Sin streaming (generateContent): El servidor espera tener el 100% de la respuesta y te envía un solo bloque gigante.
  • Con streaming (generateContentStream): El servidor te envía pequeños paquetes (chunks) de texto a medida que los genera.

Vamos a crear un script simple que le pida al modelo escribir un cuento. Verás cómo el texto se imprime en tu terminal progresivamente, como si una máquina de escribir fantasma lo estuviera tecleando.

Crea el archivo src/stream.js:

  • Directoriogemini-lab
    • Directoriosrc
      • config.js
      • text-gen.js
      • json-extract.js
      • stream.js Nuevo archivo

Copia este código:

src/stream.js
import { client } from "./config.js";
async function streamResponse() {
const prompt = "Escribe un cuento muy breve (máximo 3 líneas) sobre un robot que aprende a amar.";
console.log("Generando respuesta con Streaming...");
try {
// 1. Iniciamos el Stream
const result = await client.models.generateContentStream({
model: "gemini-3-flash-preview",
contents: [{ role: "user", parts: [{ text: prompt }] }],
});
// 2. Consumimos el Stream (Async Iterator)
for await (const chunk of result) {
const chunkText = chunk.text;
process.stdout.write(chunkText);
}
console.log("Fin del stream.");
} catch (error) {
console.error("Error:", error);
}
}
streamResponse();

Ejecútalo y observa cómo fluye el texto: node src/stream.js

  • generateContentStream(prompt): Devuelve un objeto que contiene una promesa de respuesta y, más importante, un iterador asíncrono (stream).
  • for await (const chunk of result): JavaScript moderno nos permite iterar sobre datos que “aún están llegando”. El bucle se pausa automáticamente hasta que Google envía el siguiente paquete de texto.
  • process.stdout.write: Usamos esto en lugar de console.log porque console.log añade un salto de línea (\n) al final de cada llamada, lo que rompería el efecto visual de continuidad.