
Anatoly Klavdienko, Product / CustDev
TL;DR
Ассистент в чате — собеседник. Агент — сотрудник, который сам ходит по API, пока ты спишь. Я три месяца строил одну и ту же контент-машину для AI/tech-канала: сначала руками с ChatGPT, потом на n8n, потом на Python через Claude Code — и третий вариант оказался компактнее и предсказуемее, чем я ждал в начале. Дальше — архитектура, реальные тайминги из pipeline.log, история про SaaS-вендора, который подвел за один день, и чек-лист «Когда брать ассистента, а когда писать агента».
Зачем я вообще это полез автоматизировать
Меня зовут Анатолий Клавдиенко, я отвечаю за разработку ИИ-агентов в AlpinaGPT и Alpina Digital.
Задача формулируется просто и выполняется тошнотворно: делать 5–10 коротких видео в неделю для AI/tech-канала в Telegram. Аудитория — продакты, предприниматели, айтишники, которые хотят держать руку на пульсе, но не готовы каждый день читать TechCrunch и MIT News.
Чтобы видео не превращалось в «еще одну выжимку из X», каждый раз нужно пройти один и тот же конвейер:
Собрать свежие AI/tech-новости из десятка источников.
Отобрать те, у которых есть реальный хук — цифры, контринтуитивность, конкретика.
Написать короткий скрипт под ИИ-аватара (короткий не значит легкий: 30–60 секунд должны держать внимание).
Сгенерировать видео с аватаром, наложить субтитры и B-roll, добавить музыку.
Опубликовать на YouTube Shorts, TikTok и Instagram Reels — с правильным описанием и тегами для каждой площадки.
Для одного видео это интересный творческий процесс. Для пяти–десяти в неделю — работа.
Этап 1. Ассистент в чате — около 4 часов в неделю на 10 видео
Первый подход — самый честный и самый медленный. Открыть ChatGPT в одном окне, RSS-ридер во втором, монтажку в третьем и проходить весь конвейер руками. Ассистент тут — очень умный собеседник: я кидаю ему 30 заголовков, прошу выбрать 5 самых интересных под мою аудиторию, дальше прошу написать скрипт, потом перевожу его в озвучку, монтирую, экспортирую, публикую.
На 10 коротких видео в неделю у меня уходило около 4 часов. Сам разговор с моделью — минут 30–40. Остальные три с лишним часа — ручная сборка и монтаж: подобрать B-roll, выровнять субтитры, склеить, добавить музыку, нарезать обложки, написать подписи под три площадки, разнести по платформам. Каждый шаг занимал немного — а потом «немного» складывалось в «долго».
Признак, что пора уходить с этого этапа, у меня сформулировался так: «Я устал быть транспортным уровнем». Модель пишет — я копирую. Модель предлагает — я переношу. Я не принимаю решений, я перекладываю байты из одной вкладки в другую. Тут и упирается ассистент: он быстрый внутри одного диалога, но не дотягивается до API за пределами чата.
Этап 2. Первый агент — n8n, четыре дня и почему я с него ушел
Логичный следующий шаг — взять визуальный конструктор и собрать пайплайн без кода. n8n self-hosted (n8n docs) — открытый, гибкий, есть нужные интеграции. На бумаге выглядел как ровно то, что мне нужно.
На практике у меня ушло примерно два дня на сборку workflow и еще два дня на отладку и тестирование. То есть рабочая неделя на то, чтобы выйти из ручного режима. Дальше каждый цикл «настроил — сломалось — починил — донастроил» в визуальном редакторе обходился мне в разы дороже, чем тот же цикл в обычном Python-репо.
Болело три вещи:
Визуальный редактор плох для итераций. В коде ты выделяешь блок и переносишь — Cmd+X, Cmd+V. В n8n блок — это нода, и пересборка ветки workflow занимает в разы больше времени, чем правка функции.
Версионности нет, диффа нет. Я не могу спросить у git diff, что изменилось со вчера. Откатиться к версии «вчера утром» — либо ручной экспорт JSON workflow в файл, либо никак.
Отладка — это разглядывание JSON в браузере. Нет breakpoints, нет print(), нет нормального step-through. Когда в проде упала нода — идешь в UI, открываешь execution, разворачиваешь JSON и ищешь, где сломалось.
n8n — рабочий инструмент для команд, у которых есть бюджет ops-времени на его сопровождение. Для одного человека, который параллельно делает продукт и просто хочет, чтобы канал жил сам, он начал работать медленнее, чем я надеялся.
Этап 3. Python-агент через Claude Code — один вечер на переход
Самая интересная цифра — здесь.
Я не садился писать Python-агент «с нуля». Я выгрузил рабочий n8n workflow в JSON (n8n умеет это из коробки), открыл Claude Code, скинул туда этот JSON и попросил адаптировать в Python. Один вечер — и у меня был первый рабочий пайплайн в коде, который делал то же самое, что мой n8n-workflow.
Это и есть тот момент, где экономика поменялась. Раньше выбор «визуальный конструктор vs код» был выбором между «Можно собрать за день» и «Надо садиться писать неделю». Сейчас выбор — между «Собрать за неделю в визуальном редакторе и потом неделю отлаживать в JSON-вкладках» и «Выгрузить тот же workflow в JSON, скормить LLM и за вечер получить нормальный Python-репо с диффами, тестами и логами». Барьер входа в код упал ровно настолько, что код стал выгоднее, чем визуальный конструктор, даже на простых пайплайнах.
После того первого вечера была активная разработка: 19 марта 2026 года я создал на сервере папку /root/video-production/, heygen.py появился 24 марта, основные пайплайны начали появляться 2 апреля и дорабатывались до 20-х чисел, миграция на свой постпроцесс — 21 апреля. Много итераций, много правок — но уже на репозитории, который можно git diff, а не на нодах в браузере.
Объективный маркер вместо «по ощущениям»: 2074 строки production-кода в 19 файлах — это весь агент, 3 пайплайна, 13 сервисов, оркестратор. Для контекста: меньше, чем у меня уходило на средний n8n-workflow по эквивалентной задаче.
Архитектура: три пайплайна, один scheduler, один контейнер
Итог трех месяцев выглядит так:
|
APScheduler (BlockingScheduler) каждые 4ч ─┬─ каждые 8ч ─┬─ каждые 4ч │ │ │ ▼ ▼ ▼ Pipeline D Pipeline C Pipeline A news_miniapp generate autopost avatars avatars ┌─ 12 RSS-фидов ─► [D] ─► GPT-4o ─► Airtable ─┐ │ TechCrunch, фильтр (base/table)│ │ Guardian, AI/tech │ │ MIT News, ... ▼ │ Airtable ─► [C] ─► GPT-4o │ 5 скриптов │ │ │ ▼ │ HeyGen │ (11 looks) │ │ │ ▼ │ custom_postprocess │ (Whisper + Pexels + │ FFmpeg) │ │ │ ▼ │ Google Drive │ ToPublish ──┐ │ │ │ ▼ │ Drive ──► [A] ──► Gemini 2.5-flash │ ToPublish (транскрипт) │ │ │ ▼ │ GPT-4o-mini (метаданные) │ │ │ ┌──────────┼──────────┐ │ ▼ ▼ ▼ │ YouTube TikTok Reels │ Data v3 (Blotato) (IG Graph) │ │ │ ▼ │ Drive ──► Published └─────────────────────────────────────────────────────┘ |
Три пайплайна, один scheduler, один контейнер. Никакого Kubernetes, никаких очередей, ничего, что нельзя задебажить через docker logs и grep в одном файле.
Pipeline D — Sourcing (news_miniapp.py)
Каждые 4 часа. Идет по 12 RSS-источникам — TechCrunch, The Guardian, VentureBeat, MIT News, The Verge, Ars Technica, The Next Web, AI News, QbitAI, Jiqizhixin, Synced, 36kr — собирает новые статьи, дедуплицирует по URL через url_tracker.py, отдает топ-10 в GPT-4o и сохраняет отфильтрованное в Airtable.
Модель для фильтрации — gpt-4o, явно:
|
# pipelines/news_miniapp.py MAX_ARTICLES_PER_RUN = 10 # ... позже в коде response = openai_client.chat.completions.create( model="gpt-4o", max_tokens=1500, temperature=0.7, messages=[...], ) |
В моей памяти было «Claude Sonnet пишет фильтр», но git blame и сам файл говорят: GPT-4o, и так с самого начала. Хороший аргумент в пользу кода — память врет, код не врет.
Pipeline C — Generation (generate_avatars.py)
Каждые 8 часов. Берет отфильтрованные новости из Airtable, просит GPT-4o написать 5 коротких скриптов под ИИ-аватара, отправляет каждый в HeyGen с одним из 11 look_id и пуллит результат с интервалом 60 секунд до 30 попыток. Видео приходит в формате 720×1280 — вертикаль 9:16, под Shorts/Reels/TikTok.
После генерации видео уходит в custom_postprocess — собственный модуль, про него ниже.
Pipeline A — Publishing (autopost_avatars.py)
Каждые 4 часа. Берет самое старое видео из Google Drive folder ToPublish, делает quality gate: если короче 15 секунд — пропускает и сразу перемещает в Published, чтобы не зацикливать обработку. Дальше — транскрипция Gemini 2.5-flash, метаданные через GPT-4o-mini, параллельная публикация на YouTube Data API v3 + Blotato (TikTok) + Instagram Graph API (Reels). После успешной публикации видео переезжает в папку Published.
YouTube — privacy_status: public, region_code: RU, category_id: '27' (Education), описание заканчивается ссылкой на исходный канал.
Конфиг — один YAML
Всё, что не код, лежит в одном файле — config/settings.yaml:
|
scheduler: autopost_avatars: interval_hours: 4 generate_avatars: interval_hours: 8 news_miniapp: interval_hours: 4 news_miniapp: max_articles_per_run: 10 heygen: max_poll_attempts: 30 poll_interval_seconds: 60 dimension: width: 720 height: 1280 video_processing: add_music: true music_volume: 0.2 |
Поменять интервал, лимит, формат или громкость музыки — правка одной строки в YAML и docker restart. Без редеплоя.
Цифры из прода — что показывает pipeline.log
Все замеры — из реального logs/pipeline.log на сервере, не из моей памяти.
Pipeline D — Sourcing (5 июня 2026, 22:19 UTC):
Шаг |
Время |
Сбор всех 12 RSS-фидов |
~12 секунд |
Уникальных статей после дедупа |
207 |
Новых статей за прогон |
141 |
Анализ топ-10 через GPT-4o + Airtable |
~61 секунда |
Итог: saved / skipped / errors |
6 / 4 / 0 |
End-to-end Pipeline D |
~80 секунд |
Второй замер, 5 июня 18:19 UTC — 84 секунды, 8 saved / 2 skipped / 0 errors. Стабильно укладывается в полторы минуты.
Pipeline C — Generation (4 июня 2026):
Замер |
Длительность |
4 июня 18:19 UTC |
~6 минут 3 секунды |
4 июня 10:19 UTC |
~7 минут 57 секунд |
Шесть–восемь минут на пять видео — ожидаемо: HeyGen polling забирает большую часть, остальное (промпт, постпроцесс, аплоад) укладывается в минуты.
Объем кода: 2074 строки production-Python в 19 файлах. Самые большие сервисы — custom_postprocess.py (405 строк), generate_avatars.py (246 строк), news_miniapp.py (193 строки).
Когда вендор подвел — миграция с SubMagic за один день
Самая показательная часть истории.
С первого дня в пайплайне был SubMagic — внешний сервис для караоке-субтитров и B-roll. В YAML до сих пор валяется блок magic_brolls_percentage: 70 — артефакт старой интеграции. Сам клиент services/submagic.py тоже остался в репо: 88 строк, последняя правка — 19 марта 2026 года. С тех пор — dead code.
Что случилось 20 апреля 2026 года: SubMagic API стал возвращать 502 / 500 Server Error и 402 Payment Required от api.submagic.co/v1/projects. По одному и тому же endpoint, на стабильных запросах, которые раньше отрабатывали. Тариф у меня был оплачен — но API возвращал «недостаточно средств».
Главный риск SaaS-агента: ты не контролируешь критический путь. Вендор может уронить API на день, поменять биллинг, переоценить тариф — и твой пайплайн стоит, пока кто-то на их стороне разруливает.
21 апреля 2026 года — на следующий день — в репо появился services/custom_postprocess.py на 405 строк. Docstring файла, прямая цитата:
|
"""Custom post-processing service — replaces SubMagic. Adds karaoke subtitles (Whisper + GPT) and B-roll (Pexels) via FFmpeg. Uses video-editor-service for music (with track rotation). """ |
Что внутри:
Whisper для транскрипции аватарного видео в word-level timestamps.
GPT-4o-mini для расстановки пунктуации в сыром транскрипте.
Pexels API для подбора B-roll — с дедупом по config/used_pexels_ids.json (последние 200 видео).
FFmpeg для финального рендера: наложение субтитров, склейка с B-roll, добавление фоновой музыки (volume 0.2).
В pipelines/generate_avatars.py теперь импорт from services.custom_postprocess import process_video — а не from services.submagic. Активный пайплайн на SubMagic не ходит.
Пишу не с гордостью «Смотрите, как быстро я переписал». Пишу как принцип: когда у тебя Python-агент, ты можешь заменить любой кусок цепочки. Когда у тебя SaaS-агент-конструктор — нет. Это не теоретическая разница, а разница в один рабочий день между «Вендор лёг» и «Продакшен снова работает».
Чек-лист: ассистент или агент
Самая важная часть для меня — ради нее писал статью.
Брать ассистента в чате, если:
Задача одноразовая или штучная (раз в неделю, раз в месяц).
Нужно много креатива на каждом шаге — выбор формата, тон, стиль, нюансы. Ассистент тут — равноправный участник, агент будет глупее.
У тебя нет API на ту систему, в которую нужно положить результат. Ассистент не дотягивается до твоего CRM / Notion / чего-угодно без рук — но руки у тебя пока есть.
Стек еще не устоялся: ты пробуешь, переключаешься, выкидываешь. Кодифицировать пилот в агенте — преждевременная оптимизация.
Писать своего агента (n8n / Python / что-то еще), если:
Задача повторяется регулярно (минимум раз в неделю) и пайплайн стабилизировался.
Большая часть шагов — переключение контекста между API, а не творческие решения. Если 80% работы — «взять X из A, положить Y в B», агент окупится.
У тебя есть API/SDK на все ключевые точки в цепочке. Если хотя бы одна — ручной шаг, агент будет постоянно спотыкаться.
Ты готов вложить разовые усилия в инфраструктуру (Docker, scheduler, логи, нотификации) ради того, чтобы дальше эту инфру переиспользовать.
Брать визуальный конструктор (n8n / Make / Zapier), если:
У тебя нет фона в Python и нет желания его получать.
Workflow вмещается в ≤ 20 нод и редко меняется.
Кто-то в команде уже сопровождает self-hosted n8n или ты платишь за Cloud, и это не больно.
Писать Python-агент (а не визуальный конструктор), если:
Workflow логически разбивается на 3+ пайплайна и они переиспользуют сервисы.
Тебе нужен git/diff/rollback (любая команда из больше чем одного человека — это уже да).
Один из шагов — кастомная логика (обработка видео, парсинг, дедуп с состоянием), которую конструктором делать дороже.
У тебя есть Claude Code или аналог — это снижает стоимость кода настолько, что эквивалентная сложность в визуальном конструкторе становится дороже.
Что бы я сделал иначе
Сразу один файл логов с JSON-структурой, а не plain text. Через месяц grep-driven debug перестает масштабироваться.
Watchdog для застрявших job-ов с первого дня. APScheduler по умолчанию max_instances=1 и без timeout — это значит, что застрявший job тихо съедает все следующие запуски, а ты узнаёшь об этом, только когда лезешь в логи руками.
Свой постпроцесс с первого дня, а не через месяц после того, как SubMagic упал. Это была не «преждевременная оптимизация» — это была честная зависимость от чужого API на критическом пути.
Метрики, а не догадки. Сейчас я знаю, что Pipeline D укладывается в 80–84 секунды, потому что сидел и считал по логам. Хочется график в Grafana, а не grep-марафон.
P.S.
16 сентября с 10:00 до 16:00 (МСК) мы проводим онлайн-конференцию «ИИ-Трансформация 2» — про российские и международные кейсы внедрения искусственного интеллекта в бизнес-процессы. Выступят спикеры из Skyeng, mymeet и других компаний — программу сейчас дособираем.
В апреле на первой конференции собралось больше 1150 участников: CEO, CTO и HRD разбирали реальные внедрения — от ИИ-агентов в бэк-офисе до расчёта окупаемости. Записи выступлений и саммари с трендами (агенты, ROI, эффективность ИИ) лежат в нашем боте — можно посмотреть уже сейчас. Участвовать можно бесплатно, предварительная регистрация уже открыта в чат-боте.
Если хочется забрать каркас себе — структура pipelines/ + services/ + один scheduler + один YAML тиражируется на любой content-конвейер за пределами видео. Параллельно я делаю продуктовую штуку про сообщества — AlmaMater; если оттуда будут полезные наблюдения по тому, как такие агенты живут на дистанции, напишу отдельно.
Еще из недавнего: стал экспертом курса «Вайбкод на практике» в Alpina Digital — для тех, кто хочет начать автоматизировать задачи, но пока без кода. Три недели — и в конце решение вашей задачи. Присоединяйтесь.
nutrifit
n8n крутая штука, но иногда задачу проще решить написав простой скрипт автоматизации. Через ту же нейронку например. Но по опыту скажу что даже хорошо отлаженный скрипт или фабрика контента требует ручной модерации, подписчики не дураки шляпу сразу вычисляют и отписка следом.