Свой 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.

Что соберём

Бот, который:

Пример именно копирайтер для конкретики. Под другую задачу — бот-секретарь, бот-исследователь, бот-редактор расходов — структура та же, меняется только база знаний и системный промпт.

Архитектура — 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

Стек и принципы

Что нужно перед стартом

Что Зачем Стоимость
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. В правом верхнем углу — иконка профиля → KeysCreate Key. Сохраняешь ключ вида sk-or-v1-....

Положи на счёт $5-10 для старта (карта работает, в том числе российская в большинстве случаев). Этого хватит на сотни сообщений в Claude Sonnet.

Аналогия

OpenRouter — это как booking.com для нейронок. Один аккаунт, один счёт — а доступ ко всем моделям сразу: Claude, GPT, Gemini, Llama. Удобно, плюс если одна модель сломалась — переключился на другую за минуту, не меняя код.

[Скриншот: OpenRouter Console с созданным API key]

Шаг 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
[Скриншот: структура папки tg-copywriter-bot в IDE]

Шаг 5. CLAUDE.md проекта

Базовый файл проекта — что Claude должен знать про этот проект. Стандарт расписан в статье 03, раздел «Что писать в CLAUDE.md». Для нашего бота минимум:

▸ 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 — правила стиля

Здесь ты буквально записываешь как пишешь. Свой голос. Чем точнее распишешь — тем точнее бот попадёт в твой стиль.

▸ knowledge/style.md
# Стиль постов

## Тон
- На «ты», по-дружески, как с коллегой — без официоза
- Кратко и по делу, без воды и лишних «как видишь, я успешно сделал...»
- Без эмодзи в тексте
- От первого лица: «я», «мне», «у меня»

## Структура
- Короткие абзацы (1-3 предложения)
- Заход — конкретная сцена, факт, провокационный вопрос
- Развитие — 2-3 абзаца
- Финал — панчлайн без воды. НЕ «а как думаете вы?» — это убивает пост.

## Чего никогда не делаю
- Жирного текста
- Маркированных списков внутри текста статьи
- Канцелярита и «экспертного» языка
- Дайджеста без позиции (пересказал новости — и что?)

## Авторские фразы (не трогать никогда)
- «стоит немного подзаморочиться»
- «я ведь знаю что вам не охота»
- «копилка чтобы не наступать на те же грабли»

## Длина
- 800-1500 символов на пост

templates.md — рабочие шаблоны постов

Те структуры, которые у тебя уже работали. Чтобы бот не изобретал, а опирался на проверенное. У меня единая формула на все площадки + типы крючков.

▸ knowledge/templates.md
# Шаблоны постов

## Универсальная формула: КРЮЧОК → КОНТЕКСТ → КОНФЛИКТ → ВЫВОД → ПРИЗЫВ

КРЮЧОК — первые 1-2 строки, стоп-скролл. Решает читать или нет.
КОНТЕКСТ — почему тема важна, вводит в ситуацию.
КОНФЛИКТ — столкновение позиций, напряжение. Без конфликта пост — просто
информация.
ВЫВОД — неожиданный, честный, может быть спорным. НЕ мотивационный.
ПРИЗЫВ — конкретное действие. НЕ «а как думаете вы?».

Метрика: репосты и пересылки, не лайки.

## Типы крючков (выбираешь один на пост)

1. Историческая сторителлинг — конкретная дата, имя, место.
2. Свежее исследование — ссылка на авторитетный источник.
3. Провокация через абсурд — нелепая, но реальная ситуация.
4. Личное наблюдение — конкретная сцена, от первого лица.
5. Парадокс — утверждение которое кажется неверным, но это правда.
6. Провокационный вопрос — НЕ мягкий «а вы что думаете?», а цепляющий.

## 6 типов контента, которым делятся

