ThunderPhone 2.0 je tu.Začnite sami, už od 2 ¢/min.Prečítať oznámenie

Using the dashboard

Kroky agenta a odovzdávanie hovorov

Rozdeľte agenta na kroky s vlastnými pokynmi, nástrojmi a zhromaždenými hodnotami a počas hovoru odovzdávajte hovory medzi agentmi.

Jedna výzva dáva modelu celú úlohu naraz. Kroky mu dávajú vždy jednu fázu hovoru: každý krok má vlastné pokyny, vlastné nástroje, voliteľnú vetu vyslovenú doslova a hodnoty, ktoré musí zhromaždiť pred pokračovaním. Odovzdania umožňujú, aby počas hovoru prevzal konverzáciu iný agent vo vašej organizácii so zachovaným prepisom, takže volajúci nikdy nemusí nič opakovať.

Každý agent začína ako jedna výzva. Nič sa na tom nezmení, kým nepridáte kroky alebo odovzdania.

Kroky alebo jedna výzva?

Použite kroky, keďPonechajte jednu výzvu, keď
Hovor má fázy, ktoré musia prebehnúť v poradí: najprv overenie, potom rezervácia.Konverzácia je otvorená: časté otázky, recepcia, všeobecná podpora.
Pred pokračovaním agenta sa musí zachytiť hodnota.Nič sa nemusí zhromažďovať v pevnom poradí.
Pravidlo sa nesmie nikdy porušiť, napríklad „volajúci mladší ako 18 rokov sa presmerujú na zákonného zástupcu“.Úsudok modelu je dostatočný pre každú vetvu.
Vyhľadanie sa musí vykonať v pevne určenom bode hovoru.Nástroje možno volať vždy, keď o to volajúci požiada.
Časť hovoru patrí inému agentovi s vlastnou výzvou a hlasom.Jedna persona zvládne všetko.

Kroky nie sú skriptovaný telefónny strom. V rámci kroku model vedie konverzáciu rovnako ako pri jednej výzve. Krok určuje, na čom pracuje, ktoré nástroje môže používať a čo potrebuje pred tým, než ho môže opustiť.

Ako sa vytvára agent s krokmi

Keď má agent kroky, jeho prompt obsahuje spoločné pokyny: personu a pravidlá, ktoré platia v každom kroku. Každý krok k nim pridáva vlastné pokyny. Pri každom ťahu model vidí spoločné pokyny, názov a pokyny aktuálneho kroku a doteraz zhromaždené hodnoty.

V nástroji na vytváranie prepnite agenta z Jedna výzva na Kroky. Získate kartu pre každý krok s jeho názvom, pokynmi, vetou na vyslovenie, nástrojmi, zhromaždenými hodnotami a prechodmi, výberom odovzdaní a grafom krokov iba na čítanie. Prepnutie späť na jednu výzvu ponúkne zlúčenú výzvu, ktorá spája spoločné pokyny a všetky kroky.

Cez API sú steps a handoffs polia objektu agent. Rovnako ako každé pole agenta, PATCH ich uloží do konceptu; POST /v1/agents/{agent_id}/deploy ich aktivuje. Odoslanie "steps": null prepne agenta späť na jednu výzvu. Testovacie hovory a Hovoriť používajú koncept.

Polia kroku

PoleVýznam
idPovinné. Malé písmená, číslice a podčiarkovníky, začína písmenom, maximálne 40 znakov. Jedinečné v rámci agenta.
namePovinný zobrazovaný názov, 1 až 80 znakov.
instructionsPovinné, maximálne 20 000 znakov. Podporuje premenné hovoru {{var}}, rovnako ako prompt.
sayVoliteľná veta vyslovená doslova pri vstupe do kroku, maximálne 1 000 znakov. Podporuje {{var}}.
toolsnull poskytne kroku každý nástroj pripojený k agentovi. Zoznam obmedzí krok na tieto nástroje podľa názvu. Vstavané akcie, ako napríklad end_call a transfer_call, sa v každom kroku riadia nastaveniami agenta.
collectAž 20 hodnôt, ktoré krok zhromažďuje. Každá má name, type, description a required (predvolene true).
on_enter_toolVoliteľný názov nástroja, ktorý sa automaticky zavolá pri vstupe do kroku. Pozrite si časť Kroky webhookov.
transitionsZoradený zoznam miest, kam môže krok pokračovať. Pozrite si časť Prechody.
global_whenVoliteľné. Umožní dosiahnuť krok z ľubovoľného kroku. Pozrite si časť Globálne kroky.
voiceVoliteľné ID hlasu pre tento krok. Ignoruje sa, keď agent používa vlastnú konfiguráciu hlasu.

