Borradores de mensajes en tiempo real (stream)
Este complemento te permite enviar mensajes de texto largos a Telegram. Cualquier iterador de fragmentos de texto se puede enviar directamente a cualquier chat privado.
Por ejemplo, puedes hacer que la salida del LLM aparezca gradualmente mientras se genera la respuesta.
Inicio rápido
El complemento instala tres métodos en el objeto de contexto:
ctx: transmisión de mensajes sin formato.reply With Stream ctx: transmisión de mensajes en formato Markdown (recomendado).reply With Markdown Stream ctx: transmisión de mensajes en HTML.reply With Html Stream
La transmisión de texto sin formato (primera opción) envía mensajes de texto normales. Los otros dos métodos utilizan los mensajes enriquecidos de Telegram y se recomiendan para la mayoría de los casos.
El módulo de streaming de mensajes realiza numerosas llamadas a la API a gran velocidad. Se recomienda encarecidamente utilizar el complemento de reintentos automáticos junto con el complemento de streaming.
import { Bot, type Context } from "grammy";
import { autoRetry } from "@grammyjs/auto-retry";
import { stream, type StreamFlavor } from "@grammyjs/stream";
type MyContext = StreamFlavor<Context>;
const bot = new Bot<MyContext>("");
bot.api.config.use(autoRetry()); // ¡Muy recomendable!
bot.use(stream());
async function* slowText() {
// emular la generación lenta de texto
yield "This is som";
await new Promise((r) => setTimeout(r, 2000));
yield "e slowly gen";
await new Promise((r) => setTimeout(r, 2000));
yield "erated text";
}
// Telegram solo admite la transmisión en directo en los chats privados.
bot.chatType("private")
.command("stream", async (ctx) => {
// ¡Transmite el mensaje!
await ctx.replyWithStream(slowText());
});
bot.start();2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const { Bot } = require("grammy");
const { autoRetry } = require("@grammyjs/auto-retry");
const { stream } = require("@grammyjs/stream");
const bot = new Bot("");
bot.api.config.use(autoRetry()); // ¡Muy recomendable!
bot.use(stream());
async function* slowText() {
// emular la generación lenta de texto
yield "This is som";
await new Promise((r) => setTimeout(r, 2000));
yield "e slowly gen";
await new Promise((r) => setTimeout(r, 2000));
yield "erated text";
}
// Telegram solo admite la transmisión en directo en los chats privados.
bot.chatType("private")
.command("stream", async (ctx) => {
// ¡Transmite el mensaje!
await ctx.replyWithStream(slowText());
});
bot.start();2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import { Bot, type Context } from "https://deno.land/x/grammy@v1.44.0/mod.ts";
import { autoRetry } from "https://deno.land/x/grammy_auto_retry@v2.0.2/mod.ts";
import {
stream,
type StreamFlavor,
} from "https://deno.land/x/grammy_stream@v1.1.0/mod.ts";
type MyContext = StreamFlavor<Context>;
const bot = new Bot<MyContext>("");
bot.api.config.use(autoRetry()); // ¡Muy recomendable!
bot.use(stream());
async function* slowText() {
// emular la generación lenta de texto
yield "This is som";
await new Promise((r) => setTimeout(r, 2000));
yield "e slowly gen";
await new Promise((r) => setTimeout(r, 2000));
yield "erated text";
}
// Telegram solo admite la transmisión en directo en los chats privados.
bot.chatType("private")
.command("stream", async (ctx) => {
// ¡Transmite el mensaje!
await ctx.replyWithStream(slowText());
});
bot.start();2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
¡Eso es todo!
Integración de LLM
La mayoría de las integraciones de LLM te permiten transmitir el resultado a medida que se genera. Puedes utilizar este complemento para que el resultado del LLM aparezca gradualmente en cualquier chat privado.
Por ejemplo, si utilizas el AI SDK, tu configuración podría tener este aspecto:
import { streamText } from "ai";
import { google } from "@ai-sdk/google";
bot.chatType("private")
.command("credits", async (ctx) => {
// Envía la solicitud al LLM:
const { textStream } = streamText({
model: google("gemini-2.5-flash"),
prompt: "How cool are grammY bots?",
});
// Transmite respuestas automáticamente con grammY:
await ctx.replyWithMarkdownStream(textStream);
});2
3
4
5
6
7
8
9
10
11
12
13
14
import { streamText } from "npm:ai";
import { google } from "npm:@ai-sdk/google";
bot.chatType("private")
.command("credits", async (ctx) => {
// Envía la solicitud al LLM:
const { textStream } = streamText({
model: google("gemini-2.5-flash"),
prompt: "How cool are grammY bots?",
});
// Transmite respuestas automáticamente con grammY:
await ctx.replyWithMarkdownStream(textStream);
});2
3
4
5
6
7
8
9
10
11
12
13
14
Asegúrate de sustituir gemini por el último modelo disponible.
Resumen del complemento
- Nombre:
stream - Fuente
- Referencia