Το ThunderPhone 2.0 είναι εδώ.Ξεκινήστε μόνοι σας, από 2¢/λεπτό.Διαβάστε την ανακοίνωση

Using the dashboard

Βήματα και μεταβιβάσεις πρακτόρων

Χωρίστε έναν πράκτορα σε βήματα με τις δικές τους οδηγίες, εργαλεία και συλλεγμένες τιμές και μεταβιβάστε κλήσεις μεταξύ πρακτόρων κατά τη διάρκειά τους.

Ένα μόνο prompt δίνει στο μοντέλο ολόκληρη την εργασία ταυτόχρονα. Τα Βήματα του δίνουν μία φάση της κλήσης κάθε φορά: κάθε βήμα έχει τις δικές του οδηγίες, τα δικά του εργαλεία, μια προαιρετική ατάκα που εκφωνείται λέξη προς λέξη και τιμές που πρέπει να συλλέξει πριν προχωρήσει. Οι Παραδόσεις επιτρέπουν σε άλλον πράκτορα του οργανισμού σας να αναλάβει κατά τη διάρκεια της κλήσης, με το ιστορικό της συνομιλίας ανέπαφο, ώστε ο καλών να μη χρειάζεται ποτέ να επαναλαμβάνεται.

Κάθε πράκτορας ξεκινά ως ένα μόνο prompt. Τίποτα σε αυτό δεν αλλάζει μέχρι να προσθέσετε βήματα ή παραδόσεις.

Βήματα ή ένα μόνο prompt;

Χρησιμοποιήστε βήματα ότανΔιατηρήστε ένα μόνο prompt όταν
Η κλήση έχει φάσεις που πρέπει να γίνουν με σειρά: επαλήθευση και έπειτα κράτηση.Η συνομιλία είναι ανοιχτή: συχνές ερωτήσεις, υποδοχή, γενική υποστήριξη.
Πρέπει να καταγραφεί μια τιμή πριν προχωρήσει ο πράκτορας.Δεν χρειάζεται να συλλεχθεί τίποτα με συγκεκριμένη σειρά.
Ένας κανόνας δεν πρέπει ποτέ να παραβιάζεται, όπως «οι καλούντες κάτω των 18 απευθύνονται σε κηδεμόνα».Η κρίση του μοντέλου είναι επαρκής για κάθε διακλάδωση.
Πρέπει να εκτελεστεί μια αναζήτηση σε συγκεκριμένο σημείο της κλήσης.Τα εργαλεία μπορούν να καλούνται όποτε το ζητά ο καλών.
Ένα μέρος της κλήσης ανήκει σε διαφορετικό πράκτορα, με δικό του prompt και φωνή.Μία περσόνα χειρίζεται τα πάντα.

Τα βήματα δεν είναι ένα τηλεφωνικό δέντρο με προκαθορισμένο σενάριο. Μέσα σε ένα βήμα, το μοντέλο διεξάγει τη συνομιλία όπως θα έκανε με ένα μόνο prompt. Το βήμα καθορίζει με τι ασχολείται, ποια εργαλεία μπορεί να χρησιμοποιεί και τι χρειάζεται πριν μπορέσει να το ολοκληρώσει.

Πώς δημιουργείται ένας πράκτορας με βήματα

Όταν ένας πράκτορας έχει βήματα, το prompt του περιέχει τις κοινές οδηγίες: την περσόνα και τους κανόνες που ισχύουν σε κάθε βήμα. Κάθε βήμα προσθέτει τις δικές του οδηγίες επιπλέον. Σε κάθε γύρο, το μοντέλο βλέπει τις κοινές οδηγίες, το όνομα και τις οδηγίες του τρέχοντος βήματος, καθώς και τις τιμές που έχουν συλλεχθεί μέχρι στιγμής.

Στον δημιουργό, αλλάξτε τον πράκτορα από Ένα μόνο prompt σε Βήματα. Θα έχετε μία κάρτα για κάθε βήμα με το όνομά του, τις οδηγίες, την ατάκα εκφώνησης, τα εργαλεία, τις συλλεγμένες τιμές και τις μεταβάσεις, έναν επιλογέα παραδόσεων και ένα γράφημα ροής μόνο για ανάγνωση των βημάτων. Η επιστροφή σε ένα μόνο prompt προσφέρει ένα ενοποιημένο prompt που συγχωνεύει τις κοινές οδηγίες και κάθε βήμα.