Samotný graf je {"start_step": "<step id>", "steps": [...]}. Hovor sa začína v start_step.

Prechody

Každý prechod má to, ID kroku a presne jednu z týchto možností:

  • when: prirodzený jazyk a model rozhoduje. Agent má vstavaný nástroj go_to_step, ktorý uvádza kroky, do ktorých sa môže presunúť, pričom každé when predstavuje dôvod na jeho výber.
  • condition: pravidlo pre zhromaždené hodnoty a kód rozhoduje. Model ho nemôže preskočiť ani sa mu vyhnúť rozhovorom.
  • "always": true: pokračovať bez kontroly. Kód rozhoduje ako prvý: hneď po vstupe do kroku alebo po zhromaždení jeho povinných hodnôt zvíťazí prvý zodpovedajúci prechod condition alebo always, skôr než model môže vybrať when. Preto umiestnite always za podmienky ako ich záložnú možnosť alebo samostatne na priame prepojenie kroku s nasledujúcim krokom. Krok s always nikdy nečaká na voľbu when.

condition má tvar {"value": <collected name or dotted path>, "op": <op>, "target": <literal>}:

opPlatí, keď hodnota
eq, nesa rovná alebo nerovná target
lt, lte, gt, gteje menšia než, najviac, väčšia než alebo najmenej target
in, not_inje alebo nie je jednou z hodnôt v zozname target
exists, missingbola alebo nebola zhromaždená (bez target)

eq, ne, in a not_in porovnávajú text bez rozlišovania veľkosti písmen po odstránení medzier. Čísla sa porovnávajú ako čísla a dátumy ako reťazce YYYY-MM-DD. Hodnota, ktorá nikdy nebola zhromaždená, spôsobí, že každý op je nepravdivý okrem missing.

Píšte when a global_when ako podmienku, napríklad „Volajúci chce rezervovať termín“, nie ako niečo, čo má agent povedať. Agent ich vidí ako interné poznámky k smerovaniu a je mu nariadené, aby ich nikdy nečítal nahlas ani nespomínal, že mení kroky.

Keď model zavolá go_to_step:

  1. Musí byť prítomná každá hodnota required v kroku. Ak niektorá chýba, model dostane informáciu, ktorá to je, a požiada o ňu volajúceho.
  2. Hodnoty sa uložia.
  3. Prechody condition a always sa kontrolujú v poradí. Zvíťazí prvá zhoda.
  4. V opačnom prípade sa agent presunie do kroku, ktorý vybral model.
  5. Ak sa nič nezhoduje a model neuviedol žiadny krok, agent zostane tam, kde je.

Skok do globálneho kroku je výnimkou: volajúci zmenil tému, takže sa vykoná aj vtedy, keď v aktuálnom kroku stále chýbajú povinné hodnoty, a pred kontrolou podmienok daného kroku.

Prechody condition a always sa kontrolujú aj pri každom vstupe do kroku, takže séria krokov, o ktorých rozhoduje kód, prebehne naraz. Reťazec sa zastaví:

  • pri kroku, ktorý už počas tohto behu navštívil;
  • po 8 presunoch;
  • pri kroku, ktorý ešte má povinné hodnoty na zhromaždenie, pokiaľ krok nemá on_enter_tool (krok webhooku sa vždy smeruje podľa svojho výsledku).

Vysloví sa iba riadok say kroku, v ktorom sa reťazec zastaví.

Krok bez prechodov je koncový. Agent sa tam dokončí a ukončí alebo presmeruje hovor svojimi bežnými vstavanými akciami.

