Przejdź do głównej zawartości

Workflows

Workflow to wizualna mapa tego, co Twój agent ma robić krok po kroku — kto mówi pierwszy, o co pytać, kiedy się rozgałęziać, kiedy przekierować rozmowę i kiedy przekazać ją innemu agentowi. Budujesz to na płótnie, umieszczając węzły i łącząc je.

Użyj workflow, gdy pojedynczy prompt nie wystarcza — gdy rozmowa ma wyraźne etapy («najpierw zakwalifikować, potem zebrać szczegóły, potem zarezerwować lub przekierować»), gdy potrzebujesz deterministycznego routingu na podstawie odpowiedzi rozmówcy (a nie «AI zwykle da radę»), albo gdy agent powinien przekazać kawałek pracy specjaliście.

Prompt vs Workflow

Prompt to jedna długa instrukcja. Agent czyta ją raz i używa przez całą rozmowę. Workflow to wiele małych instrukcji, po jednej na węzeł, z jawnymi przejściami między nimi. Graf prowadzi rozmowę — agent każdego węzła odpowiada tylko za swój fragment.

Jeśli Twój agent już dobrze działa z jednym promptem, nie potrzebujesz workflow. Sięgaj po workflows, gdy zaczynasz dodawać do promptu reguły «jeśli X to Y» i przestają one niezawodnie działać.


Edytor

Edytor workflow żyje na własnej zakładce na stronie agenta. Widzisz płótno z węzłem Start i węzłem End domyślnie. Dodajesz węzły z paska narzędzi, przeciągasz je na płótno i łączysz krawędziami.

Prawy panel zmienia się w zależności od tego, co wybierzesz:

  • Kliknięcie węzła — otwiera jego panel ustawień (prompt, pola, zmienne ekstrakcji itp.).
  • Kliknięcie krawędzi — otwiera ustawienia jej triggera (AI decides / Condition / Always).
  • Panel Variables (przycisk na pasku) wymienia każdą zmienną workflow z przeskokiem jednym kliknięciem do węzła, który ją ustawia lub odczytuje.

Uruchom Test Call w przeglądarce bezpośrednio z edytora — świecący świetlik podąża za pozycją na żywo, byś widział dokładnie, który węzeł jest aktywny w każdej chwili.

Zapis i stany

Workflows mają trzy stany:

  • Draft — edytowalny, jeszcze nie na produkcji. Użyj Test Call, by go przetestować.
  • Active — na produkcji dla prawdziwych rozmów. Agent używa tego workflow od następnej rozmowy.
  • Template — szablon wielokrotnego użytku, nigdy nie powiązany bezpośrednio z agentem. Możesz go zainstancjować na wielu agentach.

Węzły

Każdy węzeł to krok w rozmowie. Różne typy węzłów robią różne rzeczy — jedne mówią, inne słuchają, inne routują, inne wykonują narzędzia.

Agent

Węzeł Agent to serce etapu workflow. Gdy graf dociera do węzła Agent, ten agent przejmuje głos i prowadzi rozmowę, dopóki coś nie wyzwoli przejścia.

Konfigurujesz osobowość i zadanie węzła Agent bezpośrednio na płótnie (zakładka Prompt otwiera się po kliknięciu węzła) — to prompt dla tego fragmentu rozmowy, nie dla całej rozmowy. Możesz też dołączać bazy wiedzy i narzędzia per węzeł.

Greeting — fraza otwierająca. Jeśli to węzeł wejściowy (pierwszy przystanek po Start), to pierwsza rzecz, jaką słyszy rozmówca.

Persona należy do grafu

Gdy graf rządzi rozmową, główny prompt agenta (ten z zakładki Model) jest zastępowany przez prompt aktywnego węzła. Tak ma być — graf jest właścicielem osobowości i zadania na każdy etap, nie jeden stały prompt konkurujący z nim.

Subagent

Subagent to pomocnik działający inline — przejmuje rozmowę dla konkretnego zadania, potem zwraca wynik temu, kto go wywołał.

Subagenty świetnie sprawdzają się, gdy kawałek pracy jest wielokrotnego użytku lub czuje się odrębny: «zweryfikuj tożsamość rozmówcy», «zbierz adres dostawy», «zakwalifikuj leada metodą SPIN». Agent nadrzędny wywołuje subagenta, ten robi swoje, raportuje wynik, nadrzędny wraca tam, gdzie skończył.

