Как я создал Telegram-бота с GPT за один вечер
Telegram-боты с ИИ — один из самых быстрых способов доставить AI-продукт пользователям. Без App Store, без фронтенда, без регистрации. Пользователь открывает чат и начинает работать. Вот как я собрал такого бота за один вечер.
Стек
- Node.js + TypeScript — основа
- grammy — современная библиотека для Telegram Bot API
- OpenAI SDK — взаимодействие с GPT
- Vercel Functions — серверлесс-хостинг через webhook
- Redis (Upstash) — хранение контекста диалогов
Шаг 1: Webhook вместо polling
Большинство туториалов используют long polling — бот постоянно спрашивает Telegram «есть новые сообщения?». Это требует постоянно запущенного сервера. Webhook — обратный подход: Telegram сам отправляет запрос на ваш URL при каждом сообщении.
// api/bot.ts — Vercel Function
import { Bot, webhookCallback } from 'grammy'
const bot = new Bot(process.env.BOT_TOKEN!)
bot.on('message:text', async (ctx) => {
const reply = await getAIResponse(ctx.message.text, ctx.from.id)
await ctx.reply(reply)
})
export default webhookCallback(bot, 'std/http')
Одна функция, ноль инфраструктуры. Vercel масштабирует автоматически.
Шаг 2: Контекст диалога
GPT без контекста — это как разговор с человеком, который забывает всё после каждой фразы. Решение: хранить последние N сообщений в Redis.
import { Redis } from '@upstash/redis'
const redis = new Redis({
url: process.env.UPSTASH_URL!,
token: process.env.UPSTASH_TOKEN!,
})
async function getAIResponse(text: string, userId: number) {
const key = `chat:${userId}`
// Получаем историю
const history = await redis.lrange(key, 0, 19) // последние 20 сообщений
const messages = [
{ role: 'system', content: 'You are a helpful assistant.' },
...history.map(h => JSON.parse(h)),
{ role: 'user', content: text },
]
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages,
})
const reply = response.choices[0].message.content!
// Сохраняем в историю
await redis.rpush(key,
JSON.stringify({ role: 'user', content: text }),
JSON.stringify({ role: 'assistant', content: reply })
)
await redis.ltrim(key, -20, -1) // храним только последние 20
await redis.expire(key, 86400) // TTL: 24 часа
return reply
}
Шаг 3: Команды и UX
Хороший бот — это не просто обёртка над API. Несколько деталей, которые делают его удобным:
/start— приветствие и описание возможностей/clear— сброс контекста диалога- Typing indicator —
ctx.replyWithChatAction('typing')пока GPT думает - Rate limiting — защита от спама через Upstash Ratelimit
Деплой
После vercel deploy остаётся зарегистрировать webhook:
curl -X POST "https://api.telegram.org/bot${BOT_TOKEN}/setWebhook" \
-H "Content-Type: application/json" \
-d '{"url": "https://your-app.vercel.app/api/bot"}'
Итого: ~150 строк кода, 0 серверов, бесплатный хостинг на Vercel + Upstash free tier. Бот обрабатывает тысячи сообщений в день.
Что дальше
Этот каркас можно расширить: добавить function calling для выполнения действий (поиск, расчёты, API-вызовы), RAG для работы с документами, голосовые сообщения через Whisper API. Telegram-бот — это не игрушка, а полноценный канал доставки AI-продукта.