Μέσω του API, τα steps και handoffs είναι πεδία του πράκτορα. Όπως κάθε πεδίο πράκτορα, ένα PATCH τα αποθηκεύει στο πρόχειρο· το POST /v1/agents/{agent_id}/deploy τα θέτει σε λειτουργία. Η αποστολή "steps": null επαναφέρει τον πράκτορα σε ένα μόνο prompt. Οι δοκιμαστικές κλήσεις και η Μιλήστε εκτελούν το πρόχειρο.

Πεδία βήματος

ΠεδίοΣημασία
idΑπαιτείται. Πεζά γράμματα, ψηφία και κάτω παύλες, αρχίζοντας με γράμμα, έως 40 χαρακτήρες. Μοναδικό εντός του πράκτορα.
nameΑπαιτούμενο εμφανιζόμενο όνομα, από 1 έως 80 χαρακτήρες.
instructionsΑπαιτείται, έως 20.000 χαρακτήρες. Υποστηρίζει μεταβλητές κλήσης {{var}}, όπως το prompt.
sayΠροαιρετική ατάκα που εκφωνείται λέξη προς λέξη κατά την είσοδο στο βήμα, έως 1.000 χαρακτήρες. Υποστηρίζει {{var}}.
toolsΤο null δίνει στο βήμα κάθε εργαλείο που είναι συνδεδεμένο με τον πράκτορα. Μια λίστα περιορίζει το βήμα σε αυτά τα εργαλεία, βάσει ονόματος. Ενσωματωμένες ενέργειες όπως end_call και transfer_call ακολουθούν τις ρυθμίσεις του πράκτορα σε κάθε βήμα.
collectΈως 20 τιμές που συλλέγει το βήμα. Κάθε μία έχει name, type, description και required (προεπιλογή true).
on_enter_toolΠροαιρετικό όνομα εργαλείου, που καλείται αυτόματα κατά την είσοδο στο βήμα. Δείτε Βήματα webhook.
transitionsΤαξινομημένη λίστα των πιθανών επόμενων προορισμών του βήματος. Δείτε Μεταβάσεις.
global_whenΠροαιρετικό. Καθιστά το βήμα προσβάσιμο από οποιοδήποτε βήμα. Δείτε Καθολικά βήματα.
voiceΠροαιρετικό αναγνωριστικό φωνής για αυτό το βήμα. Αγνοείται όταν ο πράκτορας χρησιμοποιεί προσαρμοσμένη διαμόρφωση φωνής.

Το ίδιο το γράφημα είναι {"start_step": "<step id>", "steps": [...]}. Η κλήση ξεκινά στο start_step.

Μεταβάσεις

Κάθε μετάβαση έχει to, ένα αναγνωριστικό βήματος, και ακριβώς ένα από τα εξής:

  • when: φυσική γλώσσα, και το μοντέλο αποφασίζει. Ο πράκτορας διαθέτει ένα ενσωματωμένο εργαλείο go_to_step που παραθέτει τα βήματα στα οποία μπορεί να μετακινηθεί, με κάθε when ως τον λόγο για να το επιλέξει.
  • condition: ένας κανόνας για συλλεγμένες τιμές, και ο κώδικας αποφασίζει. Το μοντέλο δεν μπορεί να την παρακάμψει ή να την αποφύγει με συζήτηση.
  • "always": true: συνεχίστε χωρίς έλεγχο. Ο κώδικας αποφασίζει πρώτος: μόλις εισαχθεί ένα βήμα ή μόλις συλλεχθούν οι απαιτούμενες τιμές του, η πρώτη αντίστοιχη μετάβαση condition ή always υπερισχύει, προτού το μοντέλο μπορέσει να επιλέξει ένα when. Επομένως, τοποθετήστε το always μετά τις συνθήκες ως εναλλακτική λύση ή μόνο του για να συνδέσετε ένα βήμα απευθείας με το επόμενο. Ένα βήμα με always δεν περιμένει ποτέ επιλογή when.