Zhromažďovanie hodnôt

Uveďte, čo krok potrebuje, v collect. Model odovzdá hodnoty pri volaní go_to_step a zostanú dostupné po zvyšok hovoru.

typeObsahuje
stringĽubovoľný text
numberČíslo
booleantrue alebo false
dateDátum vo formáte YYYY-MM-DD

Zhromaždené hodnoty sú obsahom hovoru. Zobrazujú sa pri hovore vedľa prepisu a platia pre ne rovnaké pravidlá uchovávania, odstránenia a redakcie. Keď je nahrávanie hovoru agenta vypnuté, zhromaždené hodnoty sa ani neukladajú, ani neodosielajú vo webhookoch; časová os krokov zostáva zachovaná. Pozrite si časť Kde to vidieť pri hovore.

Riadky say

say sa vysloví presne tak, ako je napísané, keď agent vstúpi do kroku. Model potom v rovnakej odpovedi pokračuje v novom kroku a vie, že riadok bol práve vyslovený, takže ho neopakuje. Použite say pre pozdravy, povinné oznámenia a pevne dané znenie a zvyšok odpovede nechajte na modeli.

say v úvodnom kroku je úvodná veta agenta, keď hovorí ako prvý, po akomkoľvek oznámení o súhlase. Keď hovorí ako prvý volajúci, otvorí prvú odpoveď agenta osobe, nikdy nie IVR alebo uvítaniu hlasovej schránky.

say kroku sa znovu nevysloví, keď sa hovor doň vráti cez __previous__ alebo odovzdanie späť. Napíšte ho tak, ako má znieť: vypíšte všetko, čo by hlas mohol nesprávne prečítať. Riadky say podporujú premenné hovoru {{var}}, nie však zhromaždené hodnoty.

Kroky webhooku

Nastavte on_enter_tool na jeden z nástrojov agenta a spustí sa hneď po vstupe do kroku bez čakania na model. Jeho argumentmi sú zhromaždené hodnoty, ktorých názvy zodpovedajú názvom parametrov nástroja. Výsledok sa uloží ako zhromaždená hodnota s názvom <tool>_result, skrátená na 4 KB, a prechody condition a always kroku sa okamžite skontrolujú, takže vyhľadávanie môže hovor smerovať podľa vlastného výsledku.

Uložená hodnota má dve polia:

PoleObsahuje
statusStavový kód HTTP, ktorý vrátil váš endpoint.
responseTelo odpovede.

Smerujte podľa poľa tela pomocou lookup_account_result.response.<field> a podľa stavového kódu pomocou lookup_account_result.status.

Vyhľadávanie beží maximálne 8 sekúnd alebo do vlastného časového limitu nástroja, ak je kratší. Ak trvá dlhšie ako 3 sekundy, agent povie krátku vetu, aby volajúci neostal v tichu. Ak váš endpoint vráti stavový kód 400 alebo vyšší, alebo neodpovie včas, agent volajúcemu povie, že to práve teraz nemohol overiť, a pokračuje v tom, čo môže urobiť.

Globálne kroky

Krok s global_when je dostupný z ľubovoľného kroku vždy, keď daný opis platí. Model rozhoduje rovnako ako pri when. Použite ho pre témy, ktoré môže volajúci otvoriť kedykoľvek: otázky týkajúce sa fakturácie, žiadosť o človeka, sťažnosť.

Prechod s "to": "__previous__" v globálnom kroku vráti hovor do kroku, ktorý bol aktívny pred ním, takže volajúci pokračuje tam, kde skončil. Krok sa obnoví: jeho on_enter_tool sa znovu nespustí, jeho say sa neopakuje a agent v ňom pokračuje bez začatia odznova.

Odovzdania

handoffs uvádza ďalších agentov vo vašej organizácii, ktorí môžu prevziať hovor:

[{"agent_id": 413, "when": "The caller asks about billing or a refund"}]

Agent dostane vstavaný nástroj hand_off s týmito agentmi a dôvodmi. Rovnako ako pri prechodoch je každé when internou poznámkou na smerovanie, ktorá sa nikdy neprečíta nahlas.

