Outcome

Что получится в конце

Telegram-бот, который отвечает на типовые вопросы клиентов сам — про сроки, цены, условия. Если вопрос нестандартный, он молча пересылает диалог мне, добавляя короткое summary и предлагаемый ответ. Я нажимаю «Отправить» — или правлю и отправляю.

За три месяца работы цифры такие:

$4.20в мес. при ~1000 ответов
82%диалогов закрыты без меня
2.3sмедианная латентность

Это не «автономный 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 уже крутится десяток других вещей.

Доступы, которые понадобятся: аккаунт Anthropic Console с биллингом, Telegram-аккаунт для @BotFather, root на VPS (или хотя бы Docker), домен или подключённый Cloudflare Tunnel.
Setup

Пошагово

  1. Поднять n8n на VPS через Docker

    Я разворачиваю n8nio/n8n через docker-compose с традиционным Caddy-фронтом для HTTPS. Конфиг минимальный, главный нюанс — переменная WEBHOOK_URL должна указывать на публичный URL, иначе Telegram не достучится.

    docker-compose.yml
    services:
      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"
  2. Создать бота через @BotFather и получить токен

    В Telegram пишем /newbot, даём имя, получаем токен вида 123:ABC.... Сохраняем в .env n8n как TG_TOKEN. Тут же отключаем Group Privacy через /setprivacy, если планируем держать бота в групповых чатах.

  3. Поставить webhook у Telegram на n8n

    В n8n создаём workflow с триггером Telegram Trigger. Он сам зарегистрирует webhook через bot API. Если сделать руками — один POST:

    bash
    curl -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 должно быть пусто.

  4. Промпт и ноды Anthropic

    В workflow после Telegram-триггера добавляем ноду HTTP Request на https://api.anthropic.com/v1/messages (есть нативный community-узел, но я предпочитаю HTTP — меньше зависимостей при апдейтах).

    Системный промпт хранится в отдельном узле Set: правила, тон, примеры на 6–8 диалогов. Главное правило промпта одно: «если запрос не подпадает под X/Y/Z — ответь словом ESCALATE».

  5. Маршрутизация: ответ боту или мне

    После ответа 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 (быстрее, но дольше делать и потом кому-то поддерживать).