Μια condition είναι {"value": <collected name or dotted path>, "op": <op>, "target": <literal>}:

opΑληθές όταν η τιμή
eq, neισούται ή δεν ισούται με target
lt, lte, gt, gteείναι μικρότερη από, το πολύ, μεγαλύτερη από ή τουλάχιστον target
in, not_inείναι ή δεν είναι μία από τις τιμές στη λίστα target
exists, missingέχει ή δεν έχει συλλεχθεί (χωρίς target)

Τα eq, ne, in και not_in συγκρίνουν κείμενο χωρίς διάκριση πεζών-κεφαλαίων μετά την αφαίρεση κενών. Οι αριθμοί συγκρίνονται ως αριθμοί και οι ημερομηνίες ως συμβολοσειρές YYYY-MM-DD. Μια τιμή που δεν συλλέχθηκε ποτέ καθιστά κάθε τελεστή ψευδή, εκτός από το missing.

Γράψτε τα when και global_when ως συνθήκη, όπως «Ο καλών θέλει να κλείσει ραντεβού», και όχι ως κάτι που πρέπει να ειπωθεί. Ο πράκτορας τα βλέπει ως εσωτερικές σημειώσεις δρομολόγησης και λαμβάνει οδηγίες να μην τα εκφωνεί ποτέ ούτε να αναφέρει ότι αλλάζει βήματα.

Όταν το μοντέλο καλεί το go_to_step:

  1. Κάθε τιμή required στο βήμα πρέπει να υπάρχει. Αν κάποια λείπει, το μοντέλο ενημερώνεται ποια είναι και τη ζητά από τον καλούντα.
  2. Οι τιμές αποθηκεύονται.
  3. Οι μεταβάσεις condition και always ελέγχονται με τη σειρά. Υπερισχύει η πρώτη αντιστοιχία.
  4. Διαφορετικά, ο πράκτορας μετακινείται στο βήμα που επέλεξε το μοντέλο.
  5. Αν δεν υπάρχει αντιστοιχία και το μοντέλο δεν όρισε βήμα, ο πράκτορας παραμένει στο τρέχον βήμα.

Η μετάβαση σε ένα καθολικό βήμα αποτελεί εξαίρεση: ο καλών άλλαξε θέμα, επομένως προχωρά ακόμη και όταν από το τρέχον βήμα εξακολουθούν να λείπουν απαιτούμενες τιμές, και πριν ελεγχθούν οι συνθήκες αυτού του βήματος.

Οι μεταβάσεις condition και always ελέγχονται επίσης κάθε φορά που εισάγεται ένα βήμα, ώστε μια ακολουθία βημάτων που αποφασίζονται από κώδικα να εκτελείται μονομιάς. Η αλυσίδα σταματά:

  • σε ένα βήμα που έχει ήδη επισκεφθεί σε αυτή την εκτέλεση,
  • μετά από 8 μεταβάσεις,
  • σε ένα βήμα που εξακολουθεί να έχει απαιτούμενες τιμές προς συλλογή, εκτός αν το βήμα έχει on_enter_tool (ένα βήμα webhook δρομολογεί πάντα βάσει του αποτελέσματός του).

Εκφωνείται μόνο η γραμμή say του βήματος όπου σταματά η αλυσίδα.

Ένα βήμα χωρίς μεταβάσεις είναι τερματικό. Ο πράκτορας ολοκληρώνει εκεί και τερματίζει ή μεταφέρει την κλήση με τις συνήθεις ενσωματωμένες ενέργειές του.

Συλλογή τιμών

Καταγράψτε όσα χρειάζεται ένα βήμα στο collect. Το μοντέλο μεταβιβάζει τις τιμές όταν καλεί το go_to_step, και αυτές παραμένουν διαθέσιμες για το υπόλοιπο της κλήσης.

typeΠεριέχει
stringΟποιοδήποτε κείμενο
numberΈναν αριθμό
booleantrue ή false
dateΜια ημερομηνία ως YYYY-MM-DD

