Потокова передача повідомлень (stream)
Цей плагін дозволяє потоково передавати довгі текстові повідомлення до Telegram. Будь-який ітератор фрагментів рядків може передаватися потоково безпосередньо до будь-якого приватного чату.
Наприклад, ви можете зробити так, щоб відповідь LLM (large language model, велика мовна модель) зʼявлялася поступово під час генерування.
Початок роботи
Плагін додає до обʼєкта контексту три методи:
ctx: потокова передача звичайного тексту.reply With Stream ctx: потокова передача Markdown (рекомендовано).reply With Markdown Stream ctx: потокова передача HTML.reply With Html Stream
Потокова передача звичайного тексту (перший варіант) надсилає звичайні текстові повідомлення. Інші два методи використовують розширені повідомлення Telegram і рекомендуються для більшості випадків.
Потокова передача повідомлень дуже швидко виконує дуже багато запитів до API. Настійно рекомендується використовувати плагін
autoразом із плагіном-retry stream.
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()); // Настійно рекомендується!
bot.use(stream());
async function* slowText() {
// Імітуємо повільне генерування тексту.
yield "Це деяки";
await new Promise((r) => setTimeout(r, 2000));
yield "й повільно зге";
await new Promise((r) => setTimeout(r, 2000));
yield "нерований текст";
}
// Telegram підтримує потокову передачу лише у приватних чатах.
bot.chatType("private")
.command("stream", async (ctx) => {
// Передаємо повідомлення потоково!
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()); // Настійно рекомендується!
bot.use(stream());
async function* slowText() {
// Імітуємо повільне генерування тексту.
yield "Це деяки";
await new Promise((r) => setTimeout(r, 2000));
yield "й повільно зге";
await new Promise((r) => setTimeout(r, 2000));
yield "нерований текст";
}
// Telegram підтримує потокову передачу лише у приватних чатах.
bot.chatType("private")
.command("stream", async (ctx) => {
// Передаємо повідомлення потоково!
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()); // Настійно рекомендується!
bot.use(stream());
async function* slowText() {
// Імітуємо повільне генерування тексту.
yield "Це деяки";
await new Promise((r) => setTimeout(r, 2000));
yield "й повільно зге";
await new Promise((r) => setTimeout(r, 2000));
yield "нерований текст";
}
// Telegram підтримує потокову передачу лише у приватних чатах.
bot.chatType("private")
.command("stream", async (ctx) => {
// Передаємо повідомлення потоково!
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
Ось і все!
Інтеграція з LLM
Більшість інтеграцій з LLM дозволяють передавати результат потоково під час його генерування. Ви можете використовувати цей плагін, щоб відповідь LLM зʼявлялася поступово у будь-якому приватному чаті.
Наприклад, якщо ви використовуєте AI SDK, налаштування може виглядати так:
import { streamText } from "ai";
import { google } from "@ai-sdk/google";
bot.chatType("private")
.command("credits", async (ctx) => {
// Надсилаємо запит до LLM:
const { textStream } = streamText({
model: google("gemini-2.5-flash"),
prompt: "Наскільки класні боти grammY?",
});
// Автоматично передаємо відповідь потоково за допомогою 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) => {
// Надсилаємо запит до LLM:
const { textStream } = streamText({
model: google("gemini-2.5-flash"),
prompt: "Наскільки класні боти grammY?",
});
// Автоматично передаємо відповідь потоково за допомогою grammY:
await ctx.replyWithMarkdownStream(textStream);
});2
3
4
5
6
7
8
9
10
11
12
13
14
Не забудьте замінити gemini на найновішу модель.