Как я построил AI-систему для ведения личного бренда (пока я сплю)
Привет, хабровчане! Я — DoctorM&Ai, врач-заведующий клинико-диагностической лабораторией (КДЛ) в федеральном медицинском учреждении с 15+ годами стажа за плечами. Днём я разбираюсь с анализами, пациентами и бесконечными отчётами, а ночами — соло AI-разработчик с 19 проектами в портфолио. Жизнь кипит, времени на всё не хватает, но личный бренд? Это же must-have в 2024-м. Почему врачу бренд? Да потому что в эпоху ИИ медицина + tech — это золотая жила. Хочу делиться инсайтами из лабы, хвастаться проектами, привлекать коллег и, может, даже инвесторов. Но постить вручную? Ха, я и так сплю по 4 часа. Решение: HYPE PROTOCOL — моя AI-система автоконтента. Она сканирует мои проекты, генерит посты и публикует их, пока я дремлю. Звучит как sci-fi? На деле — Python, Telegram-бот и немного systemd-магии. Давайте разберём по полочкам, без воды и преувеличений. Система молодая, сырая, но уже работает.
Зачем врачу личный бренд (и почему без него никак)
Сначала о мотивации, потому что без неё код — мёртвое письмо. Я в медицине не новичок: 15+ лет — это тысячи анализов, от ПЦР до гематологии, плюс управление КДЛ в федералке. Там бюрократия, как в матрице: формы, аккредитации, оборудование на миллионы. Но параллельно я соло-разработчик. 19 проектов — от чат-ботов для врачей до ИИ-анализаторов данных лабы. Каждый проект — это огрызок кода, который мог бы стать постом в Telegram или Habr. "Смотрите, интегрировал Grok в лабораторный пайплайн!" Или "Новый скрипт для парсинга баз данных Roche".
Проблема: времени ноль. Работа 12+ часов, кодинг по ночам, семья. Ручной контент? Один пост в неделю — предел. А бренд требует регулярности: 3–5 постов в неделю, чтобы алгоритмы Telegram не забыли о тебе. Плюс, как врач, я не хочу спамить ерундой — контент должен быть ценным: обновления проектов, ИИ в медицине, лайфхаки для devs в белых халатах.
Вот и родился HYPE PROTOCOL. Идея простая: автоматизировать 80% рутины. Система мониторит мой projects.json — файл со списком всех 19 проектов (названия, статусы, описания, ссылки на репозитории). Находит изменения — новый коммит, апдейт статуса, — и бац: генерит пост через LLM, публикует в канал @LLMevangelist. Пока я сплю, AI хайпит меня. Юмор в том, что я — "врач, который лечит код", а теперь код лечит мой бренд.
Канал @LLMevangelist уже оформлен: аватар с моим фото в лабе + нейронка, описание "ИИ для медицины и devs от DoctorM&Ai", закрепленный пост с манифестом. Подписчиков пока немного — система только запустилась, — но это база для роста.
Архитектура HYPE PROTOCOL: схема работы
HYPE PROTOCOL — не монолит, а пайплайн из трёх этапов: observe (мониторинг), generate (контент), publish (постинг). Всё крутится на VPS (Debian, ничего fancy), без облаков вроде AWS — дешево и сердито.
Вот ASCII-схема, чтобы было понятно:
projects.json (локальный файл, git-репо)
|
v
[ОБСЕРВЕР] (systemd timer каждые 6ч)
- diff с предыдущим состоянием
- если изменения: триггер GENERATE
|
v
[ГЕНЕРАТОР] (OpenRouter + Grok 4.1 Fast)
- промпт: "Сделай пост про изменения в проекте X"
- база моделей: SQLite с 368 моделями OpenRouter
|
v
[ПУБЛИШЕР] (aiogram 3.17.0 бот)
- пост в @LLMevangelist
- Daily Report в 10:00 MSK (systemd)
Observe: Каждые 6 часов systemd-таймер запускает скрипт observe.py. Он читает projects.json, сравнивает с кэшем (ещё один JSON в /var/hype/cache.json). Изменения? Логгирует и кидает задачу в очередь (простой файл-queue в /var/hype/queue/).
Generate: Python-скрипт generate.py берёт изменения, строит промпт для LLM. Модель — Grok 4.1 Fast через OpenRouter (API ключ в env). Почему Grok? Быстрый, креативный, не цензурит tech-темы. Промпт шаблонный: "Ты SMM-менеджер для AI-девелопера. Проект: {name}. Изменения: {diff}. Сделай пост 200–300 слов: хайп, факты, призыв к действию. Тон: живой, техничный." Вывод — Markdown для Telegram.
База моделей в SQLite: я спарсил все 368 моделей с OpenRouter (скрипт fetch_models.py раз в неделю). Таблица models с полями id, name, pricing, speed. Генератор выбирает по критериям: fast + cheap.
Publish: aiogram-бот bot.py на Python 3.10. Поллинг, админка для меня (команды /status, /manual). Постит в канал. Daily Report — сводка за день: "Обновлено 2 проекта, сгенерено 1 пост".
Всё idempotent: если краш — перезапустится. Логи в /var/log/hype/, ротация через logrotate.
Юмор: представьте, я в лабе колю кровь, а на VPS мой projects.json шепчет "обновись, босс", и Grok строчит "Вау, новый фичер в проекте #5!" Пока я ем бутер, бренд растёт.
Техническая реализация: код, systemd, aiogram, OpenRouter
Теперь мясо — код. Всё на Python 3.10, venv, pip: aiogram==3.17.0, openrouter-py (неофициалка), sqlite3, gitpython для diff. Нет фреймворков вроде FastAPI — соло-стиль, скрипты + cron-подобное.
1. projects.json — сердце системы
Файл в git-репо (мой приватный). Пример структуры (анонимизировано):
{
"projects": [
{
"id": 1,
"name": "LabAI Analyzer",
"status": "active",
"last_update": "2024-10-01",
"description": "ИИ для парсинга лабораторных данных",
"repo": "github.com/doctormai/labai",
"changes": ["added Grok integration"]
},
// ... 18 других
]
}
Observe.py читает его, diff с кэшем:
import json
import difflib
from pathlib import Path
PROJECTS_PATH = Path("/home/doctormai/projects.json")
CACHE_PATH = Path("/var/hype/cache.json")
QUEUE_PATH = Path("/var/hype/queue/tasks.json")
def observe():
with open(PROJECTS_PATH) as f:
current = json.load(f)
try:
with open(CACHE_PATH) as f:
prev = json.load(f)
except FileNotFoundError:
prev = {}
changes = []
for proj in current['projects']:
prev_proj = next((p for p in prev.get('projects', []) if p['id'] == proj['id']), {})
if prev_proj.get('last_update') != proj['last_update']:
diff = '\n'.join(difflib.unified_diff(
[json.dumps(prev_proj)], [json.dumps(proj)], lineterm=''
))
changes.append({'proj': proj, 'diff': diff})
if changes:
queue = {'tasks': changes}
with open(QUEUE_PATH, 'w') as f:
json.dump(queue, f)
print(f"Found {len(changes)} changes")
with open(CACHE_PATH, 'w') as f:
json.dump(current, f)
Просто, но работает. Diff показывает, что поменялось.
2. Systemd таймеры — надёжный будильник
На VPS два таймера: observe.timer (каждые 6ч) и daily.timer (10:00 MSK).
/etc/systemd/system/hype-observe.timer:
[Unit]
Description=Hype Observe Timer
[Timer]
OnCalendar=*:0/6
Persistent=true
[Install]
WantedBy=timers.target
Сервис hype-observe.service:
[Unit]
Description=Hype Observe
After=network.target
[Service]
Type=oneshot
User=doctormai
ExecStart=/home/doctormai/venv/bin/python /home/doctormai/hype/observe.py
WorkingDirectory=/home/doctormai/hype
Аналогично для daily-report.service: генерит сводку и постит.
systemctl enable --now hype-observe.timer — и готово. Логи: journalctl -u hype-observe.
3. Генератор с OpenRouter и базой моделей
Сначала база: models.db с 368 моделями. Скрипт fetch:
import requests
import sqlite3
conn = sqlite3.connect('models.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS models
(id TEXT PRIMARY KEY, name TEXT, pricing REAL, speed REAL)''')
# API OpenRouter: /models
models = requests.get('https://openrouter.ai/api/v1/models', headers={'Authorization': f'Bearer {OPENROUTER_API_KEY}'}).json()
for m in models['data']:
c.execute("INSERT OR REPLACE INTO models VALUES (?, ?, ?, ?)",
(m['id'], m['name'], m['pricing']['input'], m['speed']))
conn.commit()
Generate.py:
import openrouter # pip install openrouter-py
import sqlite3
import json
client = openrouter.OpenRouter(api_key=os.getenv('OPENROUTER_API_KEY'))
DB = 'models.db'
def pick_model(criteria='fast'):
conn = sqlite3.connect(DB)
if criteria == 'fast':
model = conn.execute("SELECT id FROM models ORDER BY speed DESC LIMIT 1").fetchone()[0]
return model # Grok 4.1 Fast обычно выигрывает
def generate_post(task):
model = pick_model('fast') # Grok 4.1 Fast
prompt = f"""Ты SMM для AI-девелопера-врача.
Проект: {task['proj']['name']}
Изменения: {task['diff']}
Напиши пост 200-300 слов: технично, живо, с юмором. Призыв: подпишись @LLMevangelist."""
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=0.7
)
return response.choices[0].message.content
Пост в очередь на публикацию.
4. Aiogram-бот для публикации
bot.py — поллинг-бот:
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
import asyncio
import json
import os
BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
CHANNEL = '@LLMevangelist'
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
@dp.message(Command('status'))
async def status(message: types.Message):
# логика статуса
await message.reply("Hype OK")
async def publish_post(text):
await bot.send_message(CHANNEL, text, parse_mode='Markdown')
async def daily_report():
# сводка из логов
report = "Daily Hype Report\nИзменений: X\nПостов: Y"
await publish_post(report)
if __name__ == '__main__':
# поллинг в фоне
while True:
if os.path.exists(QUEUE_PATH):
with open(QUEUE_PATH) as f:
tasks = json.load(f)['tasks']
for task in tasks:
post = generate_post(task) # inline
await publish_post(post)
os.remove(QUEUE_PATH)
await asyncio.sleep(60)
Запуск: systemd сервис для бота. Aiogram 3.17.0 — свежак, FSM не юзаю, просто.
Проблемы? Rate-limits OpenRouter (но Grok fast), Telegram flood-wait (sleep 10s). Env в /etc/environment.
Что получилось на данный момент — честно, без преувеличений
Система молодая — запустил неделю назад. На момент написания: observe отрабатывает каждые 6ч, diff ловит изменения в projects.json. Grok генерит посты: 2–3 за период, публикует в @LLMevangelist. Daily Report в 10:00 MSK — сводки типа "Обновлен проект LabAI". Канал живой: посты coherent, техничные, с моим стилем (юмор про "код в пробирке").
Баги: иногда diff false-positive (фикс в планах), Grok редко генерит слишком длинно (trim в коде). Подписчики растут органически — кто-то репостит. Нет метрик (views, engagement) — не трекаю пока, но канал pinned и готов.
Плюсы: я реально сплю, а контент идёт. Минусы: ручной апдейт projects.json (автоматизировать git-pull в планах). Всё в процессе — тестовый режим.
Планы: кросс-постинг, n8n, масштабирование
Дальше — scale. Кросс-постинг: browser-use через Playwright. Скрипт cross_post.py:
from playwright.sync_api import sync_playwright
def post_to_habr(text):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('https://habr.com/ru/post/new/')
# login, paste text, submit (cookies в профиле)
Аналог для VC.ru. Триггер после Telegram.
n8n для оркестрации: workflows на no-code. Observe -> webhook -> generate -> multi-publish.
Масштаб: multi-channel (Twitter/X via API), аналитика (views via Telegram API), A/B тесты моделей из SQLite. Интеграция с GitHub webhooks — вместо ручного json.
Ещё: voice-посты (TTS), видео (script-to-reel). Цель — 10+ платформ, пока я в лабе.
HYPE PROTOCOL — мой первый соло-автоконтент. Если сломается — пофикшу за кофе. Подписывайтесь @LLMevangelist, следите за апдейтами!
Автор: DoctorM&Ai, канал @LLMevangelist
(Слов: ~2450)