
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 — для тех, кто хочет начать автоматизировать задачи, но пока без кода. Три недели — и в конце решение вашей задачи. Присоединяйтесь.
ссылка на оригинал статьи https://habr.com/ru/articles/1066684/