# orchestration

холівари «яка модель розумніша» вже нудні. моделі у всіх плюс-мінус однакові, а от результати - ні. реальний gap зараз в іншому: хто як оркеструє. надивився за останній рік купу сетапів - по суті всі вони складаються в три рівні. розберемо від простого, так щоб зайшло навіть якщо ви вчора поставили свого першого агента, а далі пірнемо глибше

## теорія на пальцях

модель сама по собі - це текст-в-текст: спитав - відповіла. все.

агент - це модель, яку запустили в цикл і дали руки: термінал, файли, браузер. зробила крок - подивилась що вийшло - зробила наступний. і так поки задача не вирішена (або поки не скінчився контекст, але про це нижче)

оркестрація - це відповідь на одне питання: хто вирішує, що робити далі. ти сам? агент? агент над агентами? крон за розкладом? від цієї відповіді залежить головна метрика - скільки твого часу коштує одна фіча

<figure>
<svg viewBox="0 -14 720 354" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="три рівні оркестрації: ручник, напівавтомат, автомат">
  <defs>
    <marker id="ar1" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L8 4 L0 8 z" fill="#262a22"/></marker>
    <marker id="ar1m" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L8 4 L0 8 z" fill="#2e6b41"/></marker>
  </defs>
  <line x1="30" y1="292" x2="690" y2="292" stroke="rgba(38,42,34,.25)" stroke-width="1"/>
  <line x1="30" y1="242" x2="240" y2="242" stroke="#262a22" stroke-width="1.6"/>
  <line x1="255" y1="157" x2="465" y2="157" stroke="#262a22" stroke-width="1.6"/>
  <line x1="480" y1="72" x2="690" y2="72" stroke="#262a22" stroke-width="1.6"/>
  <line x1="30" y1="242" x2="30" y2="292" stroke="rgba(38,42,34,.25)" stroke-width="1" stroke-dasharray="3 4"/>
  <line x1="255" y1="157" x2="255" y2="292" stroke="rgba(38,42,34,.25)" stroke-width="1" stroke-dasharray="3 4"/>
  <line x1="480" y1="72" x2="480" y2="292" stroke="rgba(38,42,34,.25)" stroke-width="1" stroke-dasharray="3 4"/>
  <text x="30" y="190" font-family="Bodoni Moda, serif" font-size="34" font-weight="700" fill="#262a22">01</text>
  <text x="30" y="212" font-family="IBM Plex Mono, monospace" font-size="15" font-weight="500" letter-spacing="2" fill="#262a22">РУЧНИК</text>
  <text x="30" y="232" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">кожен крок - твій</text>
  <circle cx="182" cy="200" r="6" fill="#262a22"/>
  <line x1="192" y1="200" x2="218" y2="200" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar1)"/>
  <circle cx="228" cy="200" r="6" fill="none" stroke="#2e6b41" stroke-width="1.8"/>
  <text x="255" y="105" font-family="Bodoni Moda, serif" font-size="34" font-weight="700" fill="#262a22">02</text>
  <text x="255" y="127" font-family="IBM Plex Mono, monospace" font-size="15" font-weight="500" letter-spacing="2" fill="#262a22">НАПІВАВТОМАТ</text>
  <text x="255" y="147" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">ти керуєш оркестратором</text>
  <circle cx="358" cy="108" r="6" fill="#262a22"/>
  <line x1="368" y1="108" x2="390" y2="108" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar1)"/>
  <circle cx="400" cy="108" r="6" fill="#2e6b41"/>
  <line x1="408" y1="105" x2="432" y2="90" stroke="#2e6b41" stroke-width="1.2" marker-end="url(#ar1m)"/>
  <line x1="410" y1="108" x2="434" y2="108" stroke="#2e6b41" stroke-width="1.2" marker-end="url(#ar1m)"/>
  <line x1="408" y1="111" x2="432" y2="126" stroke="#2e6b41" stroke-width="1.2" marker-end="url(#ar1m)"/>
  <circle cx="444" cy="86" r="5.5" fill="none" stroke="#2e6b41" stroke-width="1.8"/>
  <circle cx="444" cy="108" r="5.5" fill="none" stroke="#2e6b41" stroke-width="1.8"/>
  <circle cx="444" cy="130" r="5.5" fill="none" stroke="#2e6b41" stroke-width="1.8"/>
  <text x="480" y="20" font-family="Bodoni Moda, serif" font-size="34" font-weight="700" fill="#2e6b41">03</text>
  <text x="480" y="42" font-family="IBM Plex Mono, monospace" font-size="15" font-weight="500" letter-spacing="2" fill="#262a22">АВТОМАТ</text>
  <text x="480" y="62" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">правила працюють без тебе</text>
  <circle cx="588" cy="30" r="6" fill="none" stroke="#262a22" stroke-width="1.4" stroke-dasharray="3 3"/>
  <line x1="598" y1="30" x2="622" y2="30" stroke="rgba(38,42,34,.45)" stroke-width="1.2" stroke-dasharray="3 3" marker-end="url(#ar1)"/>
  <circle cx="638" cy="18" r="5.5" fill="#2e6b41"/>
  <circle cx="660" cy="18" r="5.5" fill="#2e6b41"/>
  <circle cx="682" cy="18" r="5.5" fill="#2e6b41"/>
  <circle cx="649" cy="40" r="5.5" fill="#2e6b41"/>
  <circle cx="671" cy="40" r="5.5" fill="#2e6b41"/>
  <circle cx="60" cy="322" r="5.5" fill="#262a22"/>
  <text x="74" y="327" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">- ти</text>
  <circle cx="150" cy="322" r="5.5" fill="none" stroke="#2e6b41" stroke-width="1.8"/>
  <text x="164" y="327" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">- агенти</text>
  <text x="690" y="327" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156" text-anchor="end">твого часу на фічу: вечір -> година -> 5 хвилин</text>
