Как я построил 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)