Οι συλλεγμένες τιμές αποτελούν περιεχόμενο κλήσης. Εμφανίζονται στην κλήση δίπλα στην απομαγνητοφώνηση και ακολουθούν τους ίδιους κανόνες διατήρησης, διαγραφής και απόκρυψης. Όταν η εγγραφή κλήσεων του πράκτορα είναι απενεργοποιημένη, οι συλλεγμένες τιμές ούτε αποθηκεύονται ούτε αποστέλλονται σε webhook· το χρονολόγιο βημάτων εξακολουθεί να υπάρχει. Δείτε Πού να το δείτε σε μια κλήση.

Γραμμές say

Το say εκφωνείται ακριβώς όπως είναι γραμμένο όταν ο πράκτορας εισέρχεται στο βήμα. Στη συνέχεια, το μοντέλο συνεχίζει στο νέο βήμα στην ίδια απάντηση, γνωρίζοντας ότι η γραμμή μόλις εκφωνήθηκε, ώστε να μην την επαναλάβει. Χρησιμοποιήστε το say για χαιρετισμούς, υποχρεωτικές γνωστοποιήσεις και σταθερή διατύπωση, και αφήστε το υπόλοιπο της απάντησης στο μοντέλο.

Το say του αρχικού βήματος είναι η εναρκτήρια γραμμή του πράκτορα όταν μιλά πρώτος, μετά από τυχόν ανακοίνωση συναίνεσης. Όταν ο καλών μιλά πρώτος, ανοίγει την πρώτη απάντηση του πράκτορα προς άτομο, ποτέ προς σύστημα IVR ή χαιρετισμό τηλεφωνητή.

Το say ενός βήματος δεν εκφωνείται ξανά όταν η κλήση επιστρέφει σε αυτό μέσω του __previous__ ή επιστροφής. Γράψτε το όπως θα πρέπει να ακούγεται: γράψτε ολογράφως οτιδήποτε η φωνή μπορεί να διαβάσει λανθασμένα. Οι γραμμές say υποστηρίζουν μεταβλητές κλήσης {{var}}, αλλά όχι συλλεγμένες τιμές.

Βήματα webhook

Ορίστε το on_enter_tool σε ένα από τα εργαλεία του πράκτορα και εκτελείται μόλις εισέλθει στο βήμα, χωρίς να περιμένει το μοντέλο. Τα ορίσματά του είναι οι συλλεγμένες τιμές των οποίων τα ονόματα αντιστοιχούν στα ονόματα παραμέτρων του εργαλείου. Το αποτέλεσμα αποθηκεύεται ως συλλεγμένη τιμή με όνομα <tool>_result, περικομμένο στα 4 KB, και οι μεταβάσεις condition και always του βήματος ελέγχονται αμέσως, ώστε η αναζήτηση να μπορεί να δρομολογήσει την κλήση βάσει του δικού της αποτελέσματος.

Η αποθηκευμένη τιμή έχει δύο πεδία:

ΠεδίοΠεριέχει
statusΤον κωδικό κατάστασης HTTP που επέστρεψε το τελικό σημείο σας.
responseΤο σώμα της απόκρισης.

Δρομολογήστε βάσει ενός πεδίου του σώματος με lookup_account_result.response.<field>, και βάσει του κωδικού κατάστασης με lookup_account_result.status.

Η αναζήτηση εκτελείται για έως 8 δευτερόλεπτα ή έως το χρονικό όριο του ίδιου του εργαλείου, αν είναι συντομότερο. Αν διαρκέσει περισσότερο από 3 δευτερόλεπτα, ο πράκτορας λέει μια σύντομη φράση ώστε ο καλών να μη μείνει στη σιωπή. Αν το τελικό σημείο σας επιστρέψει κατάσταση 400 ή υψηλότερη, ή δεν απαντήσει έγκαιρα, ο πράκτορας ενημερώνει τον καλούντα ότι δεν μπόρεσε να το ελέγξει αυτή τη στιγμή και συνεχίζει με όσα μπορεί να κάνει.

Καθολικά βήματα

Ένα βήμα με global_when μπορεί να προσεγγιστεί από οποιοδήποτε βήμα όποτε ισχύει αυτή η περιγραφή. Το μοντέλο αποφασίζει, όπως και με το when. Χρησιμοποιήστε το για θέματα που μπορεί να θέσει ένας καλών οποιαδήποτε στιγμή: ερωτήσεις χρέωσης, αίτημα για άνθρωπο, παράπονο.