</svg>
<figcaption>драбина оркестрації: чим вище - тим менше тебе в циклі</figcaption>
</figure>

і наскрізна думка на весь пост: чим вищий рівень, тим менше вирішують промпти і тим більше вирішують правила. промпт живе одну сесію, правило (md файл, скіл, конвенція репозиторію) - живе завжди. запамʼятайте, нижче знадобиться

## рівень 1 - ручник

сидиш у чаті з агентом, контролюєш кожен крок, кожен diff очима. попросив - подивився - поправив - далі

повільно? так. але насправді це обовʼязковий етап, перестрибувати його не можна. саме тут калібрується довіра: ти дізнаєшся, що модель тягне сама, а де стабільно падає. без цього калібрування на верхніх рівнях будеш або перевіряти все (і тоді навіщо автоматика), або взагалі не перевіряти (і тоді чекай сюрпризів у проді)

ручник назавжди залишається правильним режимом для двох речей: критичний код (auth, гроші, міграції) і незнайома кодова база

## рівень 2 - напівавтомат

ти все ще в чаті, але говориш вже не з виконавцем, а з оркестратором: агент сам спавнить інших агентів і розрулює роботу між ними. ти керуєш одним - він керує десятьма

навіщо це, пояснюю просто: в агента ліміт уваги, як у тебе в пʼятницю ввечері. контекстне вікно - найдефіцитніший ресурс: прочитав двадцять файлів - почав забувати перші. сабагенти вирішують це розділенням праці: кожен копає свій кут у своєму чистому контексті, а нагору приносить тільки вижимку. оркестратор тримає картину, воркери - деталі

як це виглядає в живих інструментах:

- сабагенти в Claude Code: головний агент роздає підзадачі, кожен сабагент зі своїм контекстом, працюють паралельно
- threads control у Codex: одна сесія форкає від себе дочірні треди. кілер деталь - fork_context: форк успадковує всю памʼять батька, тобто клону не треба заново пояснювати проект. ліміти крутяться через agents.max_threads (дефолт 6 паралельних) і max_depth (дефолт 1 - щоб клони не плодили клонів до нескінченності)

## рівень 3 - автомат

тут ти вже не в чаті. тут три робочі формати

### лупи / cron

джоба запускається умовно кожні 15 хвилин, ловить новий pull request, робить review, відповідає або мержить. без тебе

