Open in
Agenttrin og overdragelser
Opdel en agent i trin med egne instruktioner, værktøjer og indsamlede værdier, og overdrag opkald mellem agenter midt i opkaldet.
En enkelt prompt giver modellen hele opgaven på én gang. Trin giver den én fase af opkaldet ad gangen: Hvert trin har sine egne instruktioner, sine egne værktøjer, en valgfri replik, der siges ordret, og værdier, den skal indsamle, før den går videre. Overdragelser lader en anden agent i din organisation overtage midt i opkaldet med transskriptionen intakt, så den, der ringer, aldrig skal gentage sig selv.
Hver agent starter som en enkelt prompt. Intet ved den ændrer sig, før du tilføjer trin eller overdragelser.
Trin eller en enkelt prompt?
| Brug trin, når | Behold en enkelt prompt, når |
|---|---|
| Opkaldet har faser, der skal ske i rækkefølge: verificer, og book derefter. | Samtalen er åben: FAQ, reception, generel support. |
| En værdi skal indsamles, før agenten går videre. | Intet skal indsamles i en fast rækkefølge. |
| En regel aldrig må fraviges, såsom "personer, der ringer og er under 18, sendes til en værge". | Modellens vurdering er god nok for alle grene. |
| Et opslag skal udføres på et bestemt tidspunkt i opkaldet. | Værktøjer kan kaldes, når den, der ringer, beder om det. |
| En del af opkaldet tilhører en anden agent med sin egen prompt og stemme. | Én persona håndterer alt. |
Trin er ikke et scriptsstyret telefontræ. Inden for et trin styrer modellen samtalen, som den gør med en enkelt prompt. Trinnet afgør, hvad den arbejder med, hvilke værktøjer den kan bruge, og hvad den har brug for, før den kan forlade det.
Sådan opbygges en agent med trin
Når en agent har trin, indeholder dens prompt de fælles instruktioner:
personaen og reglerne, der gælder i hvert trin. Hvert trin tilføjer sine egne
instruktioner ovenpå. Ved hver tur ser modellen de fælles instruktioner, det
aktuelle trins navn og instruktioner samt de værdier, der er indsamlet indtil videre.
I builderen skal du skifte agenten fra Enkelt prompt til Trin. Du får et kort pr. trin med navn, instruktioner, replik, værktøjer, indsamlede værdier og overgange, en vælger til overdragelser og en skrivebeskyttet flowgraf over trinnene. Når du skifter tilbage til en enkelt prompt, får du tilbudt en samlet prompt, der sammenfletter de fælles instruktioner og alle trin.
Over API'et er steps og handoffs felter på
agenten. Som alle agentfelter lægger en PATCH dem
i kladden; POST /v1/agents/{agent_id}/deploy gør dem aktive. Hvis du sender
"steps": null, skifter agenten tilbage til en enkelt prompt. Testopkald og
Tal kører kladden.
Trinfelter
| Felt | Betydning |
|---|---|
id | Påkrævet. Små bogstaver, cifre og understregninger, der starter med et bogstav, op til 40 tegn. Unik inden for agenten. |
name | Påkrævet vist navn, 1 til 80 tegn. |
instructions | Påkrævet, op til 20.000 tegn. Understøtter {{var}} opkaldsvariabler, ligesom prompt. |
say | Valgfri replik, der siges ordret, når trinnet åbnes, op til 1.000 tegn. Understøtter {{var}}. |
tools | null giver trinnet alle værktøjer, der er knyttet til agenten. En liste begrænser trinnet til disse værktøjer efter navn. Indbyggede handlinger som end_call og transfer_call følger agentens indstillinger i hvert trin. |
collect | Op til 20 værdier, som trinnet indsamler. Hver har et name, en type, en description og required (standard true). |
on_enter_tool | Valgfrit værktøjsnavn, der kaldes automatisk, når trinnet åbnes. Se Webhook-trin. |
transitions | Sorteret liste over, hvor trinnet kan gå hen næste gang. Se Overgange. |
global_when | Valgfrit. Gør trinnet tilgængeligt fra ethvert trin. Se Globale trin. |
voice | Valgfrit stemme-id for dette trin. Ignoreres, når agenten bruger en tilpasset stemmekonfiguration. |
Selve grafen er {"start_step": "<step id>", "steps": [...]}. Opkaldet
begynder i start_step.
Overgange
Hver overgang har to, et trin-id, og præcis én af følgende:
when: almindeligt sprog, og modellen afgør. Agenten får et indbyggetgo_to_step-værktøj med en liste over de trin, den kan gå til, hvor hverwhenangiver årsagen til at vælge det.condition: en regel for indsamlede værdier, og kode afgør. Modellen kan ikke springe den over eller tale sig uden om den."always": true: fortsæt uden kontrol. Kode afgør først: Så snart et trin åbnes, eller når dets obligatoriske værdier er indsamlet, vælges den første matchendecondition- elleralways-overgang, før modellen kan vælge enwhen. Placer derforalwaysefter betingelserne som deres reserve, eller alene for at kæde et trin direkte sammen med det næste. Et trin medalwaysventer aldrig på etwhen-valg.
En condition er {"value": <collected name or dotted path>, "op": <op>, "target": <literal>}:
op | Sand, når værdien |
|---|---|
eq, ne | er lig med eller ikke er lig med target |
lt, lte, gt, gte | er mindre end, højst, større end eller mindst target |
in, not_in | er eller ikke er en af værdierne på listen target |
exists, missing | er eller ikke er indsamlet (ingen target) |
eq, ne, in og not_in sammenligner tekst uden forskel på store og små
bogstaver efter fjernelse af mellemrum. Tal sammenlignes som tal og datoer som
YYYY-MM-DD-strenge. En værdi, der aldrig blev indsamlet, gør alle operatorer
falske undtagen missing.
Skriv when og global_when som en betingelse, for eksempel "Opkalderen vil
booke en aftale", ikke som noget, der skal siges. Agenten ser dem som interne
rutenoter og får besked på aldrig at læse dem op eller nævne, at den skifter
trin.
Når modellen kalder go_to_step:
- Alle
required-værdier i trinnet skal være til stede. Hvis en mangler, får modellen besked om hvilken, og spørger opkalderen efter den. - Værdierne gemmes.
condition- ogalways-overgange kontrolleres i rækkefølge. Det første match vælges.- Ellers flytter agenten til det trin, modellen valgte.
- Hvis intet matcher, og modellen ikke angav noget trin, bliver agenten, hvor den er.
Et hop til et globalt trin er undtagelsen: Opkalderen har skiftet emne, så det gennemføres, selv når det aktuelle trin stadig mangler obligatoriske værdier, og før det trins betingelser kontrolleres.
condition- og always-overgange kontrolleres også, hver gang et trin åbnes,
så en række kodeafgjorte trin afvikles i et forløb. Kæden stopper:
- ved et trin, den allerede har besøgt i dette forløb;
- efter 8 hop;
- ved et trin, der stadig har obligatoriske værdier at indsamle, medmindre
trinnet har et
on_enter_tool(et webhook-trin ruter altid ud fra sit resultat).
Kun say-linjen i det trin, hvor kæden stopper, bliver sagt.
Et trin uden overgange er afsluttende. Agenten afslutter der og afslutter eller viderestiller opkaldet med sine normale indbyggede handlinger.
Indsamling af værdier
Angiv, hvad et trin skal bruge, i collect. Modellen sender værdierne, når den
kalder go_to_step, og de forbliver tilgængelige resten af opkaldet.
type | Indeholder |
|---|---|
string | Vilkårlig tekst |
number | Et tal |
boolean | true eller false |
date | En dato som YYYY-MM-DD |
Indsamlede værdier er opkaldsindhold. De vises på opkaldet ved siden af transskriptionen og følger de samme regler for opbevaring, sletning og redigering. Når agentens opkaldsoptagelse er slået fra, gemmes indsamlede værdier hverken eller sendes i webhooks; tidslinjen for trinnet vises stadig. Se Hvor du kan se det på et opkald.
Say-linjer
say siges præcis som skrevet, når agenten går ind i trinnet. Modellen fortsætter
derefter i det nye trin i samme svar og ved, at linjen lige er blevet sagt, så den
gentager den ikke. Brug say til hilsner, påkrævede oplysninger og faste
formuleringer, og lad modellen håndtere resten af svaret.
Starttrinnets say er agentens indledende linje, når den taler først, efter
eventuelle samtykkemeddelelser. Når opkalderen taler først, indleder den agentens
første svar til en person, aldrig til et IVR-system eller en telefonsvarers hilsen.
Et trins say siges ikke igen, når opkaldet vender tilbage til det via
__previous__ eller en tilbageoverdragelse. Skriv det, som det skal lyde: stav
alt, som stemmen kan mislæse. Say-linjer understøtter opkaldsvariabler som
{{var}}, men ikke indsamlede værdier.
Webhook-trin
Angiv on_enter_tool til et af agentens værktøjer, så kører det, så snart
trinnet åbnes, uden at vente på modellen. Dets argumenter er de indsamlede
værdier, hvis navne matcher værktøjets parameternavne. Resultatet gemmes som en
indsamlet værdi med navnet <tool>_result, afkortet til 4 KB, og trinnets
condition- og always-overgange kontrolleres med det samme, så opslaget kan
rute opkaldet baseret på sit eget resultat.
Den gemte værdi har to felter:
| Felt | Indeholder |
|---|---|
status | HTTP-statuskoden, som dit endpoint returnerede. |
response | Svarteksten. |
Rut på et felt i svarteksten med lookup_account_result.response.<field> og på
statuskoden med lookup_account_result.status.
Opslaget kører i op til 8 sekunder eller værktøjets egen timeout, hvis den er kortere. Hvis det tager længere end 3 sekunder, siger agenten en kort linje, så opkalderen ikke efterlades i stilhed. Hvis dit endpoint returnerer en statuskode på 400 eller højere eller ikke svarer i tide, fortæller agenten opkalderen, at den ikke kunne kontrollere det lige nu, og fortsætter med det, den kan gøre.
Globale trin
Et trin med global_when kan nås fra ethvert trin, når den pågældende
beskrivelse gælder. Modellen afgør det, som med when. Brug det til emner, en
opkalder kan bringe op når som helst: spørgsmål om fakturering, en anmodning om
et menneske, en klage.
En overgang med "to": "__previous__" i et globalt trin returnerer opkaldet til
det trin, der var aktivt før det, så opkalderen fortsætter, hvor vedkommende slap.
Trinnet genoptages: dets on_enter_tool kører ikke igen, dets say gentages
ikke, og agenten fortsætter det uden at starte forfra.
Overdragelser
handoffs viser andre agenter i din organisation, som kan overtage opkaldet:
[{"agent_id": 413, "when": "The caller asks about billing or a refund"}]Agenten får et indbygget hand_off-værktøj med disse agenter og begrundelser. Ligesom ved overgange er hver when en intern routingnote, som aldrig læses op.
Når agenten viderestiller, siger den én kort linje, der fortæller opkalderen, hvor de bliver stillet om til, såsom "Selvfølgelig, jeg stiller dig om til vores faktureringsteam", med sin egen stemme. Derefter overtager målagentens prompt, trin, værktøjer og stemme, og opkaldet fortsætter med samme transskription. Den nye agent præsenterer sig kort og besvarer opkalderens seneste anmodning; den annoncerer ikke en viderestilling. Målagentens vidensbase er derefter tilgængelig.
Første gang et opkald når en agent, starter det i agentens start_step: trinnets on_enter_tool kører, og dets say bliver sagt. Når opkaldet viderestilles tilbage til en agent, det allerede har besøgt, genoptager agenten det trin, den var på, uden at køre on_enter_tool, gentage sit say eller præsentere sig selv igen. Indsamlede værdier deles af alle agenter på opkaldet.
- En målagent skal være en agent i samme organisation, og en agent kan ikke viderestille til sig selv.
- Alt på opkaldsniveau forbliver hos agenten, der besvarede opkaldet: produkt, sprog, hvem der taler først, voicemail, samtykkeerklæring og alle andre opkaldsindstillinger.
- Målagenter kan viderestille yderligere og tilbage. Ét opkald kan nå op til 8 agenter.
- Et testopkald kører kladden af den agent, du tester. De agenter, den viderestiller til, kører deres implementerede versioner.
- Hvis to agenter har et værktøj med samme navn og forskellige definitioner, beholdes kun ét til opkaldet, og den besvarende agents værktøj vinder altid. Konfiguratoren advarer dig, når du gemmer.
- En agent kan have overdragelser uden trin. Hele dens prompt bruges som den er.
go_to_step og hand_off er reserveret på agenter med trin eller overdragelser, så dine egne værktøjer kan ikke bruge disse navne.
Hvor du kan se det på et opkald
Åbn opkaldet i Opkaldshistorik. En trintidslinje ved siden af transskriptionen viser hvert trin, opkaldet gik ind i, og hvorfor, og de indsamlede værdier vises sammen med den.
Opkaldsobjektet og webhooken for fuldførte opkald (telephony.complete / web.complete) indeholder de samme data som steps_trace og collected_values. Begge mangler på opkald uden trin.
"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 er a efterfulgt af agent-id'et. via angiver, hvad der flyttede opkaldet:
via | Betydning |
|---|---|
start | Opkaldet begyndte i dette trin. |
model | Modellen valgte trinnet via go_to_step, en when eller en global_when. |
condition | En condition- eller always-overgang matchede. |
on_enter | En overgang matchede resultatet fra et webhook-trin. |
handoff | En anden agent overtog. |
Hvor trin kører
Trin kører indbygget på Spark, Bolt og alle Storm-produkter ved indgående, udgående og kampagneopkald, testopkald samt web- og widgetopkald.
Overalt ellers fungerer agenten stadig, blot uden strukturen: den kører en flad prompt, der samler de delte instruktioner og alle trin i rækkefølge. Det omfatter:
- de eksperimentelle Bolt-produkter;
- Realtime-sessioner, herunder sessioner for en gemt agent;
- indlejrede konfigurationer returneret af en webhook for dynamisk opkaldskonfiguration. En webhook, der returnerer et
agent_id, bruger den pågældende agents trin.
Begrænsninger
| Begrænsning | Værdi |
|---|---|
| Trin pr. agent | 100 |
| Indsamlede værdier pr. trin | 20 |
| Overleveringsmål pr. agent | 8 |
| Agenter, der kan nås i ét opkald | 8 |
Størrelse på steps-JSON | 200 KB |
Trin-instructions | 20.000 tegn |
say-linje | 1.000 tegn |
Gemt on_enter_tool-resultat | 4 KB |
En gemning, der bryder en regel, returnerer 400 med stien til det ugyldige felt,
f.eks. steps.steps[2].transitions[0].to. Værktøjsnavne i tools og
on_enter_tool skal være værktøjer, der er knyttet til agenten.
Sprog pr. trin, scriptede trin, der springer modellen over, og indsamlede værdier i say-linjer understøttes ikke.
Importerede agenter
Import fra Retell, Bland, Vapi eller ElevenLabs overfører agenter med flere prompter, flows, pathways og workflows som trin, og squads og agentoverførsler som overleveringer mellem de importerede agenter. Gennemgangssiden viser begge dele, før du importerer.
Eksempel: patientregistrering hos tandlægen
Tre trin i rækkefølge: hilsen, indsamling af patientoplysninger, booking.
{
"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": []
}
]
}
}Klargør den med PATCH /v1/agents/{agent_id}, prøv den med Tal, og implementer den derefter.
Trinnet details kan ikke overlevere til booking, før navn, fødselsdato
og årsag er indsamlet. new_patient er valgfri.
Eksempel: en gren med aldersgrænse
Modellen kan tale med alle, men kode afgør, hvem der får en booking. Indsaml alderen, og diriger derefter ud fra den, før modellens eget valg tages i betragtning.
{
"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"}
]
}En opkalder, der siger femten, går til guardian, uanset hvad modellen beslutter.
Alle andre går til book. Begge er almindelige trin andre steder i grafen.
Eksempel: webhook-trin til kontoopslag
Den, der ringer, oplyser et kontonummer, opslaget køres ved indgang til næste trin,
og resultatet vælger ruten. Trinene not_found, collections og support
er udeladt for korthedens skyld.
[
{
"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 modtager account_number, fordi parameteren har det
navn. Hvis svarbrødteksten indeholder "found": false, går opkaldet til
not_found. Hvis dets account_status er past_due eller suspended, går det til
collections. En aktiv konto forbliver i lookup, hvor modellen hjælper og
fortsætter til support. Hvis du vil sende et mislykket opslag til et særskilt trin, skal du først tilføje
betingelser for status: et fejlsvar gemmer sin statuskode, så
{"value": "lookup_account_result.status", "op": "gte", "target": 400}
opfanger det, og en timeout eller intet svar gemmer "error", så
{"value": "lookup_account_result.status", "op": "eq", "target": "error"}
opfanger det.
Eksempel: fra reception til fakturering
To agenter. Receptionen (agent 412) besvarer alle opkald og viderestiller fakturerings-
spørgsmål til en faktureringsagent (agent 413) med sin egen prompt, værktøjer og stemme.
På receptionen:
{
"handoffs": [
{"agent_id": 413, "when": "The caller asks about a bill, a payment or a refund"}
]
}På faktureringsagenten, så den kan viderestille den, der ringer, tilbage:
{
"handoffs": [
{"agent_id": 412, "when": "The billing question is resolved and the caller needs something else"}
]
}Receptionen siger en kort sætning som "Lad mig stille dig videre til vores fakturerings- team", og faktureringsagenten præsenterer sig selv og fortsætter samtalen der, hvor receptionen slap. Når fakturering viderestiller tilbage, fortsætter receptionen der, hvor den var, uden at hilse på den, der ringer, igen. Opkaldets produkt, sprog, samtykkemeddelelse og andre opkaldsindstillinger forbliver hos receptionen, fordi den besvarede opkaldet.
Hvis fakturering kun har brug for sine egne instruktioner og ikke sin egen agent, skal du i stedet bruge et globalt trin på receptionen. Når spørgsmålet er besvaret, går opkaldet tilbage til det trin, den der ringer, var i:
{
"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"
}Næste trin
Skriv fælles instruktioner og trininstruktioner, der fungerer i telefonen.
Opret de værktøjer, som dine trin og webhooktrin kalder.
Kør de samme scenarier mod hver gren, før du implementerer.
Alle agentfelter, kladder og implementering.