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

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

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

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

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

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

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

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

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

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

<Tip>
  Ο [συνοδηγός](/el/guides/ask-the-copilot) μπορεί να δημιουργήσει βήματα από μια περιγραφή
  («προσθέστε ένα βήμα που επαληθεύει την ημερομηνία γέννησης πριν από την κράτηση») και να επεξεργαστεί ένα βήμα
  χωρίς να επηρεάσει τα υπόλοιπα.
</Tip>

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

| Πεδίο | Σημασία |
| --- | --- |
| `id` | Απαιτείται. Πεζά γράμματα, ψηφία και κάτω παύλες, αρχίζοντας με γράμμα, έως 40 χαρακτήρες. Μοναδικό εντός του πράκτορα. |
| `name` | Απαιτούμενο εμφανιζόμενο όνομα, από 1 έως 80 χαρακτήρες. |
| `instructions` | Απαιτείται, έως 20.000 χαρακτήρες. Υποστηρίζει [μεταβλητές κλήσης](/el/guides/call-variables) `{{var}}`, όπως το `prompt`. |
| `say` | Προαιρετική ατάκα που εκφωνείται λέξη προς λέξη κατά την είσοδο στο βήμα, έως 1.000 χαρακτήρες. Υποστηρίζει `{{var}}`. |
| `tools` | Το `null` δίνει στο βήμα κάθε εργαλείο που είναι συνδεδεμένο με τον πράκτορα. Μια λίστα περιορίζει το βήμα σε αυτά τα εργαλεία, βάσει ονόματος. Ενσωματωμένες ενέργειες όπως `end_call` και `transfer_call` ακολουθούν τις ρυθμίσεις του πράκτορα σε κάθε βήμα. |
| `collect` | Έως 20 τιμές που συλλέγει το βήμα. Κάθε μία έχει `name`, `type`, `description` και `required` (προεπιλογή `true`). |
| `on_enter_tool` | Προαιρετικό όνομα εργαλείου, που καλείται αυτόματα κατά την είσοδο στο βήμα. Δείτε [Βήματα webhook](#webhook-steps). |
| `transitions` | Ταξινομημένη λίστα των πιθανών επόμενων προορισμών του βήματος. Δείτε [Μεταβάσεις](#transitions). |
| `global_when` | Προαιρετικό. Καθιστά το βήμα προσβάσιμο από οποιοδήποτε βήμα. Δείτε [Καθολικά βήματα](#global-steps). |
| `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. Αν δεν υπάρχει αντιστοιχία και το μοντέλο δεν όρισε βήμα, ο πράκτορας παραμένει στο τρέχον βήμα.

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

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

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

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

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

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

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

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

Οι συλλεγμένες τιμές αποτελούν περιεχόμενο κλήσης. Εμφανίζονται στην κλήση δίπλα στην
απομαγνητοφώνηση και ακολουθούν τους ίδιους κανόνες διατήρησης, διαγραφής και απόκρυψης. Όταν
η εγγραφή κλήσεων του πράκτορα είναι απενεργοποιημένη, οι συλλεγμένες τιμές ούτε αποθηκεύονται
ούτε αποστέλλονται σε webhook· το χρονολόγιο βημάτων εξακολουθεί να υπάρχει. Δείτε
[Πού να το δείτε σε μια κλήση](#where-to-see-it-on-a-call).

## Γραμμές 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` παραθέτει άλλους πράκτορες στον οργανισμό σας που μπορούν να αναλάβουν την κλήση:

```json
[{"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` είναι δεσμευμένα για πράκτορες με βήματα ή μεταβιβάσεις, επομένως τα δικά σας εργαλεία δεν μπορούν να χρησιμοποιούν αυτά τα ονόματα.

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

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

Το [αντικείμενο κλήσης](/api-reference/calls#retrieve-a-call) και το webhook ολοκλήρωσης κλήσης ([`telephony.complete` / `web.complete`](/el/webhooks/call-complete)) περιέχουν τα ίδια δεδομένα ως `steps_trace` και `collected_values`. Και τα δύο απουσιάζουν σε κλήσεις χωρίς βήματα.

```json
"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](/el/guides/use-with-openai-realtime), συμπεριλαμβανομένων συνεδριών για έναν αποθηκευμένο πράκτορα·
- ενσωματωμένες διαμορφώσεις που επιστρέφονται από ένα webhook [δυναμικής διαμόρφωσης κλήσης](/el/guides/dynamic-call-config). Ένα webhook που επιστρέφει `agent_id` χρησιμοποιεί τα βήματα αυτού του πράκτορα.

## Όρια

| Όριο | Τιμή |
| --- | --- |
| Βήματα ανά πράκτορα | 100 |
| Συλλεγμένες τιμές ανά βήμα | 20 |
| Στόχοι μεταβίβασης ανά πράκτορα | 8 |
| Πράκτορες προσβάσιμοι σε μία κλήση | 8 |
| Μέγεθος του JSON `steps` | 200 KB |
| `instructions` βήματος | 20.000 χαρακτήρες |
| Γραμμή `say` | 1.000 χαρακτήρες |
| Αποθηκευμένο αποτέλεσμα `on_enter_tool` | 4 KB |

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

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

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

Η [εισαγωγή](/el/guides/import-agents) από Retell, Bland, Vapi ή ElevenLabs
μεταφέρει πράκτορες με πολλαπλά prompts, ροές, διαδρομές και workflows ως βήματα, και
ομάδες και μεταβιβάσεις πρακτόρων ως μεταβιβάσεις μεταξύ των εισαγόμενων πρακτόρων. Η
σελίδα ελέγχου εμφανίζει και τα δύο πριν από την εισαγωγή.

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

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

```json
{
  "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` είναι προαιρετικό.

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

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

```json
{
  "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`
παραλείπονται για συντομία.

```json
[
  {
    "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`) με δική του προτροπή, εργαλεία και φωνή.

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

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

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

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

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

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

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

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

<CardGroup cols={2}>
  <Card title="Οδηγός προτροπών" icon="pen" href="/el/guides/prompting">
    Γράψτε κοινές οδηγίες και οδηγίες βημάτων που λειτουργούν αξιόπιστα στο τηλέφωνο.
  </Card>
  <Card title="Δημιουργία ενσωμάτωσης εργαλείου" icon="code" href="/el/guides/build-tool-integration">
    Δημιουργήστε τα εργαλεία που καλούν τα βήματά σας και τα βήματα webhook.
  </Card>
  <Card title="Δοκιμή των πρακτόρων σας" icon="flask" href="/el/guides/test-agents">
    Εκτελέστε τα ίδια σενάρια σε κάθε κλάδο πριν από την ανάπτυξη.
  </Card>
  <Card title="API πρακτόρων" icon="robot" href="/api-reference/agents">
    Κάθε πεδίο πράκτορα, πρόχειρη έκδοση και ανάπτυξη.
  </Card>
</CardGroup>