і ось тут повертається думка з початку: вся магія - в правилах. агент у лупі не думає «як правильно», він читає «як прийнято тут» - з репозиторію, з md файлів, зі скілів. написав правила один раз - вони відпрацьовують кожні 15 хвилин вічно. дуже недооцінений формат, працює жорстко добре

### spec-driven

дав специфікацію, відповів на питання агента і пішов у своїх справах. ввечері подивився що вийшло

такий рівень дає Droid by Factory AI з його mission control. і кілер фіча там - мікс моделей різних сімейств в одному pipeline:

<figure>
<svg viewBox="0 0 800 330" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="pipeline: спека, planning, воркери, верифікація, merge">
  <defs>
    <marker id="ar2" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L8 4 L0 8 z" fill="#262a22"/></marker>
    <marker id="ar2m" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L8 4 L0 8 z" fill="#2e6b41"/></marker>
  </defs>
  <rect x="30" y="130" width="110" height="52" rx="3" fill="#ece7da" stroke="#262a22" stroke-width="1.2"/>
  <text x="85" y="152" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#262a22" text-anchor="middle">спека</text>
  <text x="85" y="171" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">ти, 5 хвилин</text>
  <line x1="140" y1="156" x2="182" y2="156" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <rect x="185" y="130" width="130" height="52" rx="3" fill="#ece7da" stroke="#262a22" stroke-width="1.2"/>
  <text x="250" y="152" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#262a22" text-anchor="middle">planning</text>
  <text x="250" y="171" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#2e6b41" text-anchor="middle">fable 5</text>
  <line x1="315" y1="146" x2="357" y2="97" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <line x1="315" y1="156" x2="357" y2="156" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <line x1="315" y1="166" x2="357" y2="215" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <rect x="360" y="72" width="150" height="40" rx="3" fill="none" stroke="#2e6b41" stroke-width="1.4"/>
  <rect x="360" y="136" width="150" height="40" rx="3" fill="none" stroke="#2e6b41" stroke-width="1.4"/>
  <rect x="360" y="200" width="150" height="40" rx="3" fill="none" stroke="#2e6b41" stroke-width="1.4"/>
  <text x="435" y="97" font-family="IBM Plex Mono, monospace" font-size="13.5" fill="#262a22" text-anchor="middle">воркер · sol</text>
  <text x="435" y="161" font-family="IBM Plex Mono, monospace" font-size="13.5" fill="#262a22" text-anchor="middle">воркер · sol</text>
  <text x="435" y="225" font-family="IBM Plex Mono, monospace" font-size="13.5" fill="#262a22" text-anchor="middle">воркер · sol</text>
  <line x1="510" y1="92" x2="552" y2="146" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <line x1="510" y1="156" x2="552" y2="156" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <line x1="510" y1="220" x2="552" y2="166" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <rect x="555" y="130" width="140" height="52" rx="3" fill="#ece7da" stroke="#262a22" stroke-width="1.2"/>
  <text x="625" y="152" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#262a22" text-anchor="middle">верифікація</text>
  <text x="625" y="171" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#2e6b41" text-anchor="middle">fable 5</text>
  <line x1="695" y1="156" x2="730" y2="156" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar2)"/>
  <text x="737" y="161" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#2e6b41">merge</text>
  <path d="M 640 182 L 640 262 L 435 262 L 435 246" fill="none" stroke="#2e6b41" stroke-width="1.3" stroke-dasharray="5 5" marker-end="url(#ar2m)"/>
  <text x="450" y="280" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#2e6b41">retry - скільки вирішить модель</text>
  <text x="30" y="305" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">суцільне - етапи прибиті цвяхами (Droid mission control)</text>
  <text x="30" y="324" font-family="IBM Plex Mono, monospace" font-size="12.5" fill="#5d6156">пунктир - динаміка: воркерів і retry вирішує модель (ultracode)</text>
</svg>
<figcaption>один pipeline - два сімейства моделей: розумний планує, ефективний копає</figcaption>
</figure>

свіжа жара по цій темі: GPT-5.6 Sol - новий фронтір OpenAI, вийшов минулого тижня. за інтелектом на рівні Fable 5 від антропіка, але токенно ефективніший (Altman заявляє -54% токенів на агентному кодингу) і приблизно вдвічі дешевший у реальних тасках. розклад для pipeline виходить ідеальний: Fable 5 думає і перевіряє, Sol копає. розумний планує - ефективний виконує