1. Резонанс и закрытые темы — то о чём все думают, но никто не говорит.
2. Разрушение мифов — «все думают X, а на самом деле Y» с доказательствами.
3. Кейсы и гуру — разбор конкретного примера или авторитета.
4. Ретроградный взор — «раньше было так, а теперь...».
5. Смена призмы — посмотреть на привычное с неожиданного угла.
6. Неожиданные исследования — цифры и факты которые удивляют.

vocab.md — словарь

Списки запрещённых и любимых слов. Бот учитывает их при генерации.

▸ knowledge/vocab.md
# Словарь

## Запрещённые слова и обороты
- погружение
- на стыке
- уникальная методика
- пассивный доход
- гарантированный результат
- в эпоху цифровой трансформации
- успешный успех
- мощный инструмент
- революционный подход

## Что всегда добивает пост (не делать)
- Дайджест без позиции
- Длинный пост без чёткой идеи
- Финал «а как думаете вы?»
- Канцелярский язык
- Пост без личности (мог написать кто угодно)

## Любимые слова и темы
- вайбкодинг
- второй мозг
- прикладной
- из коробки
- база знаний
- грабли (об ошибках)
- копилка
- система

archive.md — история постов

Последние 20-30 опубликованных постов. Нужно чтобы бот не повторялся по темам и помнил твой реальный стиль.

▸ knowledge/archive.md
# Архив постов

## 2026-05-07
[Полный текст последнего поста]

## 2026-05-05
[Полный текст]

...

На старте можно положить хоть 5 постов — главное начать. Дальше будешь добавлять каждый новый. Можно автоматизировать: команду /save боту, которая сохраняет одобренный пост в архив.

Шаг 7. Системный промпт

Файл system-prompt.md. Это инструкция боту: кто он, что делает, как ведёт диалог. Готовый шаблон:

▸ 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. Особенности для бота:

Параноидально проверь .env.example перед push

В курсе копирайтера был реальный кейс — 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 и первый запуск бота
▸ Промпт 1
Мне нужно, чтобы ты мог деплоить моего 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. Установка зависимостей и виртуального окружения
▸ Промпт 2
Установи все зависимости для моего проекта на сервере.

Сделай:
1. Проверь Python 3.11.
2. Создай виртуальное окружение в папке проекта.
3. Активируй его.
4. Установи зависимости из requirements.txt.
5. Проверь, что основные пакеты установились (python-telegram-bot, httpx).
6. Если возникла ошибка — объясни простыми словами что не так.
3. Копирование .env с правами 600
▸ Промпт 3
Возьми мой .env файл из локального проекта и положи его на VPS.

Важно:
1. Просто скопируй файл с моего компа на сервер.
2. Не показывай содержимое .env в ответе.
3. На сервере выставь права 600 (читает только владелец).
4. Проверь, что файл лежит в папке проекта.
5. Проверь, что бот сможет его прочитать.
4. Настройка systemd-службы для работы 24/7
▸ Промпт 4
Настрой 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. Цикл обновления — одной командой
▸ Промпт 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, прочитал, обновил.

Грабли

requirements.txt НЕЛЬЗЯ в .gitignore

Без него на сервере поставятся другие версии — бот будет глючить.

Права 600 на .env на сервере

Чтобы файл с секретами читал только сам бот, не другие пользователи системы.

Restart=always + systemctl enable

В jarvis.service обе настройки. Без enable после ребута сервера бот не стартанёт. Без Restart=always упадёт при первой ошибке.

Изоляция ботов на одном VPS

Если на сервере живёт несколько ботов — каждый в своей папке, со своим venv. Иначе зависимости одного бота сломают другого.

Сначала база знаний, потом код

Самая частая ошибка — «давай быстро напишу код, потом наполню базу». Получается агент с кодом за час, который три недели «доучивается». Лучше наоборот: 2-4 часа на качественную базу + 30 минут на код.

Что дальше

Это уровень 2 — свой агент под задачу для себя одного. Если задача — продавать продукт клиентам через бот, обрабатывать возражения, доводить до заявки — это уровень 3, см. статью 13 про архитектуру агента-продукта. Там же — про монетизацию (Telegram Stars, Робокасса) и юридические нюансы.