OmniPost — агентний TypeScript-пайплайн, який перетворює одну довгу статтю, транскрипт або нотатку на повний набір нативних постів — тред у X, пост у LinkedIn, кепшн в Instagram, текст для розсилки — плюс тижневий контент-календар у форматі .ics. LLM пише чернетки; код накладає кожен ліміт символів, правило хештегів і розбивку.
Реальний вивід команди npm run repurpose -- --mock на вбудованій статті ~1300 слів. Той самий пайплайн, ті самі обмеження, без жодного API-ключа. Згенерований контент англомовний — це демонстрація роботи на англомовному джерелі.
Код розкидає пости по слотах — X щодня, LinkedIn у пн/ср/пт, Instagram у вт/чт/сб, розсилка у четвер. Експорт у calendar.csv і calendar.ics (імпорт у Google Calendar).
| Коли (UTC) | Платформа | Прев'ю |
|---|
П'ять чистих, типізованих кроків. LLM пише лише чернетки. Усі жорсткі обмеження — ліміти символів, дедуплікація хештегів, нумерація треда — живуть в enforce.ts. Саме це розділення дає надійність.
Читання файлу або fetch URL через єдиний інтерфейс ContentSource. Витяг основного тексту зі статті — вбудований.
Claude tool-use або Groq json_object → одна zod-схема. Brand voice вбудовано у system-prompt.
Код ріже твіти ≤ 280, нумерує 1/n, дедуплікує хештеги, нормалізує markdown під платформу.
Слотовий планувальник на N днів. Експорт CSV + RFC-5545 .ics для Google Calendar.
JSON + людиночитний Markdown у data/out/. Кеш по хешу джерела — повторні запуски не дьоргають LLM.
Мовні моделі не вміють точно рахувати символи. Тому ліміти, дедуп хештегів і нумерація треда живуть в enforce.ts — той самий принцип, що і у PulseReport для чисел.
Claude — tools + tool_choice + input_schema; Groq — response_format: json_object. Обидва валідуються однією zod-схемою.
Якщо LLM-виклик впав або повернув битий JSON, детермінований розбивач по абзацах продукує робочу чернетку, а прогон позначається degraded: true. Пайплайн ніколи не падає тихо.
Кожен результат зберігається у data/cache/<hash>.json, ключ — sha256(текст + brand voice). Повторний прогон по тому ж матеріалу пропускає API. --force скидає кеш.
Tone, аудиторія, CTA, do/don't і мова — з env. Голос — частина ключа кешу: змінив голос → наступний прогон перегенерує.
npm run repurpose -- --mock --dry прокручує весь пайплайн без мережі — з вбудованого джерела і засіяного кешу. Той самий шлях коду крутить CI на кожен пуш.
tsx@anthropic-ai/sdk з tool-use + cache_controlopenai SDK націлений на Groq (OpenAI-сумісний endpoint)zod для env і кожної відповіді LLMfetch + малий HTML-екстрактор, без headless-браузера.ics, нуль залежностей# офлайн-демо (без ключа)
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