22.03.2026 8 мин чтения

Как я создал Telegram-бота с GPT за один вечер

Telegram-боты с ИИ — один из самых быстрых способов доставить AI-продукт пользователям. Без App Store, без фронтенда, без регистрации. Пользователь открывает чат и начинает работать. Вот как я собрал такого бота за один вечер.

Стек

Шаг 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. Несколько деталей, которые делают его удобным:

Деплой

После 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-продукта.

← Предыдущая Следующая →