Свой Telegram-агент: на примере копирайтера
В уровне 1 мы поднимали Джарвис — общий Claude Code в Telegram, который отвечает на любые вопросы. Здесь задача другая. Я не хочу общего Claude. Хочу узкого помощника: бот, который умеет одно — превращать мои голосовые в готовые посты в моём стиле, со своими правилами, со своей памятью прошлых постов. И пользоваться им буду только я.
Это уровень 2 практики. Архитектура такая же как у бота-продукта для клиентов (см. статью 13, раздел про 6 компонентов), но проще: один пользователь = ты, нет монетизации, нет защиты от спама. Зато есть чёткая роль, заточенный промпт, своя база знаний.
Скажи Claude Code: «Сделай мне Telegram-бота-копирайтера. Я буду присылать ему голосовые с идеями, он будет возвращать готовые посты в моём стиле. Стек — Python + python-telegram-bot, API через OpenRouter, голосовые расшифровывать через Groq Whisper». Claude разберётся и поведёт по шагам.
Только две оговорки. Первая: иногда уведёт не туда — сложный фреймворк там, где нужен простой код. Вторая: следующий раз сделает другим путём. Я ниже расписываю проверенную инструкцию — то что у меня лично работает. Если хочешь без сюрпризов — иди по ней.
Чем отличается от Джарвиса
| 13a Джарвис | 13b Агент-копирайтер | |
|---|---|---|
| Что общается с тобой | Чистый Claude Code через подписку | Свой бот с собственной ролью и промптом |
| Где живёт логика | В тебе и Claude Max | В системном промпте + базе знаний на сервере |
| API | Через подписку (без отдельного ключа) | Через ключ OpenRouter (отдельный счёт) |
| Контекст | 1М токенов в одной сессии | Управляешь сам — обычно последние 10-20 сообщений |
| Когда нужно | «Универсальный ассистент» | «Узкий помощник под повторяющуюся задачу» |
Главное отличие в одном предложении: Джарвис — это сам Claude в Telegram. Агент-копирайтер — это твой кастомный бот, который ходит в Claude по API.
Что соберём
Бот, который:
- Принимает голосовое сообщение → расшифровывает через Groq Whisper → возвращает готовый пост в твоём стиле
- Использует базу знаний с твоими правилами стиля, любимыми оборотами, запрещёнными словами
- Хранит историю прошлых постов в SQLite (чтобы не повторяться по темам)
- Команда
/last— показать последние 5 постов - Защита: только ты можешь писать (whitelist по Telegram-id)
- Работает 24/7 на VPS
Пример именно копирайтер для конкретики. Под другую задачу — бот-секретарь, бот-исследователь, бот-редактор расходов — структура та же, меняется только база знаний и системный промпт.
Архитектура — 6 компонентов
Те же шесть компонентов, что в статье 13. Здесь — конкретное наполнение для копирайтера:
| Компонент | Что в нашем боте |
|---|---|
| База знаний | Папка knowledge/: style.md, templates.md, vocab.md, archive.md |
| Retrieval | Простой grep по knowledge/ (на старте) |
| Системный промпт | Файл system-prompt.md: кто бот, какая воронка, что нельзя |
| Модель | Claude Sonnet через OpenRouter |
| Оркестратор | Python + python-telegram-bot — простой бот-handler |
| Интерфейс | Telegram-бот через BotFather |
Стек и принципы
- Python + python-telegram-bot — тот же стек, что в 13a про Джарвиса. Один инструмент на все наши туториалы — меньше путаницы. Курс «Агент-копирайтер» Нейроуниверситета использует aiogram, но Claude легко переписывает код с одной библиотеки на другую — для нашей аудитории разницы нет.
- OpenRouter для API — это сервис-роутер: один ключ, через него работают и Claude, и GPT, и Gemini. Главный плюс: OpenRouter принимает запросы с русского IP без проблем, в отличие от прямого Anthropic API. Решает проблему блокировок раз и навсегда.
- Groq Whisper — для расшифровки голосовых (бесплатно, как в 13a).
- SQLite — для хранения истории постов (один файл, без отдельной базы данных).
Что нужно перед стартом
| Что | Зачем | Стоимость |
|---|---|---|
| Claude Code на ноутбуке | Через него собираем бота | подписка |
| Аккаунт OpenRouter | API-ключ для общения с моделью | положить $5-10 на старт |
| Аккаунт Groq | Для расшифровки голосовых | бесплатно |
| Аккаунт в Telegram | Куда писать боту | бесплатно |
| VPS (Beget или TimeWeb) | Где живёт бот | ~900 ₽/мес |
Шаг 1. Бот в BotFather
Тот же шаг, что в 13a, шаг 1 — @BotFather → /newbot → имя → username → токен. Не повторяю целиком.
Шаг 2. Получить OpenRouter API key
Заходишь на openrouter.ai, регистрируешься через Google или email. В правом верхнем углу — иконка профиля → Keys → Create Key. Сохраняешь ключ вида sk-or-v1-....
Положи на счёт $5-10 для старта (карта работает, в том числе российская в большинстве случаев). Этого хватит на сотни сообщений в Claude Sonnet.
OpenRouter — это как booking.com для нейронок. Один аккаунт, один счёт — а доступ ко всем моделям сразу: Claude, GPT, Gemini, Llama. Удобно, плюс если одна модель сломалась — переключился на другую за минуту, не меняя код.
Шаг 3. Получить Groq API Key
Тот же шаг, что в 13a, шаг 3. Если уже делал Джарвис — можно использовать тот же ключ.
Шаг 4. Создать структуру проекта
На ноутбуке создай папку проекта:
mkdir tg-copywriter-bot cd tg-copywriter-bot
Структура папки:
tg-copywriter-bot/
knowledge/
style.md ← правила стиля
templates.md ← шаблоны постов
vocab.md ← словарь: запрещённые и любимые слова
archive.md ← последние 20-30 опубликованных постов
system-prompt.md ← системный промпт для бота
bot.py ← сам бот (напишет Claude)
.env.example ← документация ключей (без значений)
requirements.txt ← зависимости Python
CLAUDE.md ← инструкция для Claude Code
Шаг 5. CLAUDE.md проекта
Базовый файл проекта — что Claude должен знать про этот проект. Стандарт расписан в статье 03, раздел «Что писать в CLAUDE.md». Для нашего бота минимум:
# Telegram-агент-копирайтер ## Что это Бот, который превращает мои голосовые в готовые посты в моём стиле. ## Стек - Python 3.11 - python-telegram-bot 21.x - httpx (для OpenRouter и Groq) - SQLite для истории постов ## Внешние сервисы - OpenRouter — API к Claude Sonnet - Groq Whisper — расшифровка голосовых - Telegram Bot API ## База знаний Лежит в knowledge/. Один файл = одна тема. Бот читает её через простой grep. ## Правила - Без enterprise-говна, бот для одного пользователя - Не плодить конфигурацию без причины - Логи через стандартный logging, не сторонние библиотеки - Все ключи через .env, ничего не коммитить
Шаг 6. База знаний — самое важное
Раскрою главное правило, которое подсвечено в статье 13: 80% качества агента = качество базы знаний и системного промпта. Не модель, не стек, не оркестратор. База.
Для копирайтера база — это четыре файла. Ниже — реальные примеры (мои), можешь забрать как есть и переделать под себя.
style.md — правила стиля
Здесь ты буквально записываешь как пишешь. Свой голос. Чем точнее распишешь — тем точнее бот попадёт в твой стиль.
# Стиль постов ## Тон - На «ты», по-дружески, как с коллегой — без официоза - Кратко и по делу, без воды и лишних «как видишь, я успешно сделал...» - Без эмодзи в тексте - От первого лица: «я», «мне», «у меня» ## Структура - Короткие абзацы (1-3 предложения) - Заход — конкретная сцена, факт, провокационный вопрос - Развитие — 2-3 абзаца - Финал — панчлайн без воды. НЕ «а как думаете вы?» — это убивает пост. ## Чего никогда не делаю - Жирного текста - Маркированных списков внутри текста статьи - Канцелярита и «экспертного» языка - Дайджеста без позиции (пересказал новости — и что?) ## Авторские фразы (не трогать никогда) - «стоит немного подзаморочиться» - «я ведь знаю что вам не охота» - «копилка чтобы не наступать на те же грабли» ## Длина - 800-1500 символов на пост
templates.md — рабочие шаблоны постов
Те структуры, которые у тебя уже работали. Чтобы бот не изобретал, а опирался на проверенное. У меня единая формула на все площадки + типы крючков.
# Шаблоны постов ## Универсальная формула: КРЮЧОК → КОНТЕКСТ → КОНФЛИКТ → ВЫВОД → ПРИЗЫВ КРЮЧОК — первые 1-2 строки, стоп-скролл. Решает читать или нет. КОНТЕКСТ — почему тема важна, вводит в ситуацию. КОНФЛИКТ — столкновение позиций, напряжение. Без конфликта пост — просто информация. ВЫВОД — неожиданный, честный, может быть спорным. НЕ мотивационный. ПРИЗЫВ — конкретное действие. НЕ «а как думаете вы?». Метрика: репосты и пересылки, не лайки. ## Типы крючков (выбираешь один на пост) 1. Историческая сторителлинг — конкретная дата, имя, место. 2. Свежее исследование — ссылка на авторитетный источник. 3. Провокация через абсурд — нелепая, но реальная ситуация. 4. Личное наблюдение — конкретная сцена, от первого лица. 5. Парадокс — утверждение которое кажется неверным, но это правда. 6. Провокационный вопрос — НЕ мягкий «а вы что думаете?», а цепляющий. ## 6 типов контента, которым делятся 1. Резонанс и закрытые темы — то о чём все думают, но никто не говорит. 2. Разрушение мифов — «все думают X, а на самом деле Y» с доказательствами. 3. Кейсы и гуру — разбор конкретного примера или авторитета. 4. Ретроградный взор — «раньше было так, а теперь...». 5. Смена призмы — посмотреть на привычное с неожиданного угла. 6. Неожиданные исследования — цифры и факты которые удивляют.
vocab.md — словарь
Списки запрещённых и любимых слов. Бот учитывает их при генерации.
# Словарь ## Запрещённые слова и обороты - погружение - на стыке - уникальная методика - пассивный доход - гарантированный результат - в эпоху цифровой трансформации - успешный успех - мощный инструмент - революционный подход ## Что всегда добивает пост (не делать) - Дайджест без позиции - Длинный пост без чёткой идеи - Финал «а как думаете вы?» - Канцелярский язык - Пост без личности (мог написать кто угодно) ## Любимые слова и темы - вайбкодинг - второй мозг - прикладной - из коробки - база знаний - грабли (об ошибках) - копилка - система
archive.md — история постов
Последние 20-30 опубликованных постов. Нужно чтобы бот не повторялся по темам и помнил твой реальный стиль.
# Архив постов ## 2026-05-07 [Полный текст последнего поста] ## 2026-05-05 [Полный текст] ...
На старте можно положить хоть 5 постов — главное начать. Дальше будешь добавлять каждый новый. Можно автоматизировать: команду /save боту, которая сохраняет одобренный пост в архив.
Шаг 7. Системный промпт
Файл system-prompt.md. Это инструкция боту: кто он, что делает, как ведёт диалог. Готовый шаблон:
Ты помощник [имя] по контенту в Telegram. Твоя задача — превращать голосовые сообщения в готовые посты в его стиле. Воронка: 1. Получаешь расшифрованное голосовое. 2. Определяешь тип поста: история, лайфхак, разбор, мнение. 3. Подтягиваешь релевантный шаблон из knowledge/templates.md. 4. Пишешь пост по правилам из knowledge/style.md. 5. Проверяешь по knowledge/vocab.md (нет запрещённых слов, есть любимые). 6. Сверяешь с knowledge/archive.md, чтобы тема не дублировалась. 7. Возвращаешь готовый пост. Запрещено: - Использовать запрещённые слова из vocab.md. - Дублировать темы из archive.md (последние 30 постов). - Менять авторские фразы. - Делать пост длиннее 1500 символов или короче 800. Стиль: на «ты», по-дружески, без официоза. Если идея голосового неясная — задай один уточняющий вопрос, потом пиши.
Шаг 8. Первый промпт Claude — собрать MVP
Запусти Claude Code в папке проекта (claude в терминале). Дальше — этот промпт буквально:
Создай Telegram-бот-копирайтер на Python + python-telegram-bot. Что должен уметь: - Принимать голосовые → расшифровывать через Groq Whisper → отдавать в Claude через OpenRouter - Использовать knowledge/ как базу знаний (через простой grep по содержимому файлов на ключевые слова из голосового) - Использовать system-prompt.md как системный промпт - Хранить историю в SQLite (data/bot.db) — последние 30 постов в archive_db - Команда /last — показать последние 5 постов - Команда /save — сохранить только что сгенерированный пост в архив - Whitelist по Telegram-id (только мой) - .env с TELEGRAM_BOT_TOKEN, OPENROUTER_API_KEY, GROQ_API_KEY, MY_TELEGRAM_ID - Модель: anthropic/claude-sonnet-4 (через OpenRouter) - В контексте к модели передавать последние 5 сообщений диалога Сделай максимально просто, без лишнего enterprise-говна — этим буду пользоваться только я. Нейронка тренировалась на сложных open-source решениях и любит over-engineering, мне это не надо. Перед написанием кода — задай мне уточняющие вопросы.
Самое важное — фразы «без лишнего enterprise-говна» и «задай мне уточняющие вопросы». Без первой Claude насадит абстракций. Без второй сразу начнёт писать код, и потом всё переделывать.
Шаг 9. Тест локально
Claude сам всё запустит и покажет как пользоваться. Главное — на этом этапе закрепи правило в memory.md (или CLAUDE.md через /memory add):
Всё что можешь сделать сам — делай сам. Запускай в терминале сам, ставь зависимости сам, тестируй сам. Если упёрся в реальный блокер — только тогда зови меня. Я не хочу ничего устанавливать руками.
Это закрепляется один раз — дальше Claude перестаёт лениться и просить «запусти сам в терминале» по каждому чиху.
Шаг 10. GitHub
Краткая ссылка на статью 06, раздел про .gitignore. Особенности для бота:
- В
.gitignore:.env,data/bot.db,__pycache__/,.venv/ - НЕ клади
requirements.txtв gitignore (типичная ошибка) — без него на сервере поставятся другие версии библиотек - В
.env.example— все ключи без значений, для документации
В курсе копирайтера был реальный кейс — Claude обнаружил, что в .env.example остался настоящий ключ шифрования сессии. Без проверки утечка пошла бы даже в приватный репозиторий.
Шаг 11. Аренда VPS
Не повторяю — всё уже расписано в 13a, раздел про VPS. Кратко: Beget, тариф 2/4/30 за ~27 ₽/день, Ubuntu 24.04, регион Москва.
Шаг 12. Деплой через Claude по SSH
Главное правило: ты не лезешь в терминал руками. Даёшь Claude данные сервера (IP, root, пароль) — он сам подключается, клонирует репозиторий, ставит зависимости, копирует .env с локалки, поднимает systemd-сервис.
Готовые промпты для Claude — раскрой нужный, скопируй, вставь в Claude Code на ноутбуке. Идти строго по порядку: 1 → 2 → 3 → 4 → 5.
1. Подключение к VPS и первый запуск бота
Мне нужно, чтобы ты мог деплоить моего Telegram-бота на VPS-сервер. Данные сервера: IP-адрес: [IP] Логин: root Способ входа: пароль [PASSWORD] Твоя задача: 1. Подключиться через SSH. 2. Проверить версию Python (нужна 3.11+). 3. Проверить git. 4. Создать папку проекта /root/tg-copywriter-bot. 5. Склонировать репозиторий с GitHub. 6. Установить зависимости. 7. Подготовить .env (на следующем шаге я скажу как). 8. Запустить бота вручную для проверки. 9. Объяснить, как я могу проверить, что он работает. Не показывай пароли и ключи в ответе. Если чего-то не хватает — скажи, что именно нужно подготовить.
2. Установка зависимостей и виртуального окружения
Установи все зависимости для моего проекта на сервере. Сделай: 1. Проверь Python 3.11. 2. Создай виртуальное окружение в папке проекта. 3. Активируй его. 4. Установи зависимости из requirements.txt. 5. Проверь, что основные пакеты установились (python-telegram-bot, httpx). 6. Если возникла ошибка — объясни простыми словами что не так.
3. Копирование .env с правами 600
Возьми мой .env файл из локального проекта и положи его на VPS. Важно: 1. Просто скопируй файл с моего компа на сервер. 2. Не показывай содержимое .env в ответе. 3. На сервере выставь права 600 (читает только владелец). 4. Проверь, что файл лежит в папке проекта. 5. Проверь, что бот сможет его прочитать.
4. Настройка systemd-службы для работы 24/7
Настрой systemd-службу для Telegram-бота. Параметры: - Проект: /root/tg-copywriter-bot - Файл запуска: bot.py - Виртуальное окружение: .venv - Название службы: tg-copywriter-bot Сделай: 1. Создай unit-файл systemd. 2. Укажи рабочую папку проекта. 3. Укажи запуск через python из виртуального окружения. 4. Настрой Restart=always (если упадёт — перезапустить). 5. Перезагрузи systemd. 6. Включи автозапуск (enable). 7. Запусти службу. 8. Покажи статус. 9. Покажи, как смотреть логи: journalctl -u tg-copywriter-bot -f. Если возникнет ошибка — объясни простыми словами.
5. Цикл обновления — одной командой
Подключись к серверу [IP], зайди в папку /root/tg-copywriter-bot. Сделай: 1. git pull 2. Если requirements.txt изменился — обнови зависимости в venv. 3. Перезапусти службу tg-copywriter-bot. 4. Покажи статус службы. 5. Покажи последние 50 строк логов. 6. Напиши, что мне проверить в Telegram. Не показывай содержимое .env.
Команды systemd, которые полезно знать
sudo systemctl status tg-copywriter-bot # статус sudo systemctl restart tg-copywriter-bot # рестарт sudo systemctl stop tg-copywriter-bot # остановка sudo systemctl enable tg-copywriter-bot # автозапуск после ребута sudo systemctl disable tg-copywriter-bot # выключить автозапуск journalctl -u tg-copywriter-bot -f # живые логи journalctl -u tg-copywriter-bot -n 100 # последние 100 строк
Шаг 13. Закрепить «обнови бота» как триггер
Чтобы дальше деплой обновлений был одной фразой — добавь в CLAUDE.md правило:
## Деплой обновлений Когда я говорю «задеплой» или «обнови бота» — делай: 1. git add . && git commit -m "..." && git push 2. ssh root@MY_SERVER_IP 3. cd /root/tg-copywriter-bot && git pull 4. Если requirements.txt изменился — pip install -r requirements.txt 5. systemctl restart tg-copywriter-bot 6. systemctl status tg-copywriter-bot 7. journalctl -u tg-copywriter-bot -n 30 | покажи мне
Дальше любая правка → одно слово → бот обновлён за минуту.
Шаг 14. Сделать deploy.md
Промпт Claude:
Создай deploy.md в проекте. Опиши: где лежит проект на сервере, как называется systemd-служба, как обновить код, как перезапустить, как посмотреть статус и логи, где .env, что нельзя коммитить, что делать если бот не отвечает. Не вставляй реальные пароли и IP.
Через 3 месяца, когда забудешь как обновлять — открыл deploy.md, прочитал, обновил.
Грабли
Без него на сервере поставятся другие версии — бот будет глючить.
Чтобы файл с секретами читал только сам бот, не другие пользователи системы.
В jarvis.service обе настройки. Без enable после ребута сервера бот не стартанёт. Без Restart=always упадёт при первой ошибке.
Если на сервере живёт несколько ботов — каждый в своей папке, со своим venv. Иначе зависимости одного бота сломают другого.
Самая частая ошибка — «давай быстро напишу код, потом наполню базу». Получается агент с кодом за час, который три недели «доучивается». Лучше наоборот: 2-4 часа на качественную базу + 30 минут на код.
Это уровень 2 — свой агент под задачу для себя одного. Если задача — продавать продукт клиентам через бот, обрабатывать возражения, доводить до заявки — это уровень 3, см. статью 13 про архитектуру агента-продукта. Там же — про монетизацию (Telegram Stars, Робокасса) и юридические нюансы.