Кейси

Як Directoria впровадила власну AI-команду: VPS, Claude Code, Telegram-бот, daily-публікація

Як Directoria впровадила власну AI-команду: VPS, Claude Code, Telegram-бот, daily-публікація

Замість найму SEO-команди й копірайтерів Directoria побудувала автономну AI-команду на одному VPS-сервері за 2GB RAM: Claude Code під капотом, 4 спеціалізовані AI-агенти (seo-researcher, content-writer, image-creator, wp-publisher), Telegram-бот як «директор у кишені» і cron, який щоранку публікує нову статтю. Це наш перший кейс — meta-кейс про власні процеси. Усі цифри й налаштування — реальні, бо це інфраструктура, на якій працює сам сайт directoria.com.ua, де ви зараз цей текст і читаєте.

Контекст: чому ми взагалі це зробили

На ранньому етапі B2B-сервісу контент-маркетинг — найдешевший канал, який має сенс для SEO і довіри. Але має одну проблему: дорого і повільно у класичній моделі. Копірайтер 12–25 тис. ₴/міс, дизайнер на картинки, час редактора на правки, повільна швидкість випуску (1 стаття на тиждень — оптимістично). Альтернатива — раз на місяць «генератор з ChatGPT»: нерелевантна вода без бренд-тону, факти не верифіковані, SEO випадкове.

Ми обрали третій шлях: побудувати свою AI-команду, яка робить ту саму роботу що копірайт-команда, але автоматично і за фіксовану інфраструктурну вартість. Не «GPT-генератор», а кілька спеціалізованих агентів, що відтворюють реальний редакційний workflow: пошук теми → ресерч → бриф → драфт → редагування → картинки → публікація з SEO-метаданими.

Стек: один VPS, Claude Code, Python

  • VPS: Ubuntu 24.04, 2 ГБ RAM, 1 CPU, 20 ГБ диску. Найдешевший серверний тариф, ~5–10 $/міс. SSH-алас, root-доступ, без жодних додаткових послуг хостингу.
  • Claude Code (Anthropic CLI) — це CLI-обгортка над Claude API, що дозволяє створювати спеціалізованих агентів через файли .claude/agents/<name>.md. Працює через підписку Claude Pro/Max, не через окремі API-ключі. Це ключовий вибір — Claude Code дає нам структуру «головна сесія делегує спеціалістам» з коробки.
  • Python 3.12 для скриптів-оркестраторів і інтеграцій з зовнішніми API.
  • python-telegram-bot v21.6 для Telegram-моста (стрімінг повідомлень з AI у Telegram).
  • Gemini API (gemini-2.5-flash-image) для генерації картинок — швидше і дешевше за DALL-E на нашому об’ємі.
  • WordPress REST API для публікації постів і завантаження медіа — авторизація через WP Application Password.
  • systemd + cron для оркестрації daily-pipeline і фонових процесів.

AI-команда: Director + 4 спеціалісти

Director (operating manager)

Метарівень над спеціалістами. Не виконавець конкретних задач, а координатор. Працює на VPS у директорії /opt/directoria/. Отримує задачу від фахівця через Telegram → визначає тип задачі → делегує конкретному спеціалісту → веде журнал виконання в work/log.md → доповідає назад. Це окрема Claude Code сесія з власним CLAUDE.md (його роль, межі повноважень, як делегувати, що писати в журнал).

seo-researcher

Спеціалізований leaf-агент. Отримує тему від директора → робить ресерч через WebSearch інструмент Claude → аналізує конкурентів, ключові слова, питання людей з пошуку, тренди в галузі → складає структурований бриф у content/briefs/<slug>.md. Бриф містить: title-кандидати, primary keyword, semantic keywords (LSI), цільову аудиторію, рекомендовану структуру H2/H3, ключові факти і цифри для включення, оцінку складності рейтингу.

content-writer

Бере готовий бриф від researcher → пише статтю українською в бренд-тоні Directoria. Орієнтиром служить його власний CLAUDE.md з прикладами «як ми пишемо» (короткі речення, без води, з конкретикою, з реальними цифрами де доречно, без емодзі, без хвостових summary-абзаців «Як підсумувати…»). Драфт зберігає у content/drafts/<slug>.md у форматі Markdown з усіма H2/H3, списками, плейсхолдерами для картинок.

image-creator

Отримує драфт → визначає, які картинки потрібні (зазвичай 1 hero + 1–2 ілюстрації по ходу) → формує детальний промпт для Gemini залежно від контексту (photorealistic для фото-сцен, isometric для архітектури і концепцій) → викликає скрипт generate_image.py → зберігає PNG у /tmp/images/. Бренд-палітра прописана в його CLAUDE.md: navy blue + warm amber, без яскравого неонового, без stock-photo сухості.

wp-publisher

Фінальний етап. Бере драфт + картинки → завантажує картинки у WP Media Library через REST API з SEO-метаданими (title, alt-text, caption, description під SEO) → створює пост з призначеним featured image → ставить категорію та теги → публікує у статусі publish. Окремо: видаляє дублікат H1 з тіла статті (бо WordPress сам рендерить заголовок з поля title, і без цього отримаєш два H1 на сторінці).

Telegram-бот: «директор у кишені»

Як це працює з мого боку як власника: я ставлю задачу директору через Telegram-бот . Бот отримує повідомлення → пересилає в Claude Code сесію Director-а на VPS → отримує відповідь у стрімі → шле назад мені у формі коротких update-повідомлень з прогресом і фіналом.

