---
title: "Agentin vaiheet ja siirrot"
description: "Jaa agentti vaiheisiin, joilla on omat ohjeet, työkalut ja kerätyt arvot, ja siirrä puheluita agenttien välillä kesken puhelun."
---

Yksi kehote antaa mallille koko tehtävän kerralla. **Vaiheet** antavat sille yhden
puhelun vaiheen kerrallaan: jokaisella vaiheella on omat ohjeensa, omat työkalunsa,
valinnainen sanasta sanaan puhuttava repliikki ja arvot, jotka sen on kerättävä
ennen etenemistä. **Luovutusten** avulla toinen organisaatiosi agentti voi ottaa
puhelun haltuunsa kesken puhelun niin, että keskusteluloki säilyy eikä soittajan
tarvitse toistaa itseään.

Jokainen agentti alkaa yhtenä kehotteena. Mikään siinä ei muutu, ennen kuin lisäät
vaiheita tai luovutuksia.

## Vaiheet vai yksi kehote?

| Käytä vaiheita, kun | Pidä yksi kehote, kun |
| --- | --- |
| Puhelussa on järjestyksessä toteutettavia vaiheita: varmista, sitten varaa. | Keskustelu on avoin: usein kysytyt kysymykset, vastaanotto, yleinen tuki. |
| Arvo on tallennettava ennen kuin agentti etenee. | Mitään ei tarvitse kerätä määrätyssä järjestyksessä. |
| Säännöstä ei saa koskaan poiketa, kuten "alle 18-vuotiaat soittajat ohjataan huoltajalle". | Mallin harkinta riittää jokaisessa haarassa. |
| Haku on suoritettava tietyssä kohdassa puhelua. | Työkaluja voidaan kutsua aina, kun soittaja pyytää. |
| Osa puhelusta kuuluu toiselle agentille, jolla on oma kehotteensa ja äänensä. | Yksi persoona hoitaa kaiken. |

Vaiheet eivät ole käsikirjoitettu puhelinvalikko. Vaiheen sisällä malli käy
keskustelua samalla tavalla kuin yhden kehotteen kanssa. Vaihe määrittää, mitä se
käsittelee, mitä työkaluja se voi käyttää ja mitä se tarvitsee ennen kuin siitä
voi poistua.

## Miten vaiheittainen agentti rakennetaan

Kun agentilla on vaiheita, sen `prompt` sisältää **yhteiset ohjeet**: persoonan ja
säännöt, jotka koskevat jokaista vaihetta. Jokainen vaihe lisää omat ohjeensa
niiden päälle. Jokaisella vuorolla malli näkee yhteiset ohjeet, nykyisen vaiheen
nimen ja ohjeet sekä tähän mennessä kerätyt arvot.

Vaihda rakentajassa agentti asetuksesta **Yksi kehote** asetukseen **Vaiheet**. Saat
jokaiselle vaiheelle kortin, jossa näkyvät sen nimi, ohjeet, puhuttava repliikki,
työkalut, kerätyt arvot ja siirtymät, luovutusten valitsimen sekä vaiheiden
vain luku -tilassa olevan vuokaavion. Kun vaihdat takaisin yhteen kehotteeseen,
saat litistetyn kehotteen, joka yhdistää yhteiset ohjeet ja kaikki vaiheet.

API:ssa `steps` ja `handoffs` ovat
[agentin](/api-reference/agents) kenttiä. Kuten kaikki agentin kentät, `PATCH`
tallentaa ne luonnokseen; `POST /v1/agents/{agent_id}/deploy` julkaisee ne.
Lähettämällä `"steps": null` vaihdat agentin takaisin yhteen kehotteeseen.
Testipuhelut ja **Keskustele** käyttävät luonnosta.

<Tip>
  [Copilot](/fi/guides/ask-the-copilot) voi rakentaa vaiheet kuvauksesta
  ("lisää vaihe, joka varmistaa syntymäajan ennen varaamista") ja muokata yhtä
  vaihetta koskematta muihin.
</Tip>

### Vaihekentät

