O OmniPost
Код
Портфоліо-проект · TypeScript · агентні LLM-системи

Одне джерело. Десяток постів. Нуль ручного форматування.

OmniPost — агентний TypeScript-пайплайн, який перетворює одну довгу статтю, транскрипт або нотатку на повний набір нативних постів — тред у X, пост у LinkedIn, кепшн в Instagram, текст для розсилки — плюс тижневий контент-календар у форматі .ics. LLM пише чернетки; код накладає кожен ліміт символів, правило хештегів і розбивку.

TypeScript 5.6 Node 20 Anthropic SDK Groq zod .ics календар
1 → 13+
постів з одного джерела
≤ 280
ліміт твіта · накладає код
2 LLM
Claude або Groq · 1 zod-схема
.ics
тижневий експорт у календар

Живе демо · готовий пакет

Реальний вивід команди npm run repurpose -- --mock на вбудованій статті ~1300 слів. Той самий пайплайн, ті самі обмеження, без жодного API-ключа. Згенерований контент англомовний — це демонстрація роботи на англомовному джерелі.

— твітів — хештегів календар на 7 днів
Джерело · — слів
data/source.md

—

Завантаження…
H

Хуки · 3 варіанти

    𝕏

    Тред у X / Twitter

    Усі твіти ≤ 280 · накладає код
    in

    Пост у LinkedIn

    — символів
    ◉

    Кепшн в Instagram

    — символів
    Хештеги · дедуплікація, ≤ 10
    "

    Pull-цитати

      ✉

      Текст для розсилки

      — символів

      Тижневий контент-календар

      Код розкидає пости по слотах — X щодня, LinkedIn у пн/ср/пт, Instagram у вт/чт/сб, розсилка у четвер. Експорт у calendar.csv і calendar.ics (імпорт у Google Calendar).

      — заплановано
      Коли (UTC) Платформа Прев'ю

      Пайплайн

      П'ять чистих, типізованих кроків. LLM пише лише чернетки. Усі жорсткі обмеження — ліміти символів, дедуплікація хештегів, нумерація треда — живуть в enforce.ts. Саме це розділення дає надійність.

      1
      ingest

      Читання файлу або fetch URL через єдиний інтерфейс ContentSource. Витяг основного тексту зі статті — вбудований.

      2
      repurpose

      Claude tool-use або Groq json_object → одна zod-схема. Brand voice вбудовано у system-prompt.

      3
      enforce

      Код ріже твіти ≤ 280, нумерує 1/n, дедуплікує хештеги, нормалізує markdown під платформу.

      4
      schedule

      Слотовий планувальник на N днів. Експорт CSV + RFC-5545 .ics для Google Calendar.

      5
      write

      JSON + людиночитний Markdown у data/out/. Кеш по хешу джерела — повторні запуски не дьоргають LLM.

      Інженерні рішення

      LLM пише · код накладає

      Мовні моделі не вміють точно рахувати символи. Тому ліміти, дедуп хештегів і нумерація треда живуть в enforce.ts — той самий принцип, що і у PulseReport для чисел.

      Суворий structured output, два провайдери, одна схема

      Claude — tools + tool_choice + input_schema; Groq — response_format: json_object. Обидва валідуються однією zod-схемою.

      Graceful fallback

      Якщо LLM-виклик впав або повернув битий JSON, детермінований розбивач по абзацах продукує робочу чернетку, а прогон позначається degraded: true. Пайплайн ніколи не падає тихо.

      Кеш по хешу джерела

      Кожен результат зберігається у data/cache/<hash>.json, ключ — sha256(текст + brand voice). Повторний прогон по тому ж матеріалу пропускає API. --force скидає кеш.

      Brand voice з конфігу

      Tone, аудиторія, CTA, do/don't і мова — з env. Голос — частина ключа кешу: змінив голос → наступний прогон перегенерує.

      Офлайн-демо

      npm run repurpose -- --mock --dry прокручує весь пайплайн без мережі — з вбудованого джерела і засіяного кешу. Той самий шлях коду крутить CI на кожен пуш.

      Стек і CLI

      • • TypeScript 5.6 ESM strict · Node 20+ · tsx
      • • @anthropic-ai/sdk з tool-use + cache_control
      • • openai SDK націлений на Groq (OpenAI-сумісний endpoint)
      • • zod для env і кожної відповіді LLM
      • • Native fetch + малий HTML-екстрактор, без headless-браузера
      • • Генерація RFC-5545 .ics, нуль залежностей
      • • GitHub Actions CI · typecheck + офлайн mock-прогон
      # офлайн-демо (без ключа)
      npm run repurpose -- --mock --dry
      
      # реальний прогон з вбудованою статтею
      npm run repurpose
      
      # repurposing статті за URL
      npm run repurpose -- --url=https://example.com/article
      
      # обрати платформи
      npm run repurpose -- --platforms=x,linkedin
      
      # додати контент-календар на 7 днів
      npm run repurpose -- --schedule --days=7
      
      # скинути кеш
      npm run repurpose -- --force