Keď agent hovor odovzdá, jednou krátkou vetou volajúcemu povie, kam bude presmerovaný, napríklad „Samozrejme, prepojím vás na naše fakturačné oddelenie“, svojím vlastným hlasom. Potom prevezme prompt, kroky, nástroje a hlas cieľového agenta a hovor pokračuje s rovnakým prepisom. Nový agent sa stručne predstaví a odpovie na poslednú požiadavku volajúceho; neoznamuje presmerovanie. Vedomostná báza cieľového agenta je od tej chvíle k dispozícii.

Keď hovor prvýkrát dosiahne agenta, začne v jeho start_step: spustí sa on_enter_tool kroku a vysloví sa jeho say. Keď je hovor odovzdaný späť agentovi, ktorého už navštívil, tento agent pokračuje v kroku, v ktorom bol, bez spustenia on_enter_tool, opakovania jeho say alebo opätovného predstavenia sa. Zhromaždené hodnoty zdieľajú všetci agenti v hovore.

  • Cieľ musí byť agent v rovnakej organizácii a agent nemôže odovzdať hovor sám sebe.
  • Všetko na úrovni hovoru zostáva pri agentovi, ktorý hovor prijal: produkt, jazyky, kto hovorí prvý, hlasová schránka, oznámenie o súhlase a každé ďalšie nastavenie hovoru.
  • Ciele môžu hovor odovzdať ďalej aj späť. Jeden hovor môže dosiahnuť až 8 agentov.
  • Testovací hovor spúšťa koncept agenta, ktorého testujete. Agenti, ktorým hovor odovzdá, spúšťajú svoje nasadené verzie.
  • Ak majú dvaja agenti nástroj s rovnakým názvom a odlišnými definíciami, pre hovor sa zachová iba jeden a vždy má prednosť agent, ktorý hovor prijal. Tvorca vás upozorní pri ukladaní.
  • Agent môže mať odovzdania aj bez krokov. Použije sa celý jeho prompt bez úprav.

go_to_step a hand_off sú vyhradené pre agentov s krokmi alebo odovzdaniami, preto vaše vlastné nástroje nemôžu používať tieto názvy.

Kde to vidieť v hovore

Otvorte hovor v Histórii hovorov. Časová os krokov vedľa prepisu zobrazuje každý krok, do ktorého hovor vstúpil, a dôvod, pričom spolu s nimi sú uvedené aj zhromaždené hodnoty.

Objekt hovoru a webhook po dokončení hovoru (telephony.complete / web.complete) nesú rovnaké údaje ako steps_trace a collected_values. Pri hovoroch bez krokov chýbajú oba.

"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 je a, za ktorým nasleduje identifikátor agenta. via uvádza, čo presunulo hovor:

viaVýznam
startHovor začal v tomto kroku.
modelModel vybral krok prostredníctvom go_to_step, when alebo global_when.
conditionZhodol sa prechod condition alebo always.
on_enterPrechod sa zhodol s výsledkom kroku webhooku.
handoffHovor prevzal iný agent.

Kde sa kroky spúšťajú

Kroky sa natívne spúšťajú v produktoch Spark, Bolt a všetkých produktoch Storm, pri prichádzajúcich, odchádzajúcich a kampanových hovoroch, testovacích hovoroch, ako aj webových hovoroch a hovoroch z widgetov.

Všade inde agent stále funguje, iba bez štruktúry: spúšťa zlúčený prompt, ktorý v poradí spája zdieľané pokyny a každý krok. To zahŕňa:

  • experimentálne produkty Bolt;
  • relácie Realtime vrátane relácií pre uloženého agenta;
  • vložené konfigurácie vrátené webhookom dynamickej konfigurácie hovoru. Webhook, ktorý vráti agent_id, použije kroky daného agenta.

Limity

LimitHodnota
Kroky na agenta100
Zhromaždené hodnoty na krok20
Ciele odovzdania na agenta8
Agenti dostupní v rámci jedného hovoru8
Veľkosť JSON steps200 KB
instructions kroku20 000 znakov
Riadok say1 000 znakov
Uložený výsledok on_enter_tool4 KB

