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.
Diferencia técnica
Sección titulada «Diferencia técnica»- 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.
Respuesta fluida
Sección titulada «Respuesta fluida»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:
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
Claves del código
Sección titulada «Claves del código»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.