Что получится в конце
Telegram-бот, который отвечает на типовые вопросы клиентов сам — про сроки, цены, условия. Если вопрос нестандартный, он молча пересылает диалог мне, добавляя короткое summary и предлагаемый ответ. Я нажимаю «Отправить» — или правлю и отправляю.
За три месяца работы цифры такие:
Это не «автономный AI-агент». Это очень узкий пайплайн с ясной спецификацией: входящее сообщение → классификация → ответ из шаблона или генерация. Большая часть «ума» — в системном промпте на 800 токенов с примерами. Остальное — простая маршрутизация.
Когда это пригодится
- У вас есть Telegram-канал или бот, в который пишут клиенты — и 70% вопросов одинаковые.
- Вы хотите ответить быстрее, чем за час, но не готовы нанимать оператора.
- Вам важно не потерять «нестандартные» лиды — а текущая ситуация такова, что часть из них теряется в потоке.
- Вам нужно записывать все диалоги в одну таблицу для анализа и обучения шаблонов.
- Вы умеете читать JSON и не боитесь self-host n8n на VPS за $5.
Если у вас 30 сообщений в день и нет времени даже это собрать — связка вас разочарует. Окупается она примерно с 200 сообщений в неделю.
Что нужно и сколько стоит
- VPS для n8n — Hetzner CPX11 ($4.51/мес) или любой другой с 2 GB RAM
- Anthropic API — около $0.20/мес при 1000 ответов на Sonnet, $1.50 на Opus
- Telegram Bot — бесплатно через @BotFather
- Домен для webhook (опционально, можно через Cloudflare Tunnel) — $10/год
Итого: ~$4.20/мес если хостить n8n на $5-VPS и считать только API, либо $9/мес «всё включено». Я выбрал первый вариант: на VPS уже крутится десяток других вещей.
Пошагово
-
Поднять n8n на VPS через Docker
Я разворачиваю
n8nio/n8nчерез docker-compose с традиционным Caddy-фронтом для HTTPS. Конфиг минимальный, главный нюанс — переменнаяWEBHOOK_URLдолжна указывать на публичный URL, иначе Telegram не достучится.docker-compose.ymlservices: n8n: image: n8nio/n8n:latest restart: unless-stopped environment: - WEBHOOK_URL=https://n8n.example.ru - N8N_HOST=n8n.example.ru - N8N_PROTOCOL=https - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=${N8N_USER} - N8N_BASIC_AUTH_PASSWORD=${N8N_PASS} volumes: - ./n8n_data:/home/node/.n8n ports: - "127.0.0.1:5678:5678" -
Создать бота через @BotFather и получить токен
В Telegram пишем
/newbot, даём имя, получаем токен вида123:ABC.... Сохраняем в .env n8n какTG_TOKEN. Тут же отключаем Group Privacy через/setprivacy, если планируем держать бота в групповых чатах. -
Поставить webhook у Telegram на n8n
В n8n создаём workflow с триггером Telegram Trigger. Он сам зарегистрирует webhook через bot API. Если сделать руками — один POST:
bashcurl -X POST "https://api.telegram.org/bot${TG_TOKEN}/setWebhook" \ -d "url=https://n8n.example.ru/webhook/tg-bot"Проверка:
curl https://api.telegram.org/bot${TG_TOKEN}/getWebhookInfo. В полеlast_error_messageдолжно быть пусто. -
Промпт и ноды Anthropic
В workflow после Telegram-триггера добавляем ноду HTTP Request на
https://api.anthropic.com/v1/messages(есть нативный community-узел, но я предпочитаю HTTP — меньше зависимостей при апдейтах).Системный промпт хранится в отдельном узле Set: правила, тон, примеры на 6–8 диалогов. Главное правило промпта одно: «если запрос не подпадает под X/Y/Z — ответь словом ESCALATE».
-
Маршрутизация: ответ боту или мне
После ответа Claude — узел IF: если в ответе содержится ESCALATE, отправляем мне диалог + предложенный ответ через отдельный Telegram-узел. Иначе — отвечаем клиенту через Telegram Send Message.
Параллельно пишем диалог в Google Sheets: время, user_id, текст вопроса, текст ответа, путь (auto/escalate). Это понадобится через месяц, когда захочется посмотреть «а что вообще спрашивают».
Как это работает
Схема укладывается в одну строку: Telegram → n8n webhook → классификация → (template | Claude) → ответ. Сложнее всего — не код, а промпт. Хорошие связки на 80% состоят из текста на естественном языке и на 20% — из проводов между сервисами.
Один важный нюанс: я не использую chat-историю. Для типовых запросов клиенты не строят диалог — пишут вопрос, получают ответ, уходят. Хранить контекст между сообщениями означало бы платить за токены и риск, что модель «закопается» в старый контекст. Если запрос требует нескольких реплик — это уже ESCALATE.
На что я наступил
1. Telegram режет webhook на длинных ответах. Если ответ от Claude превышает 4096 символов — сообщение обрезается без ошибки. Я добавил жёсткий лимит в системный промпт («не более 600 слов») и проверку длины перед отправкой.
2. n8n теряет webhook после рестарта если поменял домен. При первом переезде на новый поддомен я полчаса не понимал, почему бот молчит. Решение — после смены WEBHOOK_URL руками заново регистрировать webhook у Telegram.
3. Claude иногда «галлюцинирует» цены. Если в системном промпте упомянуть «обсуждай тарифы» без явного списка — модель уверенно выдумает цифры. Я держу прайс-лист отдельным узлом и инжектирую его в каждый запрос как user-сообщение.
4. Я не тестировал на нагрузке выше 30 сообщений в минуту. Бутылочное горлышко — n8n executions, не API. На моих объёмах это никогда не было проблемой; на ваших — может быть.
Куда расти
Очевидное направление — добавить мини-RAG поверх корпоративной wiki. У меня нет такой задачи, но если бы была — я бы взял LlamaIndex и держал индекс на той же VPS. Лишних $0 в месяц.
Менее очевидное — заменить Telegram-триггер на универсальный «канал входа» с поддержкой WhatsApp Business и почты. Тогда вся связка превращается в полноценный inbox-агрегатор.
Альтернативы, которые я смотрел: Make (дороже на наших объёмах), Zapier (ещё дороже и без HTTP-нод нормальных), кастомный сервис на Python (быстрее, но дольше делать и потом кому-то поддерживать).
Получать новые разборы
Подписывайтесь на обновления, чтобы получать новые инструкции в числе первых