### ultracode

і найпростіший вхід у повний автопілот - режим ultracode у Claude Code. розбиває таску на ті ж етапи: оркестрація/planning -> воркери -> верифікація. різниця з Droid філософська: у Droid етапи прибиті цвяхами, в ultracode вони динамічні - модель сама вирішує, як зібрати workflow, скільки їй треба воркерів, валідацій і retry. на схемі вище пунктир - це воно

## лайфхак про підписки

за підписку Droid можна не платити. берете CLIProxyAPI або VibeProxy - вони чіпляють ваш існуючий акаунт Codex/Claude по oauth і експозять локальний API прямо у вас на машині. далі прописуєте endpoint у config.json - і mission control крутиться на підписках, які у вас і так є

<figure>
<svg viewBox="0 0 720 230" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="схема: підписки через локальний проксі в будь-який інструмент">
  <defs>
    <marker id="ar3" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0 0 L8 4 L0 8 z" fill="#262a22"/></marker>
  </defs>
  <text x="360" y="34" font-family="IBM Plex Mono, monospace" font-size="13" fill="#2e6b41" text-anchor="middle">0$ зверху - все крутиться у тебе на машині</text>
  <line x1="360" y1="44" x2="360" y2="86" stroke="#2e6b41" stroke-width="1" stroke-dasharray="3 4"/>
  <rect x="30" y="90" width="180" height="64" rx="3" fill="#ece7da" stroke="#262a22" stroke-width="1.2"/>
  <text x="120" y="117" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#262a22" text-anchor="middle">твої підписки</text>
  <text x="120" y="138" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">Codex / Claude</text>
  <line x1="210" y1="122" x2="267" y2="122" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar3)"/>
  <text x="239" y="112" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">oauth</text>
  <rect x="270" y="90" width="180" height="64" rx="3" fill="none" stroke="#2e6b41" stroke-width="1.5"/>
  <text x="360" y="117" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#262a22" text-anchor="middle">CLIProxyAPI</text>
  <text x="360" y="138" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">або VibeProxy</text>
  <text x="360" y="176" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">localhost · config.json</text>
  <line x1="450" y1="122" x2="507" y2="122" stroke="#262a22" stroke-width="1.3" marker-end="url(#ar3)"/>
  <text x="479" y="112" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">api</text>
  <rect x="510" y="90" width="180" height="64" rx="3" fill="#ece7da" stroke="#262a22" stroke-width="1.2"/>
  <text x="600" y="117" font-family="IBM Plex Mono, monospace" font-size="14.5" fill="#262a22" text-anchor="middle">Droid</text>
  <text x="600" y="138" font-family="IBM Plex Mono, monospace" font-size="11.5" fill="#5d6156" text-anchor="middle">або будь-який інший tool</text>
</svg>
<figcaption>підписка вже оплачена - хай працює у всіх інструментах</figcaption>
</figure>

*VibeProxy - тільки apple silicon, менюбар аппка. CLIProxyAPI - кросплатформений, go

## висновок

рівень оркестрації = ціна фічі у твоєму часі. на ручнику платиш вечір, на напівавтоматі - годину, на автоматі - пʼять хвилин на спеку і правила

і так, правила важливіші за промпти. з них і почніть

спиш - агенти працюють)

<nav class="post-links" aria-label="links">
<div class="links-label">// links</div>
<a href="https://developers.openai.com/codex/subagents" target="_blank" rel="noopener"><b>codex subagents</b><span class="dom">developers.openai.com</span><span class="arr">→</span></a>
<a href="https://github.com/router-for-me/CLIProxyAPI" target="_blank" rel="noopener"><b>CLIProxyAPI</b><span class="dom">github.com/router-for-me</span><span class="arr">→</span></a>
<a href="https://github.com/automazeio/vibeproxy" target="_blank" rel="noopener"><b>VibeProxy</b><span class="dom">github.com/automazeio</span><span class="arr">→</span></a>
<a href="https://openai.com/index/gpt-5-6/" target="_blank" rel="noopener"><b>GPT-5.6 Sol</b><span class="dom">openai.com</span><span class="arr">→</span></a>
</nav>