Uloženie, ktoré poruší pravidlo, vráti 400 s cestou k chybnému poľu, napríklad steps.steps[2].transitions[0].to. Názvy nástrojov v tools a on_enter_tool musia byť nástroje pripojené k agentovi.

Jazyky pre jednotlivé kroky, skriptované kroky, ktoré preskakujú model, a zhromaždené hodnoty v riadkoch say nie sú podporované.

Importovaní agenti

Import z Retell, Bland, Vapi alebo ElevenLabs prevedie agentov s viacerými promptmi, toky, cesty a pracovné postupy na kroky a skupiny a presmerovania agentov na odovzdania medzi importovanými agentmi. Stránka kontroly zobrazí oboje pred importom.

Príklad: príjem pacientov v zubnej ambulancii

Tri kroky v poradí: privítanie, získanie údajov pacienta, rezervácia.

{
  "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": []
      }
    ]
  }
}

Pripravte ho pomocou PATCH /v1/agents/{agent_id}, vyskúšajte ho cez Hovor a potom ho nasaďte. Krok details nemôže odovzdať na rezerváciu, kým nie sú zhromaždené meno, dátum narodenia a dôvod; new_patient je voliteľný.

Príklad: vetva podmienená vekom

Model môže hovoriť s kýmkoľvek, ale kód rozhoduje, komu sa zarezervuje termín. Získajte vek a potom podľa neho smerujte skôr, než sa zohľadní vlastná voľba 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"}
  ]
}

Volajúci, ktorý povie pätnásť, prejde do guardian bez ohľadu na to, čo rozhodne model. Všetci ostatní prejdú do book. Obe sú bežné kroky na inom mieste v grafe.

Príklad: krok webhooku na vyhľadanie účtu

Volajúci uvedie číslo účtu, vyhľadanie sa spustí pri prechode do ďalšieho kroku a jeho výsledok vyberie trasu. Kroky not_found, collections a support sú kvôli stručnosti vynechané.

[
  {
    "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 prijíma account_number, pretože jeho parameter má tento názov. Ak telo odpovede obsahuje "found": false, hovor prejde do not_found. Ak je jeho account_status past_due alebo suspended, prejde do collections. Aktívny účet zostáva v lookup, kde model pomôže a následne prejde do support. Ak chcete neúspešné vyhľadanie odoslať do vlastného kroku, najprv pridajte podmienky pre stav: odpoveď s chybou uloží svoj stavový kód, takže {"value": "lookup_account_result.status", "op": "gte", "target": 400} ju zachytí, a časový limit alebo žiadna odpoveď uloží "error", takže {"value": "lookup_account_result.status", "op": "eq", "target": "error"} zachytí tento prípad.

Príklad: recepcia a fakturácia

Dvaja agenti. Recepcia (agent 412) prijíma každý hovor a otázky týkajúce sa fakturácie odovzdáva agentovi fakturácie (agent 413) s vlastnou výzvou, nástrojmi a hlasom.

Na recepcii:

{
  "handoffs": [
    {"agent_id": 413, "when": "The caller asks about a bill, a payment or a refund"}
  ]
}

U agenta fakturácie, aby mohol volajúceho odovzdať späť:

{
  "handoffs": [
    {"agent_id": 412, "when": "The billing question is resolved and the caller needs something else"}
  ]
}

Recepcia povie krátku vetu, napríklad „Spojím vás s naším tímom fakturácie“, a agent fakturácie sa predstaví a pokračuje v konverzácii tam, kde ju recepcia ukončila. Keď fakturácia odovzdá hovor späť, recepcia pokračuje tam, kde bola, bez opätovného pozdravu volajúceho. Produkt hovoru, jazyky, oznámenie o súhlase a ďalšie nastavenia hovoru zostávajú na recepcii, pretože hovor prijala ona.

Ak fakturácia potrebuje iba vlastné pokyny, nie vlastného agenta, použite namiesto toho globálny krok na recepcii. Keď je otázka zodpovedaná, hovor sa vráti do kroku, v ktorom sa volajúci nachádzal:

{
  "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"
}

Ďalšie kroky