Open in
Kroki agenta i przekazywanie rozmów
Podziel agenta na kroki z własnymi instrukcjami, narzędziami i zebranymi wartościami oraz przekazuj połączenia między agentami w trakcie rozmowy.
Pojedynczy prompt przekazuje modelowi całe zadanie naraz. Kroki przekazują mu po jednej fazie rozmowy: każdy krok ma własne instrukcje, własne narzędzia, opcjonalną kwestię wypowiadaną słowo w słowo oraz wartości, które musi zebrać przed przejściem dalej. Przekazania pozwalają innemu agentowi w organizacji przejąć rozmowę w jej trakcie, z zachowaniem transkrypcji, dzięki czemu rozmówca nie musi się powtarzać.
Każdy agent zaczyna jako pojedynczy prompt. Nic się w nim nie zmienia, dopóki nie dodasz kroków lub przekazań.
Kroki czy pojedynczy prompt?
| Użyj kroków, gdy | Zachowaj pojedynczy prompt, gdy |
|---|---|
| Rozmowa ma fazy, które muszą wystąpić w określonej kolejności: najpierw weryfikacja, potem rezerwacja. | Rozmowa jest otwarta: FAQ, recepcja, ogólne wsparcie. |
| Wartość musi zostać zebrana, zanim agent przejdzie dalej. | Nic nie musi zostać zebrane w ustalonej kolejności. |
| Reguła nigdy nie może zostać nagięta, na przykład „rozmówcy poniżej 18 roku życia są kierowani do opiekuna”. | Ocena modelu jest wystarczająco dobra dla każdego wariantu. |
| Wyszukiwanie musi zostać wykonane w określonym momencie rozmowy. | Narzędzia można wywołać zawsze, gdy rozmówca o to poprosi. |
| Część rozmowy należy do innego agenta, z własnym promptem i głosem. | Jedna persona obsługuje wszystko. |
Kroki nie są skryptowym drzewem telefonicznym. W ramach kroku model prowadzi rozmowę tak samo jak przy pojedynczym prompcie. Krok określa, nad czym model pracuje, jakich narzędzi może używać oraz czego potrzebuje, zanim będzie mógł go opuścić.
Jak zbudowany jest agent z krokami
Gdy agent ma kroki, jego prompt zawiera wspólne instrukcje: personę i
reguły obowiązujące w każdym kroku. Każdy krok dodaje do nich własne
instrukcje. W każdej turze model widzi wspólne instrukcje, nazwę i instrukcje
bieżącego kroku oraz wartości zebrane do tej pory.
W kreatorze przełącz agenta z Pojedynczy prompt na Kroki. Otrzymasz kartę dla każdego kroku z jego nazwą, instrukcjami, kwestią, narzędziami, zebranymi wartościami i przejściami, selektor przekazań oraz graf przepływu kroków tylko do odczytu. Przełączenie z powrotem na pojedynczy prompt oferuje spłaszczony prompt, który łączy wspólne instrukcje i wszystkie kroki.
W interfejsie API steps i handoffs są polami
agenta. Tak jak każde pole agenta, żądanie PATCH
umieszcza je w wersji roboczej; POST /v1/agents/{agent_id}/deploy publikuje
je. Wysłanie "steps": null przełącza agenta z powrotem na pojedynczy prompt.
Połączenia testowe i Rozmowa działają na wersji roboczej.
Pola kroku
| Pole | Znaczenie |
|---|---|
id | Wymagane. Małe litery, cyfry i podkreślenia, zaczynające się od litery, maksymalnie 40 znaków. Unikalne w obrębie agenta. |
name | Wymagana nazwa wyświetlana, od 1 do 80 znaków. |
instructions | Wymagane, maksymalnie 20 000 znaków. Obsługuje zmienne połączenia {{var}}, tak jak prompt. |
say | Opcjonalna kwestia wypowiadana słowo w słowo po wejściu do kroku, maksymalnie 1 000 znaków. Obsługuje {{var}}. |
tools | null udostępnia krokowi każde narzędzie dołączone do agenta. Lista ogranicza krok do wskazanych narzędzi według nazwy. Wbudowane działania, takie jak end_call i transfer_call, stosują ustawienia agenta w każdym kroku. |
collect | Maksymalnie 20 wartości zbieranych przez krok. Każda ma name, type, description i required (domyślnie true). |
on_enter_tool | Opcjonalna nazwa narzędzia, wywoływanego automatycznie po wejściu do kroku. Zobacz Kroki webhooka. |
transitions | Uporządkowana lista miejsc, do których krok może przejść dalej. Zobacz Przejścia. |
global_when | Opcjonalne. Umożliwia osiągnięcie kroku z dowolnego kroku. Zobacz Kroki globalne. |
voice | Opcjonalny identyfikator głosu dla tego kroku. Ignorowany, gdy agent używa niestandardowej konfiguracji głosu. |
Sam graf ma postać {"start_step": "<step id>", "steps": [...]}. Rozmowa
rozpoczyna się w start_step.
Przejścia
Każde przejście ma to, identyfikator kroku, oraz dokładnie jedno z poniższych:
when: opis prostym językiem, a model podejmuje decyzję. Agent otrzymuje wbudowane narzędziego_to_stepz listą kroków, do których może przejść, przy czym każdewhenstanowi powód jego wyboru.condition: regułę dotyczącą zebranych wartości, a kod podejmuje decyzję. Model nie może go pominąć ani obejść rozmową."always": true: przejdź dalej bez sprawdzania. Kod podejmuje decyzję jako pierwszy: gdy tylko krok zostanie otwarty lub po zebraniu jego wymaganych wartości, pierwsze pasujące przejścieconditionalboalwayszostaje wybrane, zanim model może wybraćwhen. Dlatego umieśćalwayspo warunkach jako opcję zapasową albo użyj go samodzielnie, aby połączyć krok bezpośrednio z następnym. Krok zalwaysnigdy nie czeka na wybórwhen.
condition ma postać {"value": <collected name or dotted path>, "op": <op>, "target": <literal>}:
op | Prawda, gdy wartość |
|---|---|
eq, ne | jest równa albo nie jest równa target |
lt, lte, gt, gte | jest mniejsza niż, nie większa niż, większa niż albo co najmniej równa target |
in, not_in | jest albo nie jest jedną z wartości na liście target |
exists, missing | została albo nie została zebrana (bez target) |
eq, ne, in i not_in porównują tekst bez rozróżniania wielkości liter, po usunięciu
spacji. Liczby są porównywane jako liczby, a daty jako ciągi YYYY-MM-DD. Wartość,
która nigdy nie została zebrana, powoduje, że każdy op zwraca fałsz z wyjątkiem missing.
Zapisuj when i global_when jako warunek, na przykład „Rozmówca chce
umówić wizytę”, a nie jako coś do powiedzenia. Agent widzi je jako wewnętrzne
notatki routingu i otrzymuje instrukcję, aby nigdy ich nie odczytywać ani nie wspominać, że
zmienia kroki.
Gdy model wywołuje go_to_step:
- Każda wartość
requiredw kroku musi być obecna. Jeśli którejś brakuje, model otrzymuje informację, której, i pyta o nią rozmówcę. - Wartości są zapisywane.
- Przejścia
conditionialwayssą sprawdzane po kolei. Pierwsze pasujące zostaje wybrane. - W przeciwnym razie agent przechodzi do kroku wybranego przez model.
- Jeśli nic nie pasuje, a model nie wskazał kroku, agent pozostaje w bieżącym miejscu.
Przejście do kroku globalnego jest wyjątkiem: rozmówca zmienił temat, więc następuje ono nawet wtedy, gdy w bieżącym kroku nadal brakuje wymaganych wartości, oraz przed sprawdzeniem warunków tego kroku.
Przejścia condition i always są również sprawdzane za każdym razem, gdy krok jest
otwierany, więc sekwencja kroków, o których decyduje kod, jest wykonywana za jednym razem. Łańcuch kończy się:
- na kroku, który został już odwiedzony w tym przebiegu;
- po 8 przejściach;
- na kroku, w którym nadal trzeba zebrać wymagane wartości, chyba że krok ma
on_enter_tool(krok webhooka zawsze kieruje na podstawie swojego wyniku).
Wypowiadana jest tylko linia say kroku, na którym kończy się łańcuch.
Krok bez przejść jest końcowy. Agent kończy w nim działanie i kończy lub przekazuje połączenie przy użyciu swoich standardowych wbudowanych działań.
Zbieranie wartości
Wymień w collect, czego potrzebuje krok. Model przekazuje wartości podczas wywołania
go_to_step, a one pozostają dostępne przez resztę połączenia.
type | Przechowuje |
|---|---|
string | Dowolny tekst |
number | Liczbę |
boolean | true albo false |
date | Datę jako YYYY-MM-DD |
Zebrane wartości są treścią połączenia. Pojawiają się przy transkrypcji połączenia i podlegają tym samym zasadom przechowywania, usuwania i anonimizacji. Gdy nagrywanie połączeń agenta jest wyłączone, zebrane wartości nie są ani zapisywane, ani wysyłane w webhookach; oś czasu kroków nadal jest dostępna. Zobacz Gdzie zobaczyć to w połączeniu.
Wypowiadane kwestie
say jest wypowiadane dokładnie tak, jak zostało zapisane, gdy agent przechodzi do kroku. Model następnie kontynuuje w nowym kroku w tej samej odpowiedzi, wiedząc, że kwestia została właśnie wypowiedziana, więc jej nie powtarza. Używaj say do powitań, wymaganych informacji i stałego brzmienia, a resztę odpowiedzi pozostaw modelowi.
say kroku początkowego to otwierająca kwestia agenta, gdy mówi on jako pierwszy, po ewentualnym komunikacie o zgodzie. Gdy rozmówca mówi jako pierwszy, otwiera ono pierwszą odpowiedź agenta dla osoby, nigdy dla IVR ani powitania poczty głosowej.
say kroku nie jest wypowiadane ponownie, gdy połączenie wraca do niego przez __previous__ lub przekazanie z powrotem. Zapisz je tak, jak powinno brzmieć: przeliteruj wszystko, co głos może błędnie odczytać. Wypowiadane kwestie obsługują zmienne połączenia {{var}}, ale nie zebrane wartości.
Kroki webhooków
Ustaw on_enter_tool na jedno z narzędzi agenta, a uruchomi się ono natychmiast po wejściu do kroku, bez oczekiwania na model. Jego argumentami są zebrane wartości, których nazwy odpowiadają nazwom parametrów narzędzia. Wynik jest przechowywany jako zebrana wartość o nazwie <tool>_result, skrócona do 4 KB, a przejścia condition i always kroku są sprawdzane od razu, dzięki czemu wyszukiwanie może samodzielnie skierować połączenie na podstawie własnego wyniku.
Przechowywana wartość ma dwa pola:
| Pole | Zawiera |
|---|---|
status | Kod stanu HTTP zwrócony przez punkt końcowy. |
response | Treść odpowiedzi. |
Kieruj na podstawie pola treści za pomocą lookup_account_result.response.<field>, a na podstawie kodu stanu za pomocą lookup_account_result.status.
Wyszukiwanie działa maksymalnie przez 8 sekund lub przez krótszy limit czasu własnego narzędzia. Jeśli trwa dłużej niż 3 sekundy, agent wypowiada krótką kwestię, aby rozmówca nie pozostawał w ciszy. Jeśli punkt końcowy zwróci stan 400 lub wyższy albo nie odpowie na czas, agent informuje rozmówcę, że nie może teraz tego sprawdzić, i kontynuuje to, co może zrobić.
Kroki globalne
Krok z global_when można osiągnąć z dowolnego kroku, gdy opisany warunek jest spełniony. Model decyduje o tym, podobnie jak w przypadku when. Używaj tego dla tematów, które rozmówca może poruszyć w dowolnym momencie: pytań dotyczących rozliczeń, prośby o człowieka, skargi.
Przejście z "to": "__previous__" w kroku globalnym zwraca połączenie do kroku, który był aktywny wcześniej, dzięki czemu rozmówca kontynuuje od miejsca, w którym przerwał. Krok jest wznawiany: jego on_enter_tool nie uruchamia się ponownie, jego say nie jest powtarzane, a agent kontynuuje go bez rozpoczynania od nowa.
Przekazania
handoffs zawiera listę innych agentów w Twojej organizacji, którzy mogą przejąć połączenie:
[{"agent_id": 413, "when": "The caller asks about billing or a refund"}]Agent otrzymuje wbudowane narzędzie hand_off z tymi agentami i powodami. Podobnie jak w przypadku przejść, każde when jest wewnętrzną notatką dotyczącą routingu i nigdy nie jest odczytywane na głos.
Gdy przekazuje połączenie, agent wypowiada jednym krótkim zdaniem, dokąd trafia rozmówca, na przykład „Oczywiście, przełączę Cię do naszego zespołu rozliczeń”, własnym głosem. Następnie prompt, kroki, narzędzia i głos agenta docelowego przejmują połączenie, które jest kontynuowane z tym samym transkryptem. Nowy agent krótko się przedstawia i odpowiada na ostatnią prośbę rozmówcy; nie informuje o przekazaniu połączenia. Od tego momentu dostępna jest baza wiedzy agenta docelowego.
Gdy połączenie po raz pierwszy trafia do agenta, rozpoczyna się w start_step tego agenta: uruchamiane jest on_enter_tool kroku, a jego say jest wypowiadane. Gdy połączenie zostanie przekazane z powrotem do agenta, którego już odwiedziło, agent wznawia krok, na którym się znajdował, bez uruchamiania on_enter_tool, ponownego wypowiadania swojego say ani ponownego przedstawiania się. Zebrane wartości są współdzielone przez wszystkich agentów w połączeniu.
- Agent docelowy musi należeć do tej samej organizacji, a agent nie może przekazać połączenia samemu sobie.
- Wszystko na poziomie połączenia pozostaje przy agencie, który odebrał: produkt, języki, kto mówi pierwszy, poczta głosowa, komunikat o zgodzie i każde inne ustawienie połączenia.
- Agenci docelowi mogą przekazywać połączenie dalej, również z powrotem. Jedno połączenie może trafić maksymalnie do 8 agentów.
- Połączenie testowe uruchamia wersję roboczą testowanego agenta. Agenci, do których przekazuje on połączenie, uruchamiają swoje wdrożone wersje.
- Jeśli dwóch agentów ma narzędzie o tej samej nazwie, ale różnych definicjach, dla połączenia zachowywane jest tylko jedno, a narzędzie agenta odbierającego zawsze ma pierwszeństwo. Kreator ostrzega o tym podczas zapisywania.
- Agent może mieć przekazania bez kroków. Cały jego prompt jest używany bez zmian.
go_to_step i hand_off są zarezerwowane dla agentów z krokami lub przekazaniami, dlatego własne narzędzia nie mogą używać tych nazw.
Gdzie zobaczyć to w połączeniu
Otwórz połączenie w Historii połączeń. Oś czasu kroków obok transkryptu pokazuje każdy krok, do którego trafiło połączenie, oraz powód, a razem z nią wyświetlane są zebrane wartości.
Obiekt połączenia i webhook ukończenia połączenia (telephony.complete / web.complete) zawierają te same dane jako steps_trace i collected_values. Oba są nieobecne w połączeniach bez kroków.
"steps_trace": [
{"t_ms": 0, "agent": "a412", "step": "greet", "via": "start"},
{"t_ms": 51230, "agent": "a412", "step": "verify", "via": "model"},
{"t_ms": 98410, "agent": "a412", "step": "minor", "via": "condition"}
],
"collected_values": {"full_name": "Dana Reyes", "dob": "2010-04-02", "age": 15}agent to a, po którym występuje identyfikator agenta. via wskazuje, co przeniosło połączenie:
via | Znaczenie |
|---|---|
start | Połączenie rozpoczęło się w tym kroku. |
model | Model wybrał krok za pomocą go_to_step, when lub global_when. |
condition | Dopasowano przejście condition lub always. |
on_enter | Dopasowano przejście na podstawie wyniku kroku webhooka. |
handoff | Inny agent przejął połączenie. |
Gdzie działają kroki
Kroki działają natywnie w Spark, Bolt i każdym produkcie Storm, dla połączeń przychodzących, wychodzących i kampanii, połączeń testowych oraz połączeń internetowych i widżetów.
Wszędzie indziej agent nadal działa, tylko bez struktury: uruchamia spłaszczony prompt, który kolejno łączy wspólne instrukcje i każdy krok. Obejmuje to:
- eksperymentalne produkty Bolt;
- sesje Realtime, w tym sesje dla zapisanego agenta;
- konfiguracje inline zwracane przez webhook dynamicznej konfiguracji połączenia. Webhook zwracający
agent_idużywa kroków tego agenta.
Limity
| Limit | Wartość |
|---|---|
| Kroki na agenta | 100 |
| Zebrane wartości na krok | 20 |
| Cele przekazania na agenta | 8 |
| Agenci osiągalni w jednym połączeniu | 8 |
Rozmiar JSON steps | 200 KB |
instructions kroku | 20 000 znaków |
Linia say | 1 000 znaków |
Zapisany wynik on_enter_tool | 4 KB |
Zapis naruszający regułę zwraca 400 ze ścieżką nieprawidłowego pola, na
przykład steps.steps[2].transitions[0].to. Nazwy narzędzi w tools i
on_enter_tool muszą być narzędziami dołączonymi do agenta.
Języki przypisane do poszczególnych kroków, skryptowe kroki pomijające model oraz zebrane wartości wewnątrz linii say nie są obsługiwane.
Importowani agenci
Importowanie z Retell, Bland, Vapi lub ElevenLabs przenosi agentów z wieloma promptami, przepływy, ścieżki i procesy jako kroki, a zespoły i transfery agentów jako przekazania między zaimportowanymi agentami. Strona przeglądu pokazuje oba elementy przed importem.
Przykład: rejestracja pacjenta dentystycznego
Trzy kroki w kolejności: powitanie, zebranie danych pacjenta, rezerwacja.
{
"prompt": "You are Ava, the front desk assistant at Acme Dental. Be warm and brief. Ask one question at a time.",
"steps": {
"start_step": "greet",
"steps": [
{
"id": "greet",
"name": "Greeting",
"instructions": "Greet the caller and ask how you can help.",
"say": "Thanks for calling Acme Dental, this is Ava. How can I help you today?",
"tools": null,
"collect": [],
"transitions": [
{"to": "details", "when": "The caller wants to book an appointment"}
]
},
{
"id": "details",
"name": "Patient details",
"instructions": "Ask for the caller's full name, date of birth and the reason for the visit. Read the date of birth back and ask the caller to confirm it.",
"tools": null,
"collect": [
{"name": "full_name", "type": "string", "description": "Caller's full name", "required": true},
{"name": "dob", "type": "date", "description": "Date of birth", "required": true},
{"name": "reason", "type": "string", "description": "Reason for the visit", "required": true},
{"name": "new_patient", "type": "boolean", "description": "First visit to the practice", "required": false}
],
"transitions": [
{"to": "book", "when": "The caller has confirmed their details"}
]
},
{
"id": "book",
"name": "Book",
"instructions": "Offer the two earliest open slots from book_slot and book the one the caller picks. Confirm the date and time, then say goodbye and end the call.",
"tools": ["book_slot"],
"collect": [],
"transitions": []
}
]
}
}Przygotuj je za pomocą PATCH /v1/agents/{agent_id}, przetestuj w Rozmowie, a następnie wdroż.
Krok details nie może przekazać do rezerwacji, dopóki nie zostaną zebrane imię i nazwisko, data urodzenia
oraz powód wizyty; new_patient jest opcjonalne.
Przykład: gałąź z ograniczeniem wiekowym
Model może rozmawiać z każdym, ale kod decyduje, kto otrzyma rezerwację. Zbierz wiek, a następnie przekieruj na jego podstawie, zanim zostanie uwzględniony własny wybór modelu.
{
"id": "verify",
"name": "Verify age",
"instructions": "Ask for the caller's age.",
"tools": null,
"collect": [
{"name": "age", "type": "number", "description": "Caller's age in years", "required": true}
],
"transitions": [
{"to": "guardian", "condition": {"value": "age", "op": "lt", "target": 18}},
{"to": "book", "when": "The caller has given their age"}
]
}Rozmówca, który powie piętnaście, trafia do guardian, niezależnie od decyzji modelu.
Wszyscy pozostali trafiają do book. Oba są zwykłymi krokami w innym miejscu grafu.
Przykład: krok webhooka wyszukiwania konta
Rozmówca podaje numer konta, wyszukiwanie uruchamia się po wejściu do następnego kroku,
a jego wynik wybiera trasę. Kroki not_found, collections i support
pominięto dla zwięzłości.
[
{
"id": "identify",
"name": "Identify",
"instructions": "Ask for the caller's account number and read it back digit by digit.",
"tools": null,
"collect": [
{"name": "account_number", "type": "string", "description": "Account number", "required": true}
],
"transitions": [
{"to": "lookup", "when": "The caller has confirmed their account number"}
]
},
{
"id": "lookup",
"name": "Look up account",
"instructions": "Tell the caller what you found on their account and ask how you can help.",
"tools": ["lookup_account"],
"collect": [],
"on_enter_tool": "lookup_account",
"transitions": [
{"to": "not_found", "condition": {"value": "lookup_account_result.response.found", "op": "eq", "target": false}},
{"to": "collections", "condition": {"value": "lookup_account_result.response.account_status", "op": "in", "target": ["past_due", "suspended"]}},
{"to": "support", "when": "The caller needs help with an active account"}
]
}
]lookup_account otrzymuje account_number, ponieważ jego parametr ma taką
nazwę. Jeśli treść odpowiedzi zawiera "found": false, połączenie przechodzi do
not_found. Jeśli account_status ma wartość past_due lub suspended, przechodzi do
collections. Aktywne konto pozostaje w lookup, gdzie model pomaga, a następnie
przechodzi do support. Aby wysłać nieudane wyszukiwanie do osobnego kroku, najpierw dodaj
warunki dotyczące statusu: odpowiedź z błędem zapisuje kod statusu, więc
{"value": "lookup_account_result.status", "op": "gte", "target": 400}
ją przechwytuje, a przekroczenie limitu czasu lub brak odpowiedzi zapisuje "error", więc
{"value": "lookup_account_result.status", "op": "eq", "target": "error"}
przechwytuje ten przypadek.
Przykład: recepcja i rozliczenia
Dwóch agentów. Recepcja (agent 412) odbiera każde połączenie i przekazuje pytania
dotyczące rozliczeń do agenta rozliczeń (agent 413) z własnym promptem, narzędziami i głosem.
W recepcji:
{
"handoffs": [
{"agent_id": 413, "when": "The caller asks about a bill, a payment or a refund"}
]
}U agenta rozliczeń, aby mógł przekazać rozmówcę z powrotem:
{
"handoffs": [
{"agent_id": 412, "when": "The billing question is resolved and the caller needs something else"}
]
}Recepcja mówi krótkie zdanie, takie jak „Połączę Cię z naszym zespołem rozliczeń”, a agent rozliczeń przedstawia się i kontynuuje rozmowę od miejsca, w którym zakończyła ją recepcja. Gdy rozliczenia przekazują rozmowę z powrotem, recepcja wznawia ją od miejsca, w którym była, bez ponownego witania rozmówcy. Produkt połączenia, języki, komunikat o zgodzie i inne ustawienia połączenia pozostają przy recepcji, ponieważ to ona odebrała połączenie.
Jeśli rozliczenia potrzebują tylko własnych instrukcji, a nie własnego agenta, zamiast tego użyj globalnego kroku w recepcji. Gdy pytanie otrzyma odpowiedź, połączenie wraca do kroku, w którym znajdował się rozmówca:
{
"id": "billing",
"name": "Billing questions",
"instructions": "Answer questions about bills and payments. Offer to send a payment link by email.",
"tools": null,
"collect": [],
"transitions": [
{"to": "__previous__", "when": "The billing question is answered"}
],
"global_when": "The caller asks about a bill or payment at any point"
}Kolejne kroki
Twórz wspólne instrukcje i instrukcje kroków, które sprawdzają się w rozmowach telefonicznych.
Utwórz narzędzia wywoływane przez kroki i kroki webhooków.
Uruchom te same scenariusze dla każdej gałęzi przed wdrożeniem.
Każde pole agenta, wersja robocza i wdrożenie.