ThunderPhone 2.0 jest już dostępny.Uruchom samodzielnie, od 2¢/min.Przeczytaj komunikat

Using the dashboard

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, gdyZachowaj 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

PoleZnaczenie
idWymagane. Małe litery, cyfry i podkreślenia, zaczynające się od litery, maksymalnie 40 znaków. Unikalne w obrębie agenta.
nameWymagana nazwa wyświetlana, od 1 do 80 znaków.
instructionsWymagane, maksymalnie 20 000 znaków. Obsługuje zmienne połączenia {{var}}, tak jak prompt.
sayOpcjonalna kwestia wypowiadana słowo w słowo po wejściu do kroku, maksymalnie 1 000 znaków. Obsługuje {{var}}.
toolsnull 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.
collectMaksymalnie 20 wartości zbieranych przez krok. Każda ma name, type, description i required (domyślnie true).
on_enter_toolOpcjonalna nazwa narzędzia, wywoływanego automatycznie po wejściu do kroku. Zobacz Kroki webhooka.
transitionsUporządkowana lista miejsc, do których krok może przejść dalej. Zobacz Przejścia.
global_whenOpcjonalne. Umożliwia osiągnięcie kroku z dowolnego kroku. Zobacz Kroki globalne.
voiceOpcjonalny 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ędzie go_to_step z listą kroków, do których może przejść, przy czym każde when stanowi 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ście condition albo always zostaje wybrane, zanim model może wybrać when. Dlatego umieść always po warunkach jako opcję zapasową albo użyj go samodzielnie, aby połączyć krok bezpośrednio z następnym. Krok z always nigdy nie czeka na wybór when.

condition ma postać {"value": <collected name or dotted path>, "op": <op>, "target": <literal>}:

opPrawda, gdy wartość
eq, nejest równa albo nie jest równa target
lt, lte, gt, gtejest mniejsza niż, nie większa niż, większa niż albo co najmniej równa target
in, not_injest albo nie jest jedną z wartości na liście target
exists, missingzostał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:

  1. Każda wartość required w kroku musi być obecna. Jeśli którejś brakuje, model otrzymuje informację, której, i pyta o nią rozmówcę.
  2. Wartości są zapisywane.
  3. Przejścia condition i always są sprawdzane po kolei. Pierwsze pasujące zostaje wybrane.
  4. W przeciwnym razie agent przechodzi do kroku wybranego przez model.
  5. 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.

typePrzechowuje
stringDowolny tekst
numberLiczbę
booleantrue albo false
dateDatę 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:

PoleZawiera
statusKod stanu HTTP zwrócony przez punkt końcowy.
responseTreść 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:

viaZnaczenie
startPołączenie rozpoczęło się w tym kroku.
modelModel wybrał krok za pomocą go_to_step, when lub global_when.
conditionDopasowano przejście condition lub always.
on_enterDopasowano przejście na podstawie wyniku kroku webhooka.
handoffInny 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:

Limity

LimitWartość
Kroki na agenta100
Zebrane wartości na krok20
Cele przekazania na agenta8
Agenci osiągalni w jednym połączeniu8
Rozmiar JSON steps200 KB
instructions kroku20 000 znaków
Linia say1 000 znaków
Zapisany wynik on_enter_tool4 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