Workflows
Workflow — це візуальна мапа того, що ваш агент має робити крок за кроком — хто говорить першим, що запитувати, коли розгалужуватись, коли переводити дзвінок і коли передавати його іншому агенту. Ви будуєте її на полотні, розміщуючи ноди й з'єднуючи їх.
Використовуйте workflow, коли одного промпта недостатньо — коли в дзвінку є чіткі етапи («спершу кваліфікувати, потім зібрати деталі, потім записати або перевести»), коли потрібна детермінована маршрутизація за відповідями абонента (не «AI зазвичай впорається»), або коли агент має передати частину роботи фахівцю.
Prompt — це одна довга інструкція. Агент читає її один раз і використовує впродовж усього дзвінка. Workflow — це багато маленьких інструкцій, по одній на ноду, з явними переходами між ними. Граф керує дзвінком — агент кожної ноди відповідає лише за свій шматок.
Якщо ваш агент уже добре працює з одним промптом, workflow вам не потрібен. Переходьте на workflows, коли починаєте накопичувати в промпті правила «якщо X, то Y», і вони перестають надійно працювати.
Редактор
Редактор workflow живе на власній вкладці на сторінці агента. Ви бачите полотно з нодою Start і нодою End за замовчуванням. Додаєте ноди з тулбара, перетягуєте їх на полотно та з'єднуєте ребрами.
Права панель змінюється залежно від того, що ви вибрали:
- Клік по ноді — відкриває її панель налаштувань (промпт, поля, змінні екстракції тощо).
- Клік по ребру — відкриває налаштування його тригера (AI decides / Condition / Always).
- Панель Variables (кнопка в тулбарі) показує кожну змінну workflow з переходом одним кліком до ноди, яка її встановлює або читає.
Запустіть Test Call у браузері просто з редактора — світний світлячок слідкує за позицією в реальному часі, щоб ви бачили, яка нода зараз активна.
Workflows мають три стани:
- Draft — редагований, ще не в проді. Використовуйте Test Call, щоб протестувати.
- Active — у проді для реальних дзвінків. Агент використовує цей workflow з наступного дзвінка.
- Template — повторно використовуваний шаблон, ніколи не прив'язаний прямо до агента. Можна інстанціювати на кілька агентів.
Ноди
Кожна нода — це крок у розмові. Різні типи нод роблять різні речі — одні говорять, інші слухають, інші маршрутизують, четверті виконують інструменти.
Agent
Нода Agent — серце етапу workflow. Коли граф доходить до ноди Agent, цей агент бере слово й веде розмову, доки щось не запустить перехід.
Ви налаштовуєте особистість і завдання ноди Agent безпосередньо на полотні (вкладка Prompt відкривається після кліку на ноду) — це промпт для цього шматка розмови, не для всього дзвінка. Також можна прикріпляти бази знань та інструменти по ноді.
Greeting — відкривальна фраза. Якщо це вхідна нода (перша зупинка після Start), це перше, що чує абонент.
Коли граф керує дзвінком, основний промпт агента (той, що у вкладці Model) замінюється на промпт активної ноди. Це зроблено навмисно — граф володіє особистістю та завданням поетапно, а не один фіксований промпт, що конкурує з ним.
Subagent
Subagent — це помічник, який працює інлайн — забирає розмову для конкретного завдання й повертає результат тому, хто його викликав.
Subagents добрі, коли шматок роботи повторно використовуваний або відчувається окремим: «перевір особу абонента», «збери адресу доставки», «кваліфікуй лід за SPIN». Батьківський агент викликає subagent, той робить своє діло, повертає результат, батько продовжує з того місця, де зупинився.
Ноди Subagent мають ті самі вкладки, що й нода Agent (Prompt, Knowledge, Tools, Actions) — редактор автоматично створює прихованого backing-агента за вас. Цього прихованого агента не видно в основному списку, і він не зараховується в ліміт агентів вашого тарифу.
Return variable — поле, куди зберегти результат subagent (наприклад, identity_verified, lead_score).
Message (Say)
Нода Say вимовляє фіксовану фразу — без ходу AI, без імпровізації. Використовуйте для переходів («Хвилинку, переводжу…»), обов'язкових правових повідомлень або заздалегідь визначених підтверджень, де важливі конкретні слова.
Text — що сказати. Підтримує токени {{variable}} для підставлення захоплених значень, наприклад "Дякую, {{first_name}}, я записав вас на {{appointment_time}}."
Нода Say використовує хід — агент згори нічого не додасть.
Gather Input
Нода Gather Input ставить запитання і захоплює відповідь абонента у змінну.
Prompt — питання, яке поставити. Підтримує {{tokens}}.
Variable — ім'я поля, куди зберегти відповідь.
Використовуйте щоразу, коли вам потрібне конкретне значення перед продовженням — email, номер рахунку, кількість осіб, категорію проблеми. Наступний хід абонента стає значенням; на ньому можна розгалужуватись ребром Condition відразу після.
Update State
Нода Update State записує одне чи кілька значень у змінні workflow, нічого не кажучи і не запитуючи. Використовуйте для попереднього встановлення значень за замовчуванням, позначення флагів прогресу або композиції значень з попередніх кроків.
Variable / Value — пара ключ-значення. More variables (optional) — додаткові пари ключ-значення.
Як ключі, так і значення підтримують {{tokens}}, тож можна складати нові значення з існуючих.
Condition
Нода Condition — це нода виключно для маршрутизації — не говорить, не запитує, просто надсилає дзвінок по вихідній гілці, що збіглась.
Сама умова живе на кожному вихідному ребрі, не на ноді — див. ребра Condition нижче.
Використовуйте ноду Condition, коли хочете чіткої точки «fan-out» у своєму графі: багато гілок, що залежать від значення змінної. Порівняно з умовами на ребрах Agent-нод, виділена нода Condition робить логіку маршрутизації візуально очевидною.
Tool
Нода Tool виконує один з підключених інструментів агента як крок графа — без участі AI у рішенні про виклик. Використовуйте, коли потрібен факт, а не розмова: «знайди цього клієнта», «перевір залишок на складі», «GET поточної погоди».
Можна:
- Вибрати один з наявних в агента інструментів (пошук по календарю, пошук у базі знань, конкретна дія інтеграції), або
- Налаштувати inline HTTP-виклик просто в ноді (URL, метод, заголовки, параметри, body).
Відповідь інструмента стає доступною всім наступним нодам. Якщо відповідь — JSON-об'єкт, кожне поле верхнього рівня стає окремою змінною — відповідь на кшталт {"is_known": true, "tier": "gold"} запише і is_known, і tier, щоб ви могли на них розгалужуватись.
Кожне текстове поле в ноді Tool — URL, значення заголовків, body — підтримує {{tokens}}. Вставте змінну в шлях URL, заголовок або body без написання коду.
Якщо виклик інструмента впав (HTTP-помилка, таймаут, мережа), нода логує помилку і граф іде далі — без даних. Сплануйте наступні умови так, щоб вони обробили випадок «немає значення».
Integration
Нода Integration — це сфокусований варіант Tool для підключених зовнішніх сервісів — Google Calendar, Outlook, HubSpot. Вибираєте провайдера й конкретну дію (наприклад, check_availability, create_event), задаєте параметри, і нода детерміновано викликає інтеграцію.
Якщо інтеграція не підключена в цього агента, нода проходить без дії — ваш граф продовжується. Перевіряйте наступні умови на випадок «не спрацювало».
Phone Transfer
Нода Phone Transfer переводить дзвінок (warm transfer) на зовнішній телефонний номер. Після успішного переведення дзвінок покинув ваш workflow — ваш агент більше не на лінії.
Number — пункт призначення у міжнародному форматі з + на початку (наприклад, +15551234567). Підтримує {{tokens}}, тож пункт призначення може прийти з попереднього кроку (наприклад, відповідь на «з яким офісом вас з'єднати?»).
Якщо переведення не відбулося (неправильний номер, немає відповіді, не налаштовано телефонне підключення), граф відкочується і поточний агент залишається на лінії. Розмова триває як звичайно — агент може вибачитись і спробувати інший шлях.
End Call
Нода End Call закриває — агент вимовляє налаштоване закриття і кладе слухавку. Використовуйте як чистий термінал для гілок «все зроблено» або для гілки «не можемо допомогти, вибачте» з складного Condition.
Не вимагає конфігурації, окрім вхідного ребра.
Повторне використання workflow (Sub-workflow)
Нода Sub-workflow зарезервована для вбудовування іншого workflow як під-графа. Ця нода є в редакторі, але ще не повністю підключена — граф проходить через неї нічого не роблячи. Не покладайтесь на неї для продакшен-дзвінків. Ми її увімкнемо, коли випустимо повторно використовувані під-графи.
Ребра (Connections)
З'єднуєте одну ноду з наступною через ребро. Тригер ребра вирішує, коли спрацьовує перехід.
Є три тригери:
| Тригер | Хто вирішує | Коли спрацьовує |
|---|---|---|
| AI decides | AI | Коли розмова робить це природним наступним кроком. AI отримує «інструмент переходу», який може викликати. |
| Condition | Рантайм | Коли змінна збігається з правилом, яке ви написали. Оцінюється до відповіді AI. |
| Always | Рантайм | Безумовно — як тільки джерельна нода завершилась. Без вводу абонента, без AI. |
AI decides (за інтентом)
Використовуйте AI decides, коли тільки AI може вирішити, коли перемикати — «якщо абонент питає про ціни, переведи на агента продажів», «якщо звучить як скарга, запусти subagent вибачень».
Ви пишете короткий опис інтента на ребрі (наприклад, «Абонент питає про ціни або хоче проапгрейдити тариф»). AI бачить це як інструмент з цим інтентом і вирішує, чи викликати його на основі розмови. Якщо присутні кілька AI-decides ребер, AI обирає максимум одне за хід.
Condition (детерміноване розгалуження)
Використовуйте Condition, коли хочете, щоб граф — не AI — вирішував за відомим фактом: «якщо lead_score > 7, надішли на closer; інакше — ввічливо завершити».
Conditions оцінюються до відповіді AI, тож вони завжди перемагають AI в цьому ході. AI не може перевизначити умову, що збіглась.
Можна будувати умову з цих операторів:
| Оператор | Значення | Приклад |
|---|---|---|
| equals | точне збігання (регістронезалежно для тексту) | intent equals "billing" |
| not equals | не збігається | status not equals "active" |
| contains | підрядок (регістронезалежно) | feedback contains "broken" |
| greater than | числове > | lead_score greater than 7 |
| less than | числове < | wait_minutes less than 5 |
Можна також комбінувати клаузи через All (усі мають збігтись — AND) або Any (хоча б одна має збігтись — OR), та вкладати їх. Правило на кшталт «абонент відомий і його tier gold або premium» стає:
All:
- is_known equals true
- Any:
- tier equals gold
- tier equals premium
Якщо посилаєтесь на змінну, яка ще не встановлена (наприклад, AI її не зібрав), умови на ній завжди не виконуються — без помилки, просто не збігаються. Тож loyalty_tier equals "gold" поверне false, якщо loyalty_tier ніколи не встановлювався. Проектуйте гілки так, щоб обробити це — зазвичай через гілку else (див. нижче).
Гілка else — коли жодна умова не збіглась
Якщо у вас кілька Condition-ребер з ноди й жодне не збіглось, дзвінок падає на не-Condition ребро найнижчого пріоритету (Always або AI-decides ребро). Якщо fallback немає взагалі, AI повертає собі контроль і може продовжувати вільно.
Поширений патерн: кілька Conditions для відомих шляхів плюс Always ребро на catch-all (сказати щось, потім End Call або перевести).
Always (auto-advance)
Використовуйте Always, коли наступний крок безумовний — без рішення, без вводу абонента. Два природних застосування:
- Ланцюжок кроків: SAY → UPDATE_STATE → SAY → TOOL → Condition. Кожен крок завершується, і Always-ребро відразу просуває далі.
- Авто-просування після того, як агент закінчив говорити: Agent-нода з вихідним Always-ребром означає «як тільки AI замовкне, рухайся далі» — без необхідності відповіді абонента. Корисно для монологових потоків, наприклад агента-презентера, який вимовляє і переходить до наступної секції.
Condition та Always (детерміновані) завжди перемагають AI decides. Якщо Condition збіглось, інструменти переходу AI ігноруються в цьому ході. Це дозволяє писати правила, які AI не може обійти.
Змінні
Змінні — це пам'ять workflow. Більшість речей у workflow — це або встановлення змінної, або її читання.
Оголошення змінних
Панель Variables (кнопка в тулбарі) показує кожну змінну workflow з кроками, що її встановлюють або читають. Клік по змінній — перехід до сетера; це найшвидший спосіб знайти, де щось іде не так.
Можна оголосити змінну зі значенням за замовчуванням на панелі — корисно для флагів на кшталт escalated=false, які мають існувати від самого початку, щоб ваші умови не падали тихо через «відсутність».
Як змінні встановлюються
| Джерело | Приклад |
|---|---|
| Значення за замовчуванням (оголошені на панелі Variables) | escalated = false встановлено до початку дзвінка |
| Gather Input | Голосова відповідь абонента захоплюється в змінну ноди |
| Update State | Ви записуєте значення (літерал або композиція з {{tokens}}) безпосередньо |
| Результат Tool / Integration | Уся відповідь зберігається під ім'ям ноди; якщо відповідь — JSON-об'єкт, кожне поле верхнього рівня теж стає окремою змінною |
| Return із Subagent | Те, що subagent фіналізує, зберігається в return-змінну ноди subagent |
Читання змінних — {{tokens}}
Усюди, де можна писати текст у ноді — Agent-промпт, Say-текст, Gather-промпт, URL/body/headers у Tool, номер у Phone Transfer, значення в Update State, значення умов — можна вставити {{variable}}, і воно підставиться в рантаймі.
Шляхи з крапкою теж працюють для вкладених даних — наприклад, якщо Tool-відповідь була {"customer": {"name": "Anna", "tier": "gold"}}, можна читати {{customer.name}} або {{customer.tier}}.
Якщо токен посилається на неіснуючу змінну, літеральний текст {{name}} лишається як є (не очищається). Це навмисно — робить зламані шаблони легко помітними в test call, замість того щоб тихо їх ковтати.
Поширені патерни
Кваліфікація → Розгалуження → Маршрутизація
Start
└─ Agent (greeting + qualify)
└─ Gather Input (intent)
└─ Condition: intent == "sales" → Agent (sales)
└─ Condition: intent == "support" → Subagent (triage)
└─ Always (catch-all) → Say "Let me connect you" → Phone Transfer
Пошук → Персоналізація
Start
└─ Tool (CRM lookup, writes is_known, name, tier)
└─ Condition: is_known == true → Agent (warm greeting with {{name}})
└─ Always (else) → Agent (cold greeting)
Повторно використовуваний хелпер (side-trip Subagent)
Agent (main conversation)
└─ AI decides: "Caller mentions an address" → Subagent (address collector)
└─ on finish: result = full_address
└─ Agent continues with {{full_address}}
Що заблоковано під час workflow-дзвінка
Деякі значення за замовчуванням змінюються, коли дзвінок керується графом:
- Мова заблокована на тій, що використовується першим агентом workflow. AI не може змінити мову посеред дзвінка. Це запобігає тому, щоб модель з'їхала не на ту мову на галасливому ході.
- Основний промпт агента замінюється на промпт активної ноди. Це правило «граф володіє персоною» — див. warning під Agent.
- Перше повідомлення приходить з greeting вхідної ноди, а не з поля «Begin Message» агента.
Захист від циклів — Step Budget
Кожен workflow має максимальне число переходів на дзвінок (за замовчуванням 25). Щоразу, коли граф переходить до нової ноди, лічильник зменшується на одиницю. Коли доходить до нуля, рантайм перестає робити переходи, щоб запобігти розрослим циклам.
Для цього випадку можна вибрати fallback-ноду (зазвичай Phone Transfer або End Call) — дзвінок відхиляється туди, як тільки бюджет вичерпано.
Про це рідко доводиться думати — це страховка для випадково зациклених графів. Якщо потрапили в це за звичайного користування, скоріше за все десь у вас цикл.
Тестування
Кнопка Test Call у редакторі відкриває браузерний дзвінок з поточним draft workflow. Поки він іде, світний світлячок рухається між нодами на полотні, щоб ви бачили, де саме зараз дзвінок. Редактор заблоковано на час test call, щоб зміни не розсинхронізували живий стан.
Використовуйте Test Call, щоб перевірити:
- Ваші умови збігаються зі значеннями, які ви очікуєте (дивіться, чи не перестрибує світлячок гілку, яку ви думали запустити).
- Ваші токени підставляються правильно (слухайте зависле
{{name}}, якщо значення не було встановлено). - Збої інструментів деградують вишукано (ваш fallback-маршрут дійсно спрацьовує).
Збої, про які варто знати
| Ситуація | Що відбувається |
|---|---|
| Виклик Tool / Integration впав | Граф іде далі без даних. Ваші наступні умови мають обробляти відсутню змінну. |
| Phone Transfer не відбувся (неправильний номер, немає відповіді, не налаштовано телефонне підключення) | Граф відкочується, поточний агент залишається на лінії, і розмова триває як звичайно. |
| Subagent не запустився | Бічна гілка скасовується, батьківський агент залишається на лінії, вимовляється коротка фраза про збій. |
{{missing_variable}} у тексті | Залишається літералом у виводі — легко помітити в test calls. |
| Нода Sub-workflow | Зараз проходить повз, нічого не роблячи. Поки не покладайтеся на неї. |
| Step budget вичерпано | Відхиляється на fallback-ноду, якщо задана, інакше AI повертає собі контроль. |
Коли НЕ використовувати Workflow
Workflows потужні, але не завжди правильна відповідь. Залиштесь з одним промптом, коли:
- Розмова відкрита («відповідати на питання абонента про наші продукти»).
- У вас немає чіткої логіки розгалуження — більшість рішень — це судження, з якими AI справляється.
- Ви б написали тільки Agent-ноду й End Call — це просто промпт із зайвими кроками.
Переходьте на workflow, коли:
- Можете накидати дзвінок як блок-схему з трьома чи більше чіткими етапами.
- Потрібне хоча б одне детерміноване розгалуження за змінною (Condition).
- Хочете повторно використати шматок розмови між кількома агентами (subagent).
- Уже накопичуєте правила «якщо абонент каже X, тоді робить Y» у промпті, і вони ненадійні.