Μια μετάβαση με "to": "__previous__" σε ένα καθολικό βήμα επιστρέφει την κλήση στο βήμα που ήταν ενεργό πριν από αυτό, ώστε ο καλών να συνεχίσει από εκεί που σταμάτησε. Το βήμα συνεχίζει: το on_enter_tool του δεν εκτελείται ξανά, το say του δεν επαναλαμβάνεται και ο πράκτορας το συνεχίζει χωρίς να ξεκινήσει από την αρχή.

Μεταβιβάσεις

Το handoffs παραθέτει άλλους πράκτορες στον οργανισμό σας που μπορούν να αναλάβουν την κλήση:

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

Ο πράκτορας λαμβάνει ένα ενσωματωμένο εργαλείο hand_off με αυτούς τους πράκτορες και τους λόγους. Όπως και με τις μεταβάσεις, κάθε when είναι μια εσωτερική σημείωση δρομολόγησης και δεν εκφωνείται ποτέ.

Κατά τη μεταβίβαση, ο πράκτορας λέει μία σύντομη φράση που ενημερώνει τον καλούντα πού θα μεταφερθεί, όπως «Βεβαίως, θα σας συνδέσω με την ομάδα χρεώσεών μας», με τη δική του φωνή. Στη συνέχεια, το prompt, τα βήματα, τα εργαλεία και η φωνή του πράκτορα-στόχου αναλαμβάνουν και η κλήση συνεχίζεται με το ίδιο απομαγνητοφωνημένο κείμενο. Ο νέος πράκτορας συστήνεται σύντομα και απαντά στο τελευταίο αίτημα του καλούντα· δεν ανακοινώνει τη μεταβίβαση. Η βάση γνώσεων του στόχου είναι διαθέσιμη από εκείνο το σημείο και μετά.

Την πρώτη φορά που μια κλήση φτάνει σε έναν πράκτορα, ξεκινά στο start_step του πράκτορα: εκτελείται το on_enter_tool του βήματος και εκφωνείται το say του. Όταν η κλήση μεταβιβάζεται ξανά σε έναν πράκτορα που είχε ήδη επισκεφθεί, ο πράκτορας συνεχίζει από το βήμα στο οποίο βρισκόταν, χωρίς να εκτελεί το on_enter_tool, να επαναλαμβάνει το say του ή να συστήνεται ξανά. Οι συλλεγμένες τιμές κοινοποιούνται σε κάθε πράκτορα της κλήσης.

  • Ο στόχος πρέπει να είναι πράκτορας στον ίδιο οργανισμό και ένας πράκτορας δεν μπορεί να μεταβιβάσει κλήση στον εαυτό του.
  • Όλα τα στοιχεία σε επίπεδο κλήσης παραμένουν στον πράκτορα που απάντησε: προϊόν, γλώσσες, ποιος μιλά πρώτος, τηλεφωνητής, ανακοίνωση συγκατάθεσης και κάθε άλλη ρύθμιση κλήσης.
  • Οι στόχοι μπορούν να μεταβιβάσουν περαιτέρω την κλήση, καθώς και πίσω. Μία κλήση μπορεί να φτάσει έως και σε 8 πράκτορες.
  • Μια δοκιμαστική κλήση εκτελεί το πρόχειρο του πράκτορα που δοκιμάζετε. Οι πράκτορες στους οποίους μεταβιβάζει την κλήση εκτελούν τις αναπτυγμένες εκδόσεις τους.
  • Αν δύο πράκτορες έχουν εργαλείο με το ίδιο όνομα και διαφορετικούς ορισμούς, διατηρείται μόνο ένα για την κλήση και υπερισχύει πάντα εκείνο του πράκτορα που απάντησε. Ο δημιουργός σάς προειδοποιεί όταν αποθηκεύετε.
  • Ένας πράκτορας μπορεί να έχει μεταβιβάσεις χωρίς βήματα. Χρησιμοποιείται ολόκληρο το prompt του όπως είναι.

Τα go_to_step και hand_off είναι δεσμευμένα για πράκτορες με βήματα ή μεταβιβάσεις, επομένως τα δικά σας εργαλεία δεν μπορούν να χρησιμοποιούν αυτά τα ονόματα.