Węzły Subagent mają te same zakładki co węzeł Agent (Prompt, Knowledge, Tools, Actions) — edytor automatycznie tworzy ukrytego backing-agenta za Ciebie. Tego ukrytego agenta nie widać w głównej liście i nie liczy się do limitu agentów Twojego planu.

Return variable — pole, w którym zachować wynik subagenta (np. identity_verified, lead_score).

Message (Say)

Węzeł Say wypowiada stałą frazę — bez tury AI, bez improwizacji. Użyj go do przejść («Chwileczkę, przekierowuję…»), obowiązkowych komunikatów prawnych lub predefiniowanych potwierdzeń, gdzie słowa mają znaczenie.

Text — co powiedzieć. Wspiera tokeny {{variable}} do wstrzyknięcia przechwyconych wartości, np. "Dziękuję {{first_name}}, zarezerwowałem Pani/Pana na {{appointment_time}}."

Węzeł Say zużywa turę — agent niczego nie doda od siebie.

Gather Input

Węzeł Gather Input zadaje pytanie i chwyta odpowiedź rozmówcy w zmienną.

Prompt — pytanie do zadania. Wspiera {{tokens}}. Variable — nazwa pola, w którym zachować odpowiedź.

Używaj zawsze, gdy potrzebujesz konkretnej wartości przed dalszym krokiem — email, numer konta, liczba osób, kategoria problemu. Następna tura rozmówcy staje się wartością; można na niej rozgałęzić krawędzią Condition tuż potem.

Update State

Węzeł Update State zapisuje jedną lub więcej wartości do zmiennych workflow bez mówienia i bez pytania. Użyj do ustawiania domyślnych, oznaczania flag postępu lub komponowania wartości z wcześniejszych kroków.

Variable / Value — para klucz-wartość. More variables (optional) — dodatkowe pary klucz-wartość.

Zarówno klucze, jak i wartości wspierają {{tokens}}, więc możesz komponować nowe wartości z istniejących.

Condition

Węzeł Condition to węzeł czysto routingowy — nie mówi, nie pyta, po prostu wysyła rozmowę na pasującą wychodzącą gałąź.

Sam warunek żyje na każdej wychodzącej krawędzi, nie w węźle — patrz krawędzie Condition poniżej.

Użyj węzła Condition, gdy chcesz wyraźny punkt «fan-out» w swoim grafie: wiele gałęzi zależnych od wartości zmiennej. W porównaniu z umieszczaniem warunków na krawędziach węzłów Agent, dedykowany węzeł Condition czyni logikę routingu wizualnie oczywistą.

Tool

Węzeł Tool wykonuje jedno z podłączonych narzędzi agenta jako krok grafu — bez tego, by AI miała głos w sprawie wywołania. Używaj, gdy chcesz fakt, nie rozmowę: «znajdź tego klienta», «sprawdź stan magazynu», «GET aktualnej pogody».

Możesz:

  • Wybrać jedno z istniejących narzędzi agenta (lookup kalendarza, wyszukiwanie w bazie wiedzy, konkretne działanie integracji), albo
  • Skonfigurować inline HTTP call bezpośrednio w węźle (URL, metoda, nagłówki, parametry, body).

Odpowiedź narzędzia staje się dostępna wszystkim węzłom w dół. Jeśli odpowiedź to obiekt JSON, każde pole najwyższego poziomu staje się własną zmienną — odpowiedź typu {"is_known": true, "tier": "gold"} zapisuje zarówno is_known, jak i tier, żebyś mógł na nich rozgałęziać.

Tokeny w Tool

Każde pole tekstowe w węźle Tool — URL, wartości nagłówków, body — wspiera {{tokens}}. Wsuń zmienną do ścieżki URL, nagłówka lub body bez pisania kodu.

Jeśli wywołanie narzędzia nie powiedzie się (błąd HTTP, timeout, sieć), węzeł loguje porażkę i graf idzie dalej — bez danych. Zaplanuj swoje warunki w dół, by obsłużyć przypadek «brak wartości».

Integration

Węzeł Integration to wariant Tool skoncentrowany na podłączonych usługach zewnętrznych — Google Calendar, Outlook, HubSpot. Wybierasz dostawcę i konkretne działanie (np. check_availability, create_event), podajesz parametry, a węzeł wywołuje integrację deterministycznie.