Технічно: Python-скрипт telegram_bot.py постійно слухає updates з Telegram Bot API. Для кожного нового повідомлення запускає subprocess з командою claude --permission-mode bypassPermissions ... з контекстом сесії, стрімить вивід назад у Telegram через partial-message updates кожні 30 секунд (щоб клієнт не вирішив, що бот завис).

Подвійний режим (failover): основний — Claude (через Pro/Max підписку), резервний — Gemini API. Якщо ловимо rate limit на Claude — автоматично перемикаємось на Gemini для повідомлень, де якість трохи менше критична (наприклад, перший draft, який пізніше доопрацює інший етап).

Daily-pipeline: щоранку нова стаття

Cron-скрипт daily_pipeline.sh запускається о 09:00 UTC щодня. Послідовність дій повністю автоматична:

  1. Бере наступну тему з черги в content/topics.md (плейн-лист тем, який ми ведемо в repo вручну — це навмисний human-in-the-loop, щоб AI не випадково писав про щось зайве)
  2. Делегує seo-researcher → чекає поки бриф готовий (зазвичай 2–4 хвилини)
  3. Делегує content-writer → чекає поки драфт готовий (4–8 хвилин)
  4. Делегує image-creator → чекає поки картинки готові (1–3 хвилини)
  5. Делегує wp-publisher → пост опублікований у WP (30–60 секунд)
  6. Шле Власнику в Telegram нотифікацію «Стаття опублікована: title, link»

Час одного циклу: 8–15 хвилин залежно від теми. Все на одному 2 ГБ-VPS, без зовнішніх воркерів, без черг типу Redis/RabbitMQ. Простий послідовний bash-скрипт.

Реальні метрики vs традиційний копірайт-цикл

Параметр Класичний копірайт-цикл AI-команда Directoria
Час від теми до публікації 3–7 днів 8–15 хвилин
Орієнтовна вартість 1 статті 1500–2500 ₴ (копірайт + дизайнер + редактор) 80–150 ₴ (підписки і API на pro-rate basis)
Pipeline throughput 1–2 статті/тиждень за нормального темпу 1 стаття/день на cron, до 5/день на ручному режимі
Інфраструктура Зовнішні підрядники, ризик зриву строків 1 VPS за ~10 $/міс — повний контроль
Час на запуск 2–4 тижні: пошук, найм, onboarding копірайтера 2–3 тижні: архітектура й налаштування AI-команди
Якість стартового драфта висока (досвідчений копірайтер) середня (потребує редактора для топ-сторінок)
Консистентність бренд-тону залежить від людини детермінована — описана у CLAUDE.md спеціаліста

Що було важко (чесно, без полірування)

  • Permissions і sandbox. Claude Code за замовч просить підтверджень на критичні операції (write до системних файлів, network-запити з певних патернів). Для cron-режиму без людини потрібен --permission-mode bypassPermissions + env IS_SANDBOX=1. Налаштовується не з першого разу — пройшли через помилку, коли під root bypassPermissions сам по собі не працював. Знайшли — додали env-variable у systemd-unit.
  • Rate limits. На Pro-підписці зловили 5-годинне обмеження вже після першого тижня daily-cron. Купили Max-підписку. Pro-підписки вистачає на ~10–15 годин активної AI-роботи на тиждень, цього мало для двох-агентної системи з cron.
  • Telegram timeout. Якщо AI «думає» більше 5 хвилин (наприклад, складний multi-search ресерч) — Telegram update-callback втрачається і клієнт думає, що бот завис. Зробили streaming-режим: бот шле «ще працюю, n секунд» кожні 30 секунд як update предыдущего message і фінальний дамп у кінці.
  • WordPress + EWWW особливості. Плагін EWWW Image Optimizer автоматично конвертує uploaded PNG → JPG → WebP. Тому коли upload PNG у Media, URL відразу повертає .jpg розширення, і тіло поста треба патчити з урахуванням цього. Замість банального filename.png у HTML — filename.jpg.
  • Якість контенту. AI-стаття без редактора ≠ якість досвідченого копірайтера. Для long-tail SEO-статей якість прийнятна. Для топових landing-сторінок (як цей кейс, який ви читаєте) — все одно треба людина у фінальній рев’ю. AI-команда — це 80% роботи на автопілоті, 20% — людина для топового шарф.
  • WebSearch під root. WebSearch інструмент Claude повертав «недоступний» коли бот запускався як root. Розібралися: проблема була у тому ж permission-mode, не у privileges. Виправили env-змінною.

Що далі

Контентний конвеєр — це лише перший layer. Зараз будуємо те ж саме для inbox-менеджменту (AI читає вхідні листи, фільтрує, відповідає за шаблонами на типові), для управління календарем (AI з’ясовує, коли всі зручні, бронює), для CRM-нотаток з дзвінків (AI слухає, конспектує, ставить таски). Ціль одна — не «AI замість співробітників», а «AI забирає 70% механічної роботи, щоб ми могли робити не-механічне».

Чому це цікаво для вашої компанії

Якщо ви читаєте цей кейс і думаєте «у нас же все інакше, у нас CRM, замовлення, документообіг — це не контент» — він якраз для вас. Архітектура, яку ми побудували, не специфічна під контент. Та сама схема (VPS + Claude Code + спеціалізовані агенти + інтерфейс-бот) працює і для:

На безкоштовній 30-хвилинній зустрічі-знайомстві покажемо, як така ж архітектура виглядатиме під ваш конкретний процес — з оцінкою кількості агентів, інтеграцій і потенційного ROI під ваш бізнес. Замовити зустріч →

Готові впроваджувати AI?

Почніть з безкоштовного аудиту — за 5 днів покажемо, що можна автоматизувати у вашому бізнесі і скільки це зекономить.

Розрахувати вартість

Прокрутка до верху