Πού να το δείτε σε μια κλήση

Ανοίξτε την κλήση στο Ιστορικό κλήσεων. Ένα χρονολόγιο βημάτων δίπλα στο απομαγνητοφωνημένο κείμενο εμφανίζει κάθε βήμα στο οποίο εισήλθε η κλήση και τον λόγο, ενώ οι συλλεγμένες τιμές παρατίθενται μαζί του.

Το αντικείμενο κλήσης και το webhook ολοκλήρωσης κλήσης (telephony.complete / web.complete) περιέχουν τα ίδια δεδομένα ως steps_trace και collected_values. Και τα δύο απουσιάζουν σε κλήσεις χωρίς βήματα.

"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 είναι το a ακολουθούμενο από το αναγνωριστικό του πράκτορα. Το via αναφέρει τι μετακίνησε την κλήση:

viaΣημασία
startΗ κλήση ξεκίνησε σε αυτό το βήμα.
modelΤο μοντέλο επέλεξε το βήμα μέσω go_to_step, ενός when ή ενός global_when.
conditionΤαίριαξε μια μετάβαση condition ή always.
on_enterΤαίριαξε μια μετάβαση στο αποτέλεσμα ενός βήματος webhook.
handoffΈνας άλλος πράκτορας ανέλαβε.

Πού εκτελούνται τα βήματα

Τα βήματα εκτελούνται εγγενώς στο Spark, στο Bolt και σε κάθε προϊόν Storm, σε εισερχόμενες, εξερχόμενες και καμπάνιες κλήσεων, δοκιμαστικές κλήσεις, καθώς και κλήσεις ιστού και widget.

Παντού αλλού ο πράκτορας εξακολουθεί να λειτουργεί, απλώς χωρίς τη δομή: εκτελεί ένα ενοποιημένο prompt που συγχωνεύει τις κοινές οδηγίες και κάθε βήμα, με τη σειρά. Αυτό καλύπτει:

  • τα πειραματικά προϊόντα Bolt·
  • συνεδρίες Realtime, συμπεριλαμβανομένων συνεδριών για έναν αποθηκευμένο πράκτορα·
  • ενσωματωμένες διαμορφώσεις που επιστρέφονται από ένα webhook δυναμικής διαμόρφωσης κλήσης. Ένα webhook που επιστρέφει agent_id χρησιμοποιεί τα βήματα αυτού του πράκτορα.

Όρια

ΌριοΤιμή
Βήματα ανά πράκτορα100
Συλλεγμένες τιμές ανά βήμα20
Στόχοι μεταβίβασης ανά πράκτορα8
Πράκτορες προσβάσιμοι σε μία κλήση8
Μέγεθος του JSON steps200 KB
instructions βήματος20.000 χαρακτήρες
Γραμμή say1.000 χαρακτήρες
Αποθηκευμένο αποτέλεσμα on_enter_tool4 KB

Μια αποθήκευση που παραβιάζει έναν κανόνα επιστρέφει 400 με τη διαδρομή του εσφαλμένου πεδίου, όπως steps.steps[2].transitions[0].to. Τα ονόματα εργαλείων στα tools και on_enter_tool πρέπει να είναι εργαλεία συνδεδεμένα με τον πράκτορα.

Δεν υποστηρίζονται γλώσσες ανά βήμα, σεναριοποιημένα βήματα που παρακάμπτουν το μοντέλο και συλλεγμένες τιμές μέσα σε γραμμές say.

Εισαγόμενοι πράκτορες

Η εισαγωγή από Retell, Bland, Vapi ή ElevenLabs μεταφέρει πράκτορες με πολλαπλά prompts, ροές, διαδρομές και workflows ως βήματα, και ομάδες και μεταβιβάσεις πρακτόρων ως μεταβιβάσεις μεταξύ των εισαγόμενων πρακτόρων. Η σελίδα ελέγχου εμφανίζει και τα δύο πριν από την εισαγωγή.

Παράδειγμα: καταχώριση σε οδοντιατρείο

Τρία βήματα με τη σειρά: χαιρετισμός, συλλογή στοιχείων ασθενούς, κράτηση.

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