Jeśli integracja nie jest podłączona u tego agenta, węzeł przechodzi bez działania — Twój graf kontynuuje. Sprawdź warunki w dół na przypadek «nie zadziałało».

Phone Transfer

Węzeł Phone Transfer przekierowuje rozmowę (warm transfer) na zewnętrzny numer telefonu. Po udanym przekierowaniu rozmowa opuściła Twój workflow — Twój agent już nie jest na linii.

Number — cel w formacie międzynarodowym z wiodącym + (np. +15551234567). Wspiera {{tokens}}, więc cel może pochodzić z wcześniejszego kroku (np. odpowiedź na «z którym biurem Państwa połączyć?»).

Jeśli przekierowanie nie dojdzie do skutku (nieprawidłowy numer, brak odpowiedzi, połączenie telefoniczne nieskonfigurowane), graf cofa się i bieżący agent zostaje na linii. Rozmowa toczy się dalej normalnie — agent może przeprosić i spróbować innej ścieżki.

End Call

Węzeł End Call kończy — agent wypowiada skonfigurowane zamknięcie i odkłada słuchawkę. Używaj jako czystego terminusa dla gałęzi «wszystko zrobione» lub dla gałęzi «nie możemy pomóc, przepraszamy» z trudnej Condition.

Nie wymaga konfiguracji poza krawędzią wchodzącą.

Wielokrotne użycie workflow (Sub-workflow)

Węzeł Sub-workflow jest zarezerwowany do osadzania innego workflow jako pod-grafu. Ten węzeł jest w edytorze, ale nie jest jeszcze w pełni podłączony — graf przechodzi przez niego bez wykonywania żadnej akcji. Nie polegaj na nim w rozmowach produkcyjnych. Włączymy go, gdy wypuścimy wielokrotnego użytku pod-grafy.


Krawędzie (Połączenia)

Łączysz węzeł z następnym za pomocą krawędzi. Trigger krawędzi decyduje, kiedy przejście się odpala.

Są trzy triggery:

TriggerKto decydujeKiedy się odpala
AI decidesAIKiedy rozmowa czyni to naturalnym kolejnym krokiem. AI dostaje «narzędzie przejścia», które może wywołać.
ConditionRuntimeKiedy zmienna pasuje do reguły, którą napisałeś. Oceniane przed odpowiedzią AI.
AlwaysRuntimeBezwarunkowo — gdy tylko źródłowy węzeł zakończy. Bez wejścia rozmówcy, bez AI.

AI decides (oparte na intencji)

Użyj AI decides, gdy tylko AI może zdecydować, kiedy przełączyć — «jeśli rozmówca pyta o ceny, przekieruj na agenta sprzedaży», «jeśli brzmi jak skarga, uruchom subagent przepraszania».

Piszesz krótki opis intentu na krawędzi (np. «Rozmówca pyta o ceny lub chce zrobić upgrade»). AI widzi to jako narzędzie z tym intentem i decyduje, czy go wywołać na podstawie rozmowy. Jeśli jest wiele krawędzi AI-decides, AI wybiera co najwyżej jedną na turę.

Condition (deterministyczne rozgałęzienie)

Użyj Condition, gdy chcesz, by graf — nie AI — decydował na podstawie znanego faktu: «jeśli lead_score > 7, wyślij do closera; w przeciwnym razie zakończ uprzejmie».

Conditions są oceniane przed odpowiedzią AI, więc zawsze wygrywają z AI w tej turze. AI nie może nadpisać warunku, który pasuje.

Możesz zbudować warunek z tych operatorów:

OperatorZnaczeniePrzykład
equalsdokładne dopasowanie (case-insensitive dla tekstu)intent equals "billing"
not equalsnie pasujestatus not equals "active"
containsdopasowanie podciągu (case-insensitive)feedback contains "broken"
greater thannumeryczne >lead_score greater than 7
less thannumeryczne <wait_minutes less than 5

Możesz też kombinować klauzule przez All (wszystkie muszą pasować — AND) lub Any (przynajmniej jedna musi pasować — OR), i zagnieżdżać je. Reguła typu «rozmówca jest znany i jego tier to gold lub premium» staje się:

All:
- is_known equals true
- Any:
- tier equals gold
- tier equals premium
Brakujące zmienne nigdy nie pasują