| Kenttä | Merkitys |
| --- | --- |
| `id` | Pakollinen. Pieniä kirjaimia, numeroita ja alaviivoja, alkaa kirjaimella, enintään 40 merkkiä. Yksilöllinen agentin sisällä. |
| `name` | Pakollinen näyttönimi, 1–80 merkkiä. |
| `instructions` | Pakollinen, enintään 20 000 merkkiä. Tukee `{{var}}` [puhelumuuttujia](/fi/guides/call-variables), kuten `prompt`. |
| `say` | Valinnainen sanasta sanaan puhuttava repliikki, kun vaiheeseen siirrytään, enintään 1 000 merkkiä. Tukee `{{var}}`. |
| `tools` | `null` antaa vaiheelle kaikki agenttiin liitetyt työkalut. Luettelo rajoittaa vaiheen nimettyihin työkaluihin. Sisäänrakennetut toiminnot, kuten `end_call` ja `transfer_call`, noudattavat agentin asetuksia jokaisessa vaiheessa. |
| `collect` | Enintään 20 arvoa, jotka vaihe kerää. Jokaisella on `name`, `type`, `description` ja `required` (oletusarvo `true`). |
| `on_enter_tool` | Valinnainen työkalun nimi, jota kutsutaan automaattisesti vaiheeseen siirryttäessä. Katso [Webhook-vaiheet](#webhook-steps). |
| `transitions` | Järjestetty luettelo paikoista, joihin vaihe voi seuraavaksi siirtyä. Katso [Siirtymät](#transitions). |
| `global_when` | Valinnainen. Tekee vaiheesta saavutettavan mistä tahansa vaiheesta. Katso [Globaalit vaiheet](#global-steps). |
| `voice` | Valinnainen äänen tunniste tälle vaiheelle. Ohitetaan, kun agentti käyttää mukautettua äänimääritystä. |

Kaavio itsessään on `{"start_step": "<step id>", "steps": [...]}`. Puhelu
alkaa kohdasta `start_step`.

## Siirtymät

Jokaisella siirtymällä on `to`, vaiheen tunnus, ja täsmälleen yksi seuraavista:

- **`when`**: luonnollista kieltä, ja **malli päättää**. Agentilla on
  sisäänrakennettu `go_to_step`-työkalu, joka listaa vaiheet, joihin se voi
  siirtyä, ja jokainen `when` kertoo syyn sen valitsemiseen.
- **`condition`**: sääntö kerätyille arvoille, ja **koodi päättää**. Malli ei
  voi ohittaa sitä tai puhua itseään sen ympäri.
- **`"always": true`**: siirry eteenpäin ilman tarkistusta. Koodi päättää
  ensin: heti kun vaihe avataan tai kun sen vaaditut arvot on kerätty, ensimmäinen
  vastaava `condition`- tai `always`-siirtymä voittaa, ennen kuin malli voi valita
  `when`-siirtymän. Sijoita siis `always` ehtojen jälkeen niiden varavaihtoehdoksi
  tai yksin ketjuttamaan vaihe suoraan seuraavaan. Vaihe, jossa on `always`, ei
  koskaan odota `when`-valintaa.

`condition` on `{"value": <collected name or dotted path>, "op": <op>, "target": <literal>}`:

| `op` | Tosi, kun arvo |
| --- | --- |
| `eq`, `ne` | on yhtä suuri kuin tai eri kuin `target` |
| `lt`, `lte`, `gt`, `gte` | on pienempi kuin, enintään, suurempi kuin tai vähintään `target` |
| `in`, `not_in` | on tai ei ole yksi `target`-luettelon arvoista |
| `exists`, `missing` | on tai ei ole kerätty (ei `target`-arvoa) |

`eq`, `ne`, `in` ja `not_in` vertaavat tekstiä kirjainkoosta välittämättä
välilyöntien poistamisen jälkeen. Numeroita verrataan numeroina ja päivämääriä
`YYYY-MM-DD`-merkkijonoina. Arvo, jota ei koskaan kerätty, tekee jokaisesta
operaattorista epätoden paitsi `missing`-operaattorista.

Kirjoita `when` ja `global_when` ehtona, kuten "Soittaja haluaa varata
ajan", älä sanottavana asiana. Agentti näkee ne sisäisinä reititysmuistiinpanoina,
ja sitä ohjeistetaan olemaan koskaan lukematta niitä ääneen tai mainitsematta,
että se vaihtaa vaihetta.

Kun malli kutsuu `go_to_step`:

1. Jokaisen vaiheen `required`-arvon on oltava saatavilla. Jos jokin puuttuu,
   mallille kerrotaan, mikä niistä puuttuu, ja se pyytää sitä soittajalta.
2. Arvot tallennetaan.
3. `condition`- ja `always`-siirtymät tarkistetaan järjestyksessä. Ensimmäinen
   vastaavuus voittaa.
4. Muussa tapauksessa agentti siirtyy mallin valitsemaan vaiheeseen.
5. Jos mikään ei täsmää eikä malli nimennyt vaihetta, agentti pysyy nykyisessä
   vaiheessa.

Siirtyminen [globaaliin vaiheeseen](#global-steps) on poikkeus: soittaja vaihtoi
aihetta, joten siirtyminen tehdään, vaikka nykyisestä vaiheesta puuttuisi vielä
vaadittuja arvoja, ja ennen kuin kyseisen vaiheen ehdot tarkistetaan.

`condition`- ja `always`-siirtymät tarkistetaan myös aina, kun vaihe avataan,
joten koodin päättämien vaiheiden sarja suoritetaan yhdellä kertaa. Ketju pysähtyy:

- vaiheeseen, jossa se on jo käynyt tämän suorituksen aikana;
- 8 siirtymän jälkeen;
- vaiheeseen, jossa on vielä kerättäviä vaadittuja arvoja, ellei vaiheessa ole
  `on_enter_tool`-työkalua (webhook-vaihe reitittää aina tuloksensa perusteella).

Vain sen vaiheen `say`-rivi, johon ketju pysähtyy, puhutaan ääneen.

Vaihe ilman siirtymiä on **päätevaihe**. Agentti päättää siinä ja lopettaa tai
siirtää puhelun tavallisilla sisäänrakennetuilla toiminnoillaan.

## Arvojen kerääminen

Listaa vaiheen tarvitsemat tiedot kohdassa `collect`. Malli välittää arvot
kutsuessaan `go_to_step`, ja ne pysyvät saatavilla puhelun loppuun asti.

| `type` | Sisältää |
| --- | --- |
| `string` | Mitä tahansa tekstiä |
| `number` | Numeron |
| `boolean` | `true` tai `false` |
| `date` | Päivämäärän muodossa `YYYY-MM-DD` |

Kerätyt arvot ovat puhelun sisältöä. Ne näkyvät puhelussa litteroinnin vieressä
ja noudattavat samoja säilytys-, poisto- ja peittosääntöjä. Kun agentin
puhelutallennus on poistettu käytöstä, kerättyjä arvoja ei tallenneta eikä
lähetetä webhookeihin; vaiheen aikajana säilyy silti. Katso
[Missä näet sen puhelussa](#where-to-see-it-on-a-call).

## Sano-rivit

`say` puhutaan täsmälleen kirjoitetussa muodossa, kun agentti siirtyy vaiheeseen. Malli jatkaa sitten uudessa vaiheessa samassa vastauksessa tietäen, että rivi juuri sanottiin, joten se ei toista sitä. Käytä `say`-kenttää tervehdyksiin, pakollisiin ilmoituksiin ja kiinteään sanamuotoon ja jätä vastauksen muu osa mallin tehtäväksi.

Aloitusvaiheen `say` on agentin aloitusrepliikki, kun se puhuu ensin, mahdollisen suostumusilmoituksen jälkeen. Kun soittaja puhuu ensin, se aloittaa agentin ensimmäisen vastauksen henkilölle, ei koskaan IVR:lle tai vastaajatervehdykselle.

Vaiheen `say`-riviä ei puhuta uudelleen, kun puhelu palaa siihen `__previous__`-siirtymän tai takaisinluovutuksen kautta. Kirjoita se sellaisena kuin sen pitäisi kuulostaa: kirjoita auki kaikki, minkä puheääni voisi lukea väärin. Sano-rivit tukevat `{{var}}`-puhelumuuttujia, mutta eivät kerättyjä arvoja.

## Webhook-vaiheet

Aseta `on_enter_tool` johonkin agentin työkaluista, niin se suoritetaan heti vaiheeseen siirryttäessä ilman mallin odottamista. Sen argumentit ovat kerätyt arvot, joiden nimet vastaavat työkalun parametrien nimiä. Tulos tallennetaan kerättyyn arvoon nimeltä `<tool>_result`, katkaistuna 4 kilotavuun, ja vaiheen `condition`- ja `always`-siirtymät tarkistetaan heti, joten haku voi reitittää puhelun oman tuloksensa perusteella.

Tallennetulla arvolla on kaksi kenttää:

| Kenttä | Sisältää |
| --- | --- |
| `status` | HTTP-tilakoodi, jonka päätepisteesi palautti. |
| `response` | Vastauksen runko. |

Reititä runkokentän perusteella käyttämällä `lookup_account_result.response.<field>` ja tilakoodin perusteella käyttämällä `lookup_account_result.status`.

Haku suoritetaan enintään 8 sekunnin ajan tai työkalun oman aikakatkaisun ajan, jos se on lyhyempi. Jos se kestää yli 3 sekuntia, agentti sanoo lyhyen repliikin, jotta soittaja ei jää hiljaisuuteen. Jos päätepisteesi palauttaa tilakoodin 400 tai suuremman tai ei vastaa ajoissa, agentti kertoo soittajalle, ettei se voinut tarkistaa asiaa juuri nyt, ja jatkaa sillä, mitä se voi tehdä.

## Globaalit vaiheet

Vaihe, jossa on `global_when`, voidaan saavuttaa mistä tahansa vaiheesta aina, kun kyseinen kuvaus pätee. Malli päättää tästä kuten `when`-ehdon kohdalla. Käytä sitä aiheisiin, jotka soittaja voi ottaa esiin missä vaiheessa tahansa: laskutuskysymyksiin, pyyntöön puhua ihmiselle tai valitukseen.

Globaalin vaiheen siirtymä, jossa on `"to": "__previous__"`, palauttaa puhelun vaiheeseen, joka oli aktiivinen ennen sitä, jotta soittaja jatkaa siitä, mihin jäi. Vaihe jatkuu: sen `on_enter_tool` ei suoritu uudelleen, sen `say`-riviä ei toisteta, ja agentti jatkaa sitä aloittamatta alusta.

## Siirrot

`handoffs` luettelee organisaatiosi muut agentit, jotka voivat ottaa puhelun hoitaakseen:

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

Agentti saa sisäänrakennetun `hand_off`-työkalun näiden agenttien ja syiden kanssa. Kuten siirtymissäkin, jokainen `when` on sisäinen reititysmerkintä, jota ei koskaan lueta ääneen.

Kun agentti siirtää puhelun, se kertoo soittajalle yhdellä lyhyellä lauseella, minne puhelu ohjataan, esimerkiksi "Totta kai, yhdistän sinut laskutustiimillemme", omalla äänellään. Sen jälkeen kohdeagentin kehote, vaiheet, työkalut ja ääni ottavat vastuun, ja puhelu jatkuu samalla transkriptiolla. Uusi agentti esittelee itsensä lyhyesti ja vastaa soittajan viimeisimpään pyyntöön; se ei ilmoita siirrosta. Kohdeagentin tietopohja on käytettävissä siitä eteenpäin.

Kun puhelu saavuttaa agentin ensimmäistä kertaa, se alkaa kyseisen agentin `start_step`-vaiheesta: vaiheen `on_enter_tool` suoritetaan ja sen `say` puhutaan ääneen. Kun puhelu siirretään takaisin agentille, jossa se on jo käynyt, agentti jatkaa siitä vaiheesta, jossa se oli, suorittamatta `on_enter_tool`-työkalua, toistamatta `say`-tekstiään tai esittelemättä itseään uudelleen. Kerätyt arvot jaetaan kaikkien puhelussa olevien agenttien kesken.

- Kohdeagentin on kuuluttava samaan organisaatioon, eikä agentti voi siirtää puhelua itselleen.
- Kaikki puhelutason asetukset pysyvät puheluun vastanneella agentilla: tuote, kielet, kuka puhuu ensin, vastaaja, suostumusilmoitus ja kaikki muut puheluasetukset.
- Kohdeagentit voivat siirtää puhelun edelleen ja takaisin. Yksi puhelu voi saavuttaa enintään 8 agenttia.
- Testipuhelu suorittaa testaamasi agentin luonnosversion. Agentit, joille se siirtää puhelun, suorittavat julkaistuja versioitaan.
- Jos kahdella agentilla on samanniminen työkalu eri määritelmillä, puhelussa säilytetään vain yksi, ja puheluun vastanneen agentin työkalu voittaa aina. Rakentaja varoittaa sinua tallentaessasi.
- Agentilla voi olla siirtoja ilman vaiheita. Sen koko kehotetta käytetään sellaisenaan.

`go_to_step` ja `hand_off` on varattu vaiheita tai siirtoja käyttäville agenteille, joten omat työkalusi eivät voi käyttää näitä nimiä.

## Missä näet tämän puhelussa

Avaa puhelu kohdassa **Puheluhistoria**. Transkription vieressä oleva vaiheiden aikajana näyttää jokaisen vaiheen, johon puhelu siirtyi, ja syyn siihen. Kerätyt arvot luetellaan sen yhteydessä.

[Puheluobjekti](/api-reference/calls#retrieve-a-call) ja puhelun valmistumisen webhook ([`telephony.complete` / `web.complete`](/fi/webhooks/call-complete)) sisältävät samat tiedot kentissä `steps_trace` ja `collected_values`. Molemmat puuttuvat puheluista, joissa ei ole vaiheita.

```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` on `a`, jota seuraa agentin tunnus. `via` kertoo, mikä siirsi puhelua:

| `via` | Merkitys |
| --- | --- |
| `start` | Puhelu alkoi tässä vaiheessa. |
| `model` | Malli valitsi vaiheen käyttämällä `go_to_step`-toimintoa, `when`- tai `global_when`-ehtoa. |
| `condition` | `condition`- tai `always`-siirtymä täsmäsi. |
| `on_enter` | Siirtymä täsmäsi webhook-vaiheen tuloksen perusteella. |
| `handoff` | Toinen agentti otti vastuun. |

## Missä vaiheet suoritetaan

Vaiheet suoritetaan natiivisti tuotteissa **Spark**, **Bolt** ja kaikissa **Storm**-tuotteissa saapuvissa, lähtevissä ja kampanjapuheluissa, testipuheluissa sekä verkko- ja widget-puheluissa.

Kaikkialla muualla agentti toimii edelleen, mutta ilman rakennetta: se suorittaa tasoitetun kehotteen, joka yhdistää jaetut ohjeet ja kaikki vaiheet järjestyksessä. Tämä kattaa:

- kokeelliset Bolt-tuotteet;
- [Realtime](/fi/guides/use-with-openai-realtime)-istunnot, mukaan lukien tallennetun agentin istunnot;
- [dynaamisen puhelukokoonpanon](/fi/guides/dynamic-call-config) webhookin palauttamat inline-kokoonpanot. Webhook, joka palauttaa `agent_id`-tunnuksen, käyttää kyseisen agentin vaiheita.

## Rajoitukset

| Rajoitus | Arvo |
| --- | --- |
| Vaiheita agenttia kohden | 100 |
| Kerättyjä arvoja vaihetta kohden | 20 |
| Siirtokohteita agenttia kohden | 8 |
| Yhdessä puhelussa tavoitettavia agentteja | 8 |
| `steps`-JSONin koko | 200 KB |
| Vaiheen `instructions` | 20 000 merkkiä |
| `say`-rivi | 1 000 merkkiä |
| Tallennettu `on_enter_tool`-tulos | 4 KB |

Tallennus, joka rikkoo sääntöä, palauttaa virheen `400` ja virheellisen kentän polun, kuten
`steps.steps[2].transitions[0].to`. Kohdissa `tools` ja
`on_enter_tool` olevien työkalujen on oltava agenttiin liitettyjä työkaluja.

Vaihekohtaisia kieliä, mallin ohittavia skriptattuja vaiheita ja
say-rivien sisällä kerättyjä arvoja ei tueta.

## Tuodut agentit

[Tuominen](/fi/guides/import-agents) Retellistä, Blandista, Vapista tai ElevenLabsista
tuo monikehotteiset agentit, virrat, polut ja työnkulut vaiheina sekä
joukkueet ja agenttisiirrot siirtoina tuotujen agenttien välillä. Tarkistussivu
näyttää molemmat ennen tuontia.

## Esimerkki: hammashoidon esitietojen keruu

Kolme vaihetta järjestyksessä: tervehdys, potilaan tietojen kerääminen, ajanvaraus.

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

Ota käyttöön vaiheittain komennolla `PATCH /v1/agents/{agent_id}`, kokeile sitä **Puhu**-toiminnolla ja julkaise sitten.
Vaihe `details` ei voi siirtää ajanvaraukseen ennen kuin nimi, syntymäaika
ja syy on kerätty; `new_patient` on valinnainen.

## Esimerkki: ikärajoitettu haara

Malli voi keskustella kenen tahansa kanssa, mutta koodi päättää, kenelle varataan aika. Kerää
ikä ja reititä sen perusteella ennen kuin mallin oma valinta huomioidaan.

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

Soittaja, joka sanoo viisitoista, siirtyy vaiheeseen `guardian` riippumatta siitä, mitä malli päättää.
Kaikki muut siirtyvät vaiheeseen `book`. Molemmat ovat tavallisia vaiheita muualla kaaviossa.

## Esimerkki: tilin hakemisen webhook-vaihe

Soittaja antaa tilinumeron, haku suoritetaan seuraavaan vaiheeseen siirryttäessä,
ja sen tulos valitsee reitin. Vaiheet `not_found`, `collections` ja `support`
on jätetty pois lyhyyden vuoksi.

```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` vastaanottaa `account_number`-arvon, koska sen parametrilla on
sama nimi. Jos vastausrungossa on `"found": false`, puhelu siirtyy vaiheeseen
`not_found`. Jos `account_status` on `past_due` tai `suspended`, puhelu siirtyy
vaiheeseen `collections`. Aktiivinen tili jää vaiheeseen `lookup`, jossa malli
auttaa ja siirtyy sitten vaiheeseen `support`. Jos haluat ohjata epäonnistuneen
haun omaan vaiheeseensa, lisää ensin ehtoja tilalle: virhevastaus tallentaa
tilakoodinsa, joten
`{"value": "lookup_account_result.status", "op": "gte", "target": 400}`
tunnistaa sen, ja aikakatkaisu tai vastaamattomuus tallentaa arvon `"error"`,
joten
`{"value": "lookup_account_result.status", "op": "eq", "target": "error"}`
tunnistaa sen.

## Esimerkki: vastaanotosta laskutukseen

Kaksi agenttia. Vastaanotto (agentti `412`) vastaa kaikkiin puheluihin ja
siirtää laskutuskysymykset laskutusagentille (agentti `413`), jolla on oma
kehote, työkalut ja ääni.

Vastaanotossa:

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

Laskutusagentissa, jotta se voi siirtää soittajan takaisin:

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

Vastaanotto sanoo lyhyen lauseen, kuten "Yhdistän sinut laskutustiimiimme",
ja laskutusagentti esittelee itsensä ja jatkaa keskustelua siitä, mihin
vastaanotto sen jätti. Kun laskutus siirtää puhelun takaisin, vastaanotto
jatkaa siitä, mihin se jäi, tervehtimättä soittajaa uudelleen. Puhelun tuote,
kielet, suostumusilmoitus ja muut puheluasetukset säilyvät vastaanotolla,
koska se vastasi puheluun.

Jos laskutus tarvitsee vain omat ohjeensa eikä omaa agenttia, käytä sen sijaan
vastaanotossa globaalia vaihetta. Kun kysymykseen on vastattu, puhelu palaa
siihen vaiheeseen, jossa soittaja oli:

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

## Seuraavat vaiheet

<CardGroup cols={2}>
  <Card title="Ohjekirjoitusopas" icon="pen" href="/fi/guides/prompting">
    Kirjoita yhteiset ohjeet ja vaiheohjeet, jotka toimivat puhelussa.
  </Card>
  <Card title="Rakenna työkalun integraatio" icon="code" href="/fi/guides/build-tool-integration">
    Luo työkalut, joita vaiheesi ja webhook-vaiheesi kutsuvat.
  </Card>
  <Card title="Testaa agenttejasi" icon="flask" href="/fi/guides/test-agents">
    Suorita samat skenaariot jokaisessa haarassa ennen käyttöönottoa.
  </Card>
  <Card title="Agenttien API" icon="robot" href="/api-reference/agents">
    Kaikki agentin kentät, luonnokset ja käyttöönotto.
  </Card>
</CardGroup>