Προετοιμάστε το με PATCH /v1/agents/{agent_id}, δοκιμάστε το με Μιλήστε και, στη συνέχεια, αναπτύξτε το. Το βήμα details δεν μπορεί να μεταβιβάσει στην κράτηση έως ότου συλλεχθούν το όνομα, η ημερομηνία γέννησης και ο λόγος· το new_patient είναι προαιρετικό.

Παράδειγμα: διακλάδωση με περιορισμό ηλικίας

Το μοντέλο μπορεί να μιλήσει με οποιονδήποτε, αλλά ο κώδικας αποφασίζει ποιος λαμβάνει κράτηση. Συλλέξτε την ηλικία και, στη συνέχεια, δρομολογήστε βάσει αυτής προτού εξεταστεί η επιλογή του ίδιου του μοντέλου.

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

Ένας καλών που λέει δεκαπέντε μεταβαίνει στο guardian, ανεξάρτητα από το τι αποφασίζει το μοντέλο. Όλοι οι υπόλοιποι μεταβαίνουν στο book. Και τα δύο είναι συνηθισμένα βήματα αλλού στο γράφημα.

Παράδειγμα: βήμα webhook αναζήτησης λογαριασμού

Ο καλών δίνει έναν αριθμό λογαριασμού, η αναζήτηση εκτελείται κατά την είσοδο στο επόμενο βήμα και το αποτέλεσμά της επιλέγει τη διαδρομή. Τα βήματα not_found, collections και support παραλείπονται για συντομία.

[
  {
    "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 λαμβάνει το account_number επειδή η παράμετρός του έχει αυτό το όνομα. Αν το σώμα απόκρισης έχει "found": false, η κλήση μεταβαίνει στο not_found. Αν το account_status είναι past_due ή suspended, μεταβαίνει στο collections. Ένας ενεργός λογαριασμός παραμένει στο lookup, όπου το μοντέλο βοηθά και συνεχίζει στο support. Για να στείλετε μια αποτυχημένη αναζήτηση στο δικό της βήμα, προσθέστε πρώτα συνθήκες για την κατάσταση: μια απόκριση σφάλματος αποθηκεύει τον κωδικό κατάστασής της, επομένως το {"value": "lookup_account_result.status", "op": "gte", "target": 400} την εντοπίζει, ενώ ένα χρονικό όριο ή η απουσία απάντησης αποθηκεύει το "error", επομένως το {"value": "lookup_account_result.status", "op": "eq", "target": "error"} το εντοπίζει.

Παράδειγμα: από τη ρεσεψιόν στη χρέωση

Δύο πράκτορες. Η ρεσεψιόν (πράκτορας 412) απαντά σε κάθε κλήση και μεταβιβάζει ερωτήσεις χρέωσης σε έναν πράκτορα χρέωσης (πράκτορας 413) με δική του προτροπή, εργαλεία και φωνή.

Στη ρεσεψιόν:

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

Στον πράκτορα χρέωσης, ώστε να μπορεί να μεταβιβάσει ξανά τον καλούντα:

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

Η ρεσεψιόν λέει μια σύντομη φράση, όπως «Να σας συνδέσω με την ομάδα χρεώσεών μας», και ο πράκτορας χρέωσης συστήνεται και συνεχίζει τη συνομιλία από το σημείο όπου την άφησε η ρεσεψιόν. Όταν η χρέωση μεταβιβάζει ξανά την κλήση, η ρεσεψιόν συνεχίζει από το σημείο όπου βρισκόταν, χωρίς να χαιρετά ξανά τον καλούντα. Το προϊόν της κλήσης, οι γλώσσες, η ανακοίνωση συγκατάθεσης και οι άλλες ρυθμίσεις κλήσης παραμένουν στη ρεσεψιόν, επειδή αυτή απάντησε.

Αν η χρέωση χρειάζεται μόνο τις δικές της οδηγίες και όχι τον δικό της πράκτορα, χρησιμοποιήστε ένα καθολικό βήμα στη ρεσεψιόν. Όταν απαντηθεί η ερώτηση, η κλήση επιστρέφει σε όποιο βήμα βρισκόταν ο καλών:

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

Επόμενα βήματα