Jeśli odwołujesz się do zmiennej, która nie została jeszcze ustawiona (np. AI jej nie zebrała), warunki na niej zawsze nie spełniają — bez błędu, po prostu nie pasują. Więc loyalty_tier equals "gold" zwraca fałsz, jeśli loyalty_tier nigdy nie został ustawiony. Projektuj gałęzie tak, by to obsłużyć — zwykle gałąź else (patrz niżej).

Gałąź else — gdy żaden warunek nie pasuje

Jeśli masz wiele krawędzi Condition wychodzących z węzła i żadna nie pasuje, rozmowa spada na krawędź nie-Condition o najniższym priorytecie (Always lub krawędź AI-decides). Jeśli w ogóle nie ma fallback, AI odzyskuje kontrolę i może iść dalej swobodnie.

Częsty wzorzec: kilka Conditions dla znanych ścieżek plus krawędź Always do catch-all (powiedz coś, potem End Call lub przekierowanie).

Always (auto-advance)

Użyj Always, gdy kolejny krok jest bezwarunkowy — bez decyzji, bez wejścia rozmówcy. Dwa naturalne zastosowania:

  • Łańcuch kroków: SAY → UPDATE_STATE → SAY → TOOL → Condition. Każdy krok kończy się i krawędź Always natychmiast posuwa dalej.
  • Auto-posuwanie po skończeniu mówienia przez agenta: węzeł Agent z wychodzącą krawędzią Always oznacza «gdy tylko AI przestanie mówić, idź dalej» — bez konieczności odpowiedzi rozmówcy. Przydatne dla przepływów monologowych jak agent-prezenter, który przekazuje i przechodzi do kolejnej sekcji.
Priorytet między triggerami

Condition i Always (deterministyczne) zawsze wygrywają z AI decides. Jeśli Condition pasuje, narzędzia przejścia AI są ignorowane w tej turze. To pozwala pisać reguły, których AI nie może pominąć.


Zmienne

Zmienne to pamięć workflow. Większość rzeczy w workflow albo ustawia zmienną, albo ją czyta.

Deklarowanie zmiennych

Panel Variables (przycisk na pasku) pokazuje każdą zmienną workflow z krokami, które ją ustawiają lub czytają. Kliknij zmienną, by skoczyć do settera; to najszybszy sposób znalezienia, gdzie coś idzie nie tak.

Możesz zadeklarować zmienną z wartością domyślną w panelu — przydatne dla flag jak escalated=false, które muszą istnieć od początku, by Twoje warunki nie sypały się po cichu z powodu «braku».

Jak zmienne są ustawiane

ŹródłoPrzykład
Wartości domyślne (zadeklarowane w panelu Variables)escalated = false ustawione przed rozpoczęciem rozmowy
Gather InputMówiona odpowiedź rozmówcy zostaje przechwycona w zmienną węzła
Update StateWpisujesz wartość (literał lub złożona z {{tokens}}) bezpośrednio
Wynik Tool / IntegrationCała odpowiedź jest zapisywana pod nazwą węzła; jeśli odpowiedź to obiekt JSON, każde pole najwyższego poziomu też staje się własną zmienną
Return z SubagentaTo, co subagent finalizuje, zostaje zapisane w zmiennej return węzła subagent

Odczyt zmiennych — {{tokens}}

Wszędzie, gdzie możesz pisać tekst w węźle — prompt Agenta, tekst Say, prompt Gather, URL/body/nagłówki Tool, numer Phone Transfer, wartość Update State, wartości warunku — możesz wstawić {{variable}} i zostanie podstawione w runtime.

Ścieżki z kropką też działają dla zagnieżdżonych danych — np. jeśli odpowiedź Tool była {"customer": {"name": "Anna", "tier": "gold"}}, możesz czytać {{customer.name}} lub {{customer.tier}}.

Nieznane tokeny pozostają widoczne

Jeśli token odwołuje się do nieistniejącej zmiennej, dosłowny tekst {{name}} jest zostawiony jak jest (nie wybielony). To celowe — sprawia, że zepsute szablony są łatwe do wychwycenia w test call, zamiast po cichu je zjeść.


Częste wzorce

Kwalifikuj → Rozgałęź → Rutuj

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

Wyszukaj → Spersonalizuj

Start
└─ Tool (CRM lookup, writes is_known, name, tier)
└─ Condition: is_known == true → Agent (warm greeting with {{name}})
└─ Always (else) → Agent (cold greeting)

Wielokrotnego użytku helper (Subagent side-trip)

Agent (main conversation)
└─ AI decides: "Caller mentions an address" → Subagent (address collector)
└─ on finish: result = full_address
└─ Agent continues with {{full_address}}

Co jest zablokowane podczas rozmowy sterowanej workflow

Niektóre domyślne ustawienia zmieniają się, gdy graf rządzi rozmową:

  • Język jest zablokowany na tym, którego używa pierwszy agent workflow. AI nie może zmienić języka w środku rozmowy. To zapobiega zsuwaniu się modelu na zły język podczas zaszumionej tury.
  • Główny prompt agenta jest zastępowany promptem aktywnego węzła. To zasada «graf jest właścicielem persony» — zobacz warning pod Agent.
  • Pierwsza wiadomość pochodzi z greetinga węzła wejściowego, nie z pola «Begin Message» agenta.

Zabezpieczenie przed pętlą — Step Budget

Każdy workflow ma maksymalną liczbę przejść na rozmowę (domyślnie 25). Za każdym razem, gdy graf przechodzi do nowego węzła, licznik spada o jeden. Gdy dotrze do zera, runtime przestaje robić przejścia, by zapobiec niekontrolowanym pętlom.

Możesz wybrać węzeł fallback dla tego przypadku (zwykle Phone Transfer lub End Call) — rozmowa zostaje tam przekierowana, gdy budżet się wyczerpie.

Rzadko musisz o tym myśleć — to siatka bezpieczeństwa dla grafów, które przypadkowo się zapętlają. Jeśli trafiasz na to w normalnym użyciu, prawdopodobnie masz gdzieś cykl.


Testowanie

Przycisk Test Call w edytorze otwiera rozmowę w przeglądarce z aktualnym draftem workflow. Podczas jego pracy świecący świetlik porusza się między węzłami na płótnie, żebyś widział dokładnie, gdzie jest rozmowa. Edytor jest zablokowany podczas test call, by zmiany nie zdesynchronizowały stanu live.

Użyj Test Call, by zweryfikować:

  • Twoje warunki pasują do wartości, których się spodziewasz (patrz, czy świetlik przeskakuje gałąź, którą myślałeś, że się odpali).
  • Twoje tokeny są podstawione poprawnie (nasłuchuj zawieszonego {{name}}, jeśli wartość nie została ustawiona).
  • Porażki narzędzi degradują się łagodnie (Twoja trasa fallback faktycznie się odpala).

Porażki, o których warto wiedzieć

SytuacjaCo się dzieje
Wywołanie Tool / Integration kończy się niepowodzeniemGraf kontynuuje bez danych. Twoje warunki w dół powinny obsłużyć nieobecną zmienną.
Phone Transfer nie dochodzi do skutku (nieprawidłowy numer, brak odpowiedzi, brak skonfigurowanego połączenia telefonicznego)Graf cofa się, bieżący agent zostaje na linii, a rozmowa toczy się dalej normalnie.
Subagent nie wystartujeSide-trip zostaje anulowany, agent nadrzędny zostaje na linii, wypowiadana jest krótka fraza o niepowodzeniu.
{{missing_variable}} w tekścieZostawione dosłownie w wyjściu — łatwe do wychwycenia w test calls.
Węzeł Sub-workflowObecnie przechodzi przez niego bez wykonywania żadnej akcji. Nie polegaj na nim jeszcze.
Step budget wyczerpanyPrzekierowuje do węzła fallback, jeśli jest ustawiony, w przeciwnym razie AI odzyskuje kontrolę.

Kiedy NIE używać Workflow

Workflows są potężne, ale nie są właściwą odpowiedzią dla każdego agenta. Zostań przy jednym promptcie, gdy:

  • Rozmowa jest otwarta («odpowiadać na pytania rozmówcy o nasze produkty»).
  • Nie masz wyraźnej logiki rozgałęzień — większość decyzji to osądy, z którymi AI dobrze sobie radzi.
  • Napisałbyś tylko węzeł Agent i End Call — to po prostu prompt z dodatkowymi krokami.

Sięgnij po workflow, gdy:

  • Możesz naszkicować rozmowę jako schemat blokowy z trzema lub więcej wyraźnymi etapami.
  • Potrzebujesz przynajmniej jednego deterministycznego rozgałęzienia po zmiennej (Condition).
  • Chcesz wielokrotnie wykorzystać fragment rozmowy między wieloma agentami (subagent).
  • Już dodajesz reguły «jeśli rozmówca powie X, to zrobi Y» do promptu i nie są niezawodne.