
# Mukautetut funktiot

Mukautettujen toimintojen avulla tekoälybottisi voi muodostaa yhteyden muihin järjestelmiin live-keskustelujen aikana. Sen sijaan, että sanoisi "Tarkistan asian ja palaan asiaan", botti voi etsiä tilauksen tilan, tarkistaa varastotilanteen tai luoda tietueen CRM-järjestelmääsi (asiakkuudenhallintajärjestelmä – ohjelmisto, jota käytät liidien ja asiakkaiden seuraamiseen, kuten HubSpot tai Salesforce) – kaikki tämä reaaliajassa, asiakkaan odottaessa.


---

## Mukautetut funktiot vs. Webhookit

Tämä on yleisin sekaannuksen aihe, joten asia on hyvä selvittää ennen kuin rakennat mitään.

| | Webhookit | Mukautetut funktiot |
|---|----------|------------------|
| **Suunta** | Yksisuuntainen (lähetä ja unohda) | Kaksisuuntainen (kutsu ja odota) |
| **Mitä botti tekee** | Lähettää ilmoituksen, kun jotain tapahtuu, ja jatkaa toimintaansa. | Kutsuu, **pysähtyy, odottaa vastausta** ja käyttää saatua tietoa keskustelun jatkamiseen. |
| **Näkyvyys keskusteluun** | Lopputulos ei näy botille – se ei koskaan näe, mitä tapahtui. | Vastaus syötetään suoraan takaisin tekoälylle, joten botti voi lainata sitä, analysoida sitä ja vastata asiakkaalle sen perusteella. |
| **Paras käyttökohde** | Tapahtumien lokitus, tietojen synkronointi CRM-järjestelmään, ulkoisten automaatioiden (Zapier, Make, n8n) käynnistäminen. | Kaikki, missä botin on saatava **vastaus** ennen kuin se voi vastata – live-haut, reaaliaikainen hinnoittelu, sisällön luominen lennosta. |

**Milloin valita mikäkin:** Jos sinun tarvitsee vain *ilmoittaa* toiselle järjestelmälle, että jotain tapahtui, käytä webhookia – yksisuuntaista automatisoitua viestiä, joka lähetetään toiseen järjestelmään (katso **Asetukset → Integraatiot → Webhookit**). Jos botin on *opittava* jotain toisesta järjestelmästä ennen keskustelun jatkamista, käytä mukautettua toimintoa.

---

## Esimerkkejä siitä, mitä mukautetut funktiot mahdollistavat

Koska vastaus syötetään takaisin keskusteluun, mukautetut funktiot mahdollistavat asioita, joihin webhookit eivät yksinkertaisesti pysty:

- **Shopify- tai WooCommerce-varastotilanteen reaaliaikainen haku** — Ennen kuin botti antaa tarjouksen asiakkaalle, se tarkistaa varastotilanteen reaaliajassa ja vastaa "Kyllä, meillä on 12 kappaletta kokoa M" sen sijaan, että sanoisi "tarkistan asian ja palaan asiaan".
- **Dynaaminen hinnoittelu Google Sheetsistä** — Myyntitiimisi päivittää hinnat taulukkoon; botti lukee uusimman rivin kesken keskustelun ja ilmoittaa nykyisen hinnan ilman, että kenenkään tarvitsee koskea tekoälyn asetuksiin.
- **Puhe-tekoälyn takaisinsoittoagentti** — Kun botti luokittelee liidin, se käynnistää puheagentin (esimerkiksi ElevenLabs-pohjaisen soittajan), joka soittaa liidille takaisin muutamassa minuutissa, ja vahvistaa asiakkaalle: "hienoa, odota puhelua seuraavan 5 minuutin kuluessa."
- **Mukautettu tarjous-PDF, joka luodaan ja lähetetään sähköpostitse kesken keskustelun** — Botti kerää vaatimukset, kutsuu tarjousten luontijärjestelmääsi, saa takaisin PDF-linkin ja kertoo asiakkaalle: "lähetin juuri tarjouksesi sähköpostitse – tarkista saapuneet viestisi."

---

## Mitä mukautetut funktiot voivat tehdä?

Ajattele mukautettuja funktioita tapana antaa botillesi supervoimia pelkän keskustelun lisäksi. Tässä on tosielämän esimerkkejä:

- **Tilauksen seuranta** - Asiakas kysyy "Missä tilaukseni on?" ja botti tarkistaa verkkokauppajärjestelmäsi ja vastaa toimituksen tilalla ja seurantalinkillä
- **Varastotilanteen tarkistus** - "Onko teillä tätä kokoa 10?" Botti tarkistaa varastojärjestelmäsi ja antaa reaaliaikaisen vastauksen
- **CRM-päivitykset** - Kun botti luokittelee liidin, se luo tai päivittää tietueen automaattisesti HubSpotissa, Salesforcessa tai missä tahansa muussa CRM-järjestelmässä
- **Tarjouksen luominen** - Botti kerää asiakkaan vaatimukset ja luo henkilökohtaisen tarjouksen hinnoittelujärjestelmästäsi
- **Varaus** - Botti luo tapaamisen ulkoiseen varausjärjestelmääsi
- **Alennuskoodin vahvistus** - "Onko tämä kuponkikoodi voimassa?" Botti tarkistaa ja vahvistaa asian
- **Asiakastilin haku** - Palaava asiakas tunnistetaan automaattisesti ja hänen tilitietonsa haetaan esiin

**Asiakas ei koskaan näe, mitä kulissien takana tapahtuu.** Hän kokee vain botin, joka osaa vastata kysymyksiin oikeilla ja ajantasaisilla tiedoilla.

---

## Miten mukautetut funktiot toimivat (yksinkertaistettu versio)

Tässä on se, mitä tapahtuu, kun mukautettu funktio käynnistyy keskustelun aikana:

1. **Asiakas kysyy jotain**, mikä vaatii reaaliaikaista tietoa (esim. "Missä tilaukseni on?")
2. **Botti tunnistaa**, että sen on käytettävä mukautettua funktiota vastatakseen
3. **Botti kerää** puuttuvat tiedot asiakkaalta (esim. "Mikä on tilausnumerosi?")
4. **Alusta lähettää pyynnön** järjestelmääsi (verkkosivustollesi, CRM-järjestelmääsi tai muuhun työkaluun) asiaankuuluvilla tiedoilla
5. **Järjestelmäsi vastaa** tiedoilla (esim. tilauksen tila, seurantanumero, toimituspäivä)
6. **Botti lukee vastauksen** ja muotoilee luonnollisen vastauksen: "Tilauksesi ORD-4582 on lähetetty ja sen pitäisi saapua perjantaihin mennessä!"

### Mitä mukautetun funktion kutsuminen maksaa

Jokainen mukautetun funktion kutsu laskutetaan Agenttisi tekoälyn laatutason mukaan:

| Tekoälyn laatutaso | Krediittejä per mukautetun funktion kutsu | Kun oma Anthropic-avain (BYOK) on yhdistetty |
|---|---|---|
| Pro | 1 krediitti | 0 krediittiä – suoritetaan omalla avaimellasi |
| Economy (vanhentunut) | 0,5 krediittiä | 0 krediittiä – suoritetaan omalla avaimellasi |
| Max | 0,25 krediittiä | edelleen 0,25 krediittiä, laskutetaan vaikka oma avain olisi yhdistetty, koska Max suoritetaan omalla mallillamme |
| Mini | 0,15 krediittiä | edelleen 0,15 krediittiä, laskutetaan vaikka oma avain olisi yhdistetty, koska Mini suoritetaan omalla mallillamme |

---

## Mukautetun funktion määrittäminen (vaihe vaiheelta)

1. Napsauta pääsivupalkin kohdasta **AI Studio** vaihtoehtoa **Custom Functions**.


2. Napsauta oikeassa yläkulmassa olevaa vihreää **+ Add Function** (tai **New function**) -painiketta.


Mukautettujen funktioiden luettelo näyttää taulukon, jossa on seuraavat sarakkeet:

| Sarake | Mitä se näyttää |
|--------|--------------|
| **Nimi** | Funktion nimi (esim. `check_order_status`) |
| **Kuvaus** | Lyhyt yhteenveto siitä, mitä funktio tekee (lyhennetty 50 merkkiin taulukossa) |
| **Metodi** | Käytetty HTTP-metodi, näytetään värillisenä merkkinä: GET (sininen), POST (vihreä), PUT (oranssi), DELETE (punainen) |
| **Luotu** | Päivämäärä, jolloin funktio luotiin |

Tämän avulla voit helposti silmäillä funktioitasi ja löytää tarvitsemasi.

### Vaihe 1: Anna sille nimi ja kuvaus


| Kenttä | Mitä syöttää | Esimerkki |
|-------|--------------|---------|
| **Nimi** | Lyhyt nimi, jossa käytetään kirjaimia, numeroita ja alaviivoja | `check_order_status` |
| **Kuvaus** | Selitä, mitä tämä funktio tekee (tekoäly lukee tämän päättääkseen, milloin sitä käytetään) | "Etsii asiakkaan tilauksen nykyisen tilan tilausnumeron perusteella" |
| **Tarkoitus (AI-toiminto)** | Kerro tekoälylle tarkalleen, milloin ja miten tätä funktiota käytetään | "Käytä tätä, kun asiakas kysyy tilauksensa tilasta, toimituksesta tai kuljetuksesta. Pyydä ensin tilausnumeroa." |

**Vinkki:** Ole erittäin tarkka kuvauksessa ja tarkoituksessa. Mitä selkeämpi olet siitä, milloin funktiota tulisi käyttää, sitä luotettavammin botti käyttää sitä oikeaan aikaan.

### Vaihe 2: Määritä yhteys

Sinun on kerrottava sovellukselle, minne pyyntö lähetetään:

| Kenttä | Mitä syötetään | Esimerkki |
|-------|--------------|---------|
| **URL** | Järjestelmäsi päätepisteen verkko-osoite (järjestelmäsi tietty osoite, joka vastaanottaa pyynnön ja lähettää tiedot takaisin) | `https://api.yourstore.com/v1/orders/status` |
| **Menetelmä** | Lähetettävän pyynnön tyyppi | Katso vaihtoehdot alta |

**Minkä metodin valita:**

| Metodi | Milloin käyttää |
|--------|---------------|
| **GET** | Tietojen etsiminen (tilauksen tila, varasto, tilitiedot) |
| **POST** | Uusien tietueiden luominen (tukipyynnöt, liidit, varaukset) tai monimutkaiset haut |
| **PUT** | Olemassa olevan tietueen päivittäminen kokonaan |
| **PATCH** | Olemassa olevan tietueen osittainen päivittäminen |
| **DELETE** | Tietueen poistaminen |

Jos et ole varma, kumpaa käyttää, tarkista asia kehittäjältäsi tai järjestelmän, johon olet muodostamassa yhteyttä, dokumentaatiosta. **GET** (hakuja varten) ja **POST** (tietueiden luomista varten) ovat yleisimmät.

### Vaihe 3: Lisää todennusotsikot (Authentication Headers)

Useimmat järjestelmät vaativat todennuksen pyyntöjen hyväksymiseksi. Lisää tarvittavat otsikot:

| Otsikko | Esimerkkiarvo |
|--------|--------------|
| `Authorization` | `Bearer your-api-key-here` |
| `Content-Type` | `application/json` |

**Tietoturvavinkki:** Käytä erillistä API-avainta, jolla on rajoitetut käyttöoikeudet. Älä käytä järjestelmänvalvojan tason tunnuksia.

**Mistä löydät API-avaimet:** Tarkista sen järjestelmän asetukset tai kehittäjäosio, johon olet muodostamassa yhteyttä (esim. CRM, verkkokauppa-alusta tai varaustyökalu).

### Vaihe 4: Määritä syöte (Mitä botti lähettää)

Syöteparametrit ovat niitä tietoja, joita botti kerää keskustelusta ja lähettää järjestelmääsi.

Määritä jokaiselle parametrille:

| Ominaisuus | Mitä se tarkoittaa |
|----------|--------------|
| **Nimi** | Parametrin nimi (on vastattava sitä, mitä järjestelmäsi odottaa) |
| **Tyyppi** | Minkä tyyppistä tietoa se on (teksti, numero, tosi/epätosi jne.) |
| **Kuvaus** | Kerro tekoälylle, mikä tämä tieto on ja mistä se löytyy keskustelusta |
| **Pakollinen** | Jos asetettu arvoon Kyllä, botti kysyy tätä tietoa asiakkaalta ennen jatkamista |

**Käytettävissä olevat parametrityypit:**

| Tyyppi | Mitä se tarkoittaa |
|------|--------------|
| **string** | Teksti (nimet, tilausnumerot, osoitteet) |
| **number** | Numeerinen arvo (määrä, hinta) |
| **boolean** | Tosi tai epätosi (kyllä/ei-arvot) |
| **array** | Luettelo kohteista. Lähetetään oikeana JSON-luettelona – **Suorita testi** -kohdassa voit kirjoittaa sen muodossa `[8624]`, `["a", "b"]` tai yksinkertaisesti pilkuilla erotettuna (`8624, 8625`), jolloin se muunnetaan puolestasi. Jos API on tarkka luettelon sisällöstä – esim. vain numerot – aseta valinnainen **Kohteen tyyppi** tyypin viereen, jolloin jokainen luettelon arvo muunnetaan kyseiseen muotoon. |
| **query_param** | Teksti, joka lähetetään URL-parametrina pyynnön rungon sijaan. Käytä tätä, kun API odottaa tietoja URL-osoitteessa (esim. `?order_id=123`). |

Jokaisella parametrilla on myös valinnainen **Request body path** -kenttä. Normaalisti parametri lähetetään pyynnön rungon ylimmän tason kenttänä (tai kyselymerkkijonon arvona `query_param`-tyypille). Jos päätepisteesi odottaa sen olevan sisäkkäinen — esim. `{"order": {"id": "ORD-123"}}` — aseta poluksi `order.id`, niin alusta sijoittaa arvon sinne puolestasi.


**Esimerkki: Tilausten tilan hakua varten voit määrittää:**

- **order_number** (string, pakollinen): "Asiakkaan tilausnumero. Alkaa yleensä ORD- ja sitä seuraa numeroita. Kysy tätä asiakkaalta, jos hän ei ole maininnut sitä."
- **email** (string, valinnainen): "Asiakkaan sähköpostiosoite lisävahvistusta varten. Tarvitaan vain, jos tilausnumero yksinään ei löydä vastaavuutta."

### Mitä järjestelmäsi vastaanottaa automaattisesti

Määrittelemiisi syöteparametreihin lisäksi alusta sisällyttää automaattisesti järjestelmätietoja jokaiseen pyyntöön. Päätepisteesi vastaanottaa nämä `system`-kentässä:

| Järjestelmäkenttä | Mitä se sisältää |
|-------------|----------------|
| `system.contactId` | Keskustelussa olevan yhteyshenkilön alustatunnus |
| `system.campaignId` | Kampanjatunnus, johon keskustelu kuuluu |
| `system.userId` | Käyttäjätunnuksesi |
| `system.channel` | Viestintäkanava (esim. `"whatsapp"`, `"instagram"`) |
| `system.contact` | Koko yhteystietue (nimi, puhelinnumero, sähköposti, tunnisteet jne.) |
| `system.campaign` | Kampanjan konfiguraatio |
| `system.test` | `true` jos kyseessä on Kokeile-testi, `false` live-keskusteluille |

Tämä on hyödyllistä, jos järjestelmäsi on tunnistettava yhteyshenkilö, tarkistettava mikä kampanja käynnisti funktion tai toimittava eri tavalla testauksen aikana.

> **Etkö tarvitse järjestelmätietoja?** Kytke **Ohita järjestelmätiedot** (Skip System Data) -valitsin päälle funktion rakennustyökalussa. Botti lähettää tällöin vain määrittelemäsi syöteparametrit — ei yhteyshenkilö- tai kampanjatietoja. Käytä tätä, jos päätepisteesi hylkää odottamattomat kentät tai haluat vain kevyemmän hyötykuorman.

### Vaihe 5: Testaa se ja anna botin lukea vastaus

Vastauskenttiä ei yleensä tarvitse kartoittaa lainkaan. Kun päätepisteesi vastaa, botti lukee koko JSON-vastauksen ja käyttää funktion **Description**- ja **Purpose (AI Action)** -kenttiä — sekä kunkin parametrin omaa kuvausta — selvittääkseen, mikä on olennaista, ja esittääkseen sen luonnollisesti. Selkeä kuvaus itse funktiosta ("Hakee asiakastilauksen nykyisen tilan, mukaan lukien toimitustiedot ja seurannan") tekee tässä enemmän työtä kuin kenttäkohtainen kartoitus.

Jos päätepisteesi palauttaa suuren vastauksen ja haluat botin näkevän vain muutamia tiettyjä arvoja, avaa **Response mapping** -osio (oletuksena tiivistetty, juuri Test-painikkeen yläpuolella). Jokainen rivi valitsee yhden ylimmän tason kentän vastauksesta: **Response field** on kentän nimi API:n JSON-vastauksessa, ja **Output field** on nimi, jolla botti vastaanottaa sen. Kun vähintään yksi rivi on täytetty, botti saa vain kartoittamasi arvot koko vastausrungon sijaan. Jätä osio tyhjäksi, jos haluat säilyttää oletusarvoisen koko vastauksen toimintatavan.


Ennen kuin tallennat, käytä rakennustyökalun alareunassa olevaa **Testi**-osiota lähettääksesi pyynnön täsmälleen määritetyllä tavalla ja nähdäksesi todellisen vastauksen poistumatta sovelluksesta:


Tässä näkyvä vastaus on päätepisteen raaka vastaus. Jos olet määrittänyt **Vastausten yhdistämisen** (Response mapping) yllä, botti vastaanottaa oikeassa keskustelussa vain kyseiset yhdistetyt kentät — testi näyttää aina koko raa'an vastauksen, jotta näet, mitä kenttiä on käytettävissä yhdistämiseen. Jos jokin näyttää väärältä (odottamattomia kenttien nimiä, ylimääräistä sisäkkäisyyttä), korjaa se päätepisteessäsi tai säädä yhdistämistä.

---

## Toimintojen määrittäminen agentille

Kun olet luonut mukautetun toiminnon, sinun on kerrottava jokaiselle agentille, mitä toimintoja se voi käyttää:

1. Avaa [Agentti](../ai-agents/ai-agents.md) kohdasta **AI Studio → AI-agentit**.
2. Siirry sen **AI-kyvykkyydet**-välilehdelle. (Kampanjalle, joka ylläpitää omia AI-asetuksiaan suoraan erillisen agentin sijaan, sama luettelo näkyy kyseisen kampanjan omassa **AI-kyvykkyydet**-vaiheessa.)
3. Näet luettelon kaikista luomistasi mukautetuista funktioista. Ota käyttöön jokainen funktio, jota haluat tämän agentin botin voivan kutsua.
4. Napsauta alareunasta **Tallenna muutokset**. Valinnat tulevat voimaan vasta tallennuksen jälkeen.


Vain määritetyt toiminnot ovat botin käytettävissä kyseiselle agentille. Tämä estää bottia käyttämästä vahingossa toimintoja, jotka eivät ole olennaisia.

---

## Mukautettujen funktioiden testaaminen

Ennen kuin otat ne käyttöön, testaa ne perusteellisesti:

1. **Suorita sisäänrakennettu testi** - Käytä funktion rakennustyökalun sisällä olevaa **Testi**-osiota (katso yllä) nopeaan tarkistukseen poistumatta sovelluksesta — täytä realistiset arvot ja napsauta Suorita testi.
2. **Testaa järjestelmäsi päätepistettä suoraan** - Alla olevaa täydellistä tarkistuslistaa varten erillinen työkalu, kuten Postman (tai kehittäjäsi), menee syvemmälle kuin pelkkä Suorita testi.
3. **Testaa Kokeile-toiminnolla** - Simuloi keskustelua, jossa asiakas kysyy jotain, minkä pitäisi käynnistää funktio.
4. **Tarkista vastaus** - Varmista, että botti lukee ja esittää tiedot oikein.
5. **Testaa virhetilanteet** - Mitä tapahtuu, jos asiakas antaa virheellisen tilausnumeron? Mitä jos järjestelmäsi on tilapäisesti alhaalla?

### Kun testin tulos on 401 tai 403

401- tai 403-virhe tarkoittaa, että päätepisteesi vastaanotti pyynnön, mutta hylkäsi sen. Tunnusmerkki tästä on se, että **omissa lokeissasi ei näy mitään** — useimmat työkalut hylkäävät luvattoman kutsun ennen kuin ne edes aloittavat työnkulkua, joten omalla puolellasi ei ole mitään nähtävää ja näyttää siltä, ettei pyyntö koskaan saapunut perille.

Kyseessä on lähes aina todennusvirhe: päätepisteesi vaatii tietynlaisia tunnisteita, mutta funktio lähettää toisenlaisia. Tarkista, että [vaiheessa 3](#step-3-add-authentication-headers) lisäämäsi otsikko on täsmälleen se, jota järjestelmäsi odottaa.

Yleisin versio tästä on **Basic Auth** -suojattu webhook (n8n, Make ja useimmat itse isännöidyt työkalut tarjoavat tämän valintaruutuna itse webhookissa), kun taas funktio lähettää mukautetun salaisen otsikon, kuten `X-My-Secret`. Basic Auth hyväksyy vain `Authorization`-otsikon, joten mukautettu otsikko jätetään huomiotta ja kutsu hylätään. Sinulla on kaksi vaihtoehtoa:

- **Poista Basic Auth käytöstä** webhookissa ja tarkista mukautettu otsikkosi työnkulun sisällä.
- **Pidä Basic Auth käytössä** ja lisää funktioon `Authorization`-otsikko, jonka arvona on sana `Basic` ja sen perässä base64-koodattu `username:password`.

Kumpi tahansa toimii — varmista vain, että molemmat osapuolet ovat yhteisymmärryksessä.

### Kun testin tulos on 404

Päätepisteen URL-osoite on väärä tai työnkulkua ei ole julkaistu. Erityisesti n8n:ssä jokaisella webhookilla on erillinen **Test**-URL ja **Production**-URL, ja testiosoite kuuntelee vain silloin, kun editori on auki. Kopioi Production-URL ja varmista, että työnkulku on aktiivinen.

### Epäonnistumisten näkeminen Kokeile- ja Keskustelut-näkymissä

Kun tekoäly kutsuu mukautettua funktiota keskustelun aikana ja kutsu epäonnistuu – esimerkiksi virheelliset tunnistetiedot, päätepiste alhaalla tai aikakatkaisu – keskustelussa näkyy nyt tästä ilmoitus: punainen **"(funktion nimi) epäonnistui"** -merkintä ilmestyy ketjuun, sekä agentin **Kokeile**-välilehdellä että todellisissa keskusteluissa **Keskustelut**-osiossa. Napsauta merkintää laajentaaksesi tiedot: päätepisteesi palauttama tilakoodi ja sen vastausrunko, jotka yleensä kertovat suoraan, mitä on korjattava (esimerkiksi `401` ja "unauthorized"-viesti tarkoittavat ongelmaa todennusotsakkeessa, aikakatkaisu taas sitä, että päätepisteen vastaus kesti yli 30 sekuntia).

Onnistuneista kutsuista näkyy myös merkintä – napsauta sitä nähdäksesi, mitä päätepisteesi todellisuudessa palautti. Tämä on nopein tapa virheenjäljitykseen integraation päästä päähän: käy testikeskustelua Kokeile-näkymässä ja napsauta sitten funktion merkintää nähdäksesi todellisen pyynnön tuloksen poistumatta sivulta.

---

## Täydellinen esimerkki: Tilauksen tilan haku

Tässä on täysin määritetty esimerkki, jota voit käyttää mallina:

**Perustiedot:**
- **Nimi:** `check_order_status`
- **Kuvaus:** "Hakee asiakkaan tilauksen nykyisen tilan, mukaan lukien toimitustiedot ja seurannan"
- **AI-toiminto:** "Käytä tätä, kun asiakas kysyy tilauksensa tilaa, paketin sijaintia tai saapumisaikaa. Pyydä aina ensin tilausnumeroa."

**Yhteys:**
- **URL:** `https://api.mystore.com/orders/lookup`
- **Metodi:** POST

**Otsakkeet:**
- `Authorization`: `Bearer sk_live_abc123`
- `Content-Type`: `application/json`

**Syöteparametrit:**
- `order_number` (teksti, pakollinen): "Asiakkaan antama tilausnumero"
- `customer_email` (teksti, valinnainen): "Asiakkaan sähköpostiosoite lisävahvistusta varten"

**Vastausten yhdistämistä ei tarvita** — kun selkeä kuvaus ja AI-toiminto on jo asetettu yllä, botti lukee minkä tahansa JSON-muotoisen vastauksen, jonka päätepisteesi palauttaa (tila, seurantanumero, toimituspäivä, tuotteet), ja päättelee, miten siitä keskustellaan.

**Miltä keskustelu näyttää:**

> **Asiakas:** Hei, missä tilaukseni on?
>
> **Botti:** Hei! Tarkistan mielelläni tilauksesi tilan. Voisitko kertoa tilausnumerosi?
>
> **Asiakas:** Se on ORD-78234
>
> **Botti:** Etsin tiedot puolestasi...
>
> Tilauksesi ORD-78234 on lähetetty ja matkalla! Arvioitu toimituspäivä on 10. maaliskuuta. Voit seurata pakettiasi täältä: https://tracking.example.com/1Z999AA1
>
> Voinko auttaa sinua vielä jossain muussa?

---

## Täydellinen esimerkki: Shopifyn tilaustila

Jos kauppa toimii Shopifyssa, sinun ei tarvitse kehittäjää rakentamaan haku-päätepistettä — Shopifyn oma järjestelmä voi vastata tilauskysymyksiin suoraan. (Tuote- ja varastokysymyksissä Shopify-kaupassa et tarvitse mukautettua funktiota lainkaan: yhdistä kaupan sisäänrakennettu palvelin sen sijaan — katso [Yhdistä Shopify-kauppa](mcp-servers.md#ready-made-example-connect-a-shopify-store).)

**Luo ensin pääsytunniste (access token) Shopifyssa.** Shopify muutti tätä vuoden 2026 aikana: sovelluksia ei voi enää luoda Shopify-ylläpidon sisällä, ja uusi sovellusnäyttö antaa sinulle **asiakastunnuksen (Client ID)** ja **asiakassalaisuuden (Client secret)** valmiin tunnisteen sijaan. Alla olevat vaiheet muuttavat ne pysyväksi tunnisteeksi. Varaa tähän noin kymmenen minuuttia, kerran per kauppa. (Jos kaupassa on jo vanhalla tavalla luotu vanhempi sovellus, sen olemassa oleva tunniste toimii edelleen – siirry suoraan alla olevaan mukautettuun toimintoon.)

1. Siirry Shopify Dev Dashboardiin osoitteessa [dev.shopify.com](https://dev.shopify.com), avaa organisaatiosi ja napsauta **Apps → Create app**. Anna sille nimi, kuten `Order lookup`.
2. Anna sovellukselle **read_orders**-oikeus, julkaise versio ja asenna sovellus kauppaan.
3. Avaa sovelluksen **Settings** ja lisää kaupan oma verkko-osoite (esimerkiksi `https://www.yourstore.com/`) sallittuihin uudelleenohjaus-URL-osoitteisiin. Tallenna.
4. Kopioi edelleen **Settings**-kohdassa **Client ID** ja **Client secret**.
5. Avaa selaimessa, jossa olet kirjautuneena kyseisen kaupan Shopify-ylläpitoon, alla oleva osoite korvaten kaupan nimi, asiakastunnus (client ID) ja uudelleenohjausosoite omillasi:
   `https://YOUR-STORE.myshopify.com/admin/oauth/authorize?client_id=YOUR-CLIENT-ID&scope=read_orders&redirect_uri=https://www.yourstore.com/&state=12345`
   Hyväksy näkyviin tuleva näyttö. Selain ohjautuu uudelleenohjausosoitteeseesi, ja osoiterivillä on nyt `code=` ja sen perässä pitkä arvo — kopioi tämä arvo. Se on voimassa vain muutaman minuutin, joten siirry suoraan seuraavaan vaiheeseen.
6. Vaihda kyseinen koodi tunnisteeseen, minkä voit tehdä kohdassa <span data-t="appName">Your AI Connector</span>. Aseta mukautetun funktion rakentajassa **Method**-kohdaksi POST ja **URL**-kohdaksi `https://YOUR-STORE.myshopify.com/admin/oauth/access_token`, lisää kolme tekstisyöteparametria nimeltään `client_id`, `client_secret` ja `code`, napsauta sitten **Test**, täytä kolme arvoa ja suorita se. Vastaus sisältää kohdan `access_token` — se on pysyvä tunnisteellasi. Kopioi se talteen, tyhjennä sitten rakentaja ja määritä varsinainen funktio alla.

**Määritä sitten mukautettu funktio:**

**Perustiedot:**
- **Nimi:** `check_shopify_order`
- **Kuvaus:** "Etsii tilauksen kaupan Shopify-järjestelmästä ja palauttaa sen tilan, seurannan ja tuotteet"
- **AI-toiminto:** "Kutsu tätä, kun asiakas kysyy tilauksensa tilaa tai toimitusta. Pyydä aina ensin tilausnumeroa."

**Yhteys:**
- **URL:** `https://YOUR-STORE.myshopify.com/admin/api/2026-01/orders.json?status=any` — korvaa `YOUR-STORE` kaupan `.myshopify.com` nimellä (tämä osoite käyttää teknistä Shopify-verkkotunnusta, ei kaupan mukautettua verkkotunnusta)
- **Menetelmä:** GET

**Otsakkeet (Headers):**
- `X-Shopify-Access-Token`: `shpat_...` (yllä oleva tunniste)

**Syöteparametrit:**
- `name` (query_param, pakollinen): "Asiakkaan tilausnumero täsmälleen sellaisena kuin se näkyy tilausvahvistuksessa, mukaan lukien #-merkki — esimerkiksi #1001. Pyydä sitä asiakkaalta, jos hän ei ole maininnut sitä."

**Vastausten yhdistämistä ei tarvita** – botti lukee palautetun tilauksen (maksun tila, toimituksen tila, seuranta, tuotteet) ja vastaa luonnollisesti.

**Hyvä tietää:** tällä tavoin luotu tunniste näkee tilaukset **viimeisten 60 päivän ajalta** — tämä riittää päivittäisiin tukikysymyksiin, mutta ei tarjoa täyttä tilaushistoriaa.

---

## Täydellinen esimerkki: Ajanvaraus

**Perustiedot:**
- **Nimi:** `create_booking`
- **Kuvaus:** "Luo uuden ajanvarauksen varausjärjestelmäämme"
- **AI-toiminto:** "Käytä tätä, kun olet vahvistanut päivämäärän, kellonajan ja yhteystiedot asiakkaan kanssa. Älä tee kutsua ennen kuin asiakas on nimenomaisesti vahvistanut haluavansa varata ajan."

**Yhteys:**
- **URL:** `https://booking.mycompany.com/api/appointments`
- **Metodi:** POST

**Syöteparametrit:**
- `date` (teksti, pakollinen): "Ajanvarauksen päivämäärä muodossa VVVV-KK-PP"
- `time` (teksti, pakollinen): "Ajanvarauksen kellonaika muodossa TT:MM"
- `name` (teksti, pakollinen): "Asiakkaan koko nimi"
- `phone` (teksti, pakollinen): "Asiakkaan puhelinnumero"
- `service_type` (teksti, pakollinen): "Varattavan palvelun tyyppi"

---

## Täydellinen esimerkki: Uutiskirjeen tilaajan lisääminen CRM-järjestelmään

Hyvin yleinen toimintatapa: botti lopettaa vastaamisen, tarjoaa uutiskirjettä, yhteyshenkilö vastaa sähköpostiosoitteellaan, ja kyseisen osoitteen tulisi päätyä suoraan sähköpostityökaluusi. Useimmat CRM-järjestelmät (FluentCRM, ActiveCampaign, MailerLite, Brevo ja muut) hyväksyvät yksinkertaisen POST-pyynnön juuri tätä varten, joten välissä ei tarvita automaatioalustaa.

Tämä esimerkki käyttää **FluentCRM**:ää WordPressissä. Rakenne on sama kaikille muille työkaluille, jotka tarjoavat "saapuvan webhookin" tai "luo tilaaja" -päätepisteen.

**Hae ensin URL-osoite CRM-järjestelmästäsi.** Avaa WordPressissä **FluentCRM → Settings → Incoming Webhooks** ja luo webhook. Valitse lista, tunnisteet ja tilaustila, jotka uusien yhteyshenkilöiden tulisi saada, ja kopioi sitten luotu webhook-URL. Kaikki tässä määritetty otetaan käyttöön automaattisesti, joten botin tarvitsee lähettää vain sähköpostiosoite.

**Määritä sitten mukautettu funktio:**

**Perustiedot:**
- **Nimi:** `add_newsletter_subscriber`
- **Kuvaus:** "Lisää henkilön uutiskirjelistallemme käyttäen chatin kautta annettua sähköpostiosoitetta"
- **AI-toiminto:** "Käytä tätä heti, kun yhteyshenkilö suostuu uutiskirjeen tilaamiseen ja antaa sähköpostiosoitteensa. Älä kutsu tätä ennen kuin he ovat todella antaneet osoitteen, äläkä kutsu sitä kahdesti samalle henkilölle."

**Yhteys:**
- **URL:** CRM-järjestelmästäsi kopioimasi webhook-URL
- **Metodi:** POST

**Syöteparametrit:**
- `email` (merkkijono, pakollinen): "Yhteyshenkilön keskustelussa antama sähköpostiosoite"
- `first_name` (merkkijono, valinnainen): "Yhteyshenkilön etunimi, jos he mainitsivat sen"

**Ohita järjestelmätiedot (Skip System Data):** kytke tämä **päälle**. CRM-järjestelmäsi tarvitsee vain yllä olevat kentät, ja kevyempi hyötykuorma välttää virheet työkaluissa, jotka hylkäävät odottamattomat kentät.

**Vastausten yhdistäminen (Response mapping):** ei tarvita tässä. Botin jatkamiseksi ei tarvitse palauttaa mitään.

**Älä unohda ottaa funktiota käyttöön keskustelua hoitavalle Agentille** (katso [Funktioiden määrittäminen Agentille](#assigning-functions-to-an-agent)). Tämä on yleisin syy siihen, miksi oikein rakennettu funktio ei koskaan käynnisty.

::: tip
**Vinkki:** botissa on myös sisäänrakennettu **Päivitä yhteyshenkilön sähköpostiosoite** -työkalu, joka tallentaa osoitteen alustan sisäiseen yhteystietueeseen. Se on erillinen tästä toiminnosta ja hyödyllinen sen rinnalla – sisäänrakennettu työkalu pitää oman yhteystietueesi täydellisenä, ja mukautettu toiminto siirtää osoitteen CRM-järjestelmääsi.
:::


---

## Vinkkejä luotettaviin mukautettuihin toimintoihin

1. **Varmista, että toistuvat pyynnöt ovat turvallisia.** Jos sama pyyntö lähetetään vahingossa kahdesti, se ei saa luoda päällekkäisiä tietueita. Verkkohäiriöt voivat toisinaan aiheuttaa tämän.

2. **Palauta selkeitä virheilmoituksia.** Jos järjestelmässäsi tapahtuu virhe, palauta ihmisen luettavissa oleva virheilmoitus. Botti välittää sen asiakkaalle tyylikkäästi.

3. **Pidä vastausajat alle 10 sekunnissa.** Jos järjestelmäsi tarvitsee enemmän aikaa, harkitse ensin nopean kuittauksen lähettämistä.

4. **Käsittele vanhentuneet tai virheelliset tunnistetiedot.** Jos API-avaimesi vanhenee, varmista, että virheilmoitus on selkeä, jotta botti osaa hälyttää ihmisen uudelleenyrityksen sijaan.

5. **Kirjoita yksityiskohtaiset kuvaukset.** Tekoäly käyttää kuvauksiasi päättääkseen, milloin funktiota kutsutaan ja miten keskustelusta poimitaan oikeat tiedot. Epämääräiset kuvaukset johtavat virheisiin.

6. **Testaa oikeilla keskusteluilla.** Kokeile-toiminto on erinomainen alkuvaiheen testaukseen, mutta seuraa ensimmäisiä live-keskustelujasi varmistaaksesi, että kaikki toimii oikeiden asiakaskyselyiden kanssa.

7. **Pidä lokia omassa päässäsi.** Pyydä kehittäjääsi lokittamaan sovelluksesta tulevat pyynnöt, jotta voit nopeasti selvittää mahdolliset ongelmat.

8. **Käytä julkista lopullista URL-osoitetta.** Funktion URL-osoitteen on oltava julkinen verkko-osoite (HTTP/HTTPS). Sisäisiä, localhost- tai yksityisverkon osoitteita ei hyväksytä turvallisuussyistä, eikä alusta seuraa uudelleenohjauksia — osoita funktio suoraan lopulliseen URL-osoitteeseen, älä sellaiseen, joka ohjaa siihen.

---

## Suoritusrajoitukset

Jokaisella mukautetulla funktiolla on valinnainen **Suoritusrajoitukset**-osio editorin alaosassa. Se määrittää, kuinka usein tekoäly voi suorittaa funktion ja voidaanko aiempaa tulosta käyttää uudelleen. Kaikki tässä on valinnaista – jätä kentät tyhjiksi, niin funktio toimii täsmälleen kuten ennenkin.


**Vain luku -funktio.** Ota tämä käyttöön, jos funktiosi vain *lukee* tietoja – kuten osakehaku, hintatarkistus, tilausten tilan haku – eikä koskaan luo tai muuta mitään. Kun tilapäinen verkkohäiriö keskeyttää tekoälyn vastauksen, alusta voi turvallisesti yrittää keskusteluvuoroa uudelleen sen sijaan, että asiakas jäisi ilman vastausta. Ota tämä käyttöön vain, jos funktio ei todellakaan koskaan kirjoita mitään: funktio, joka luo tietueita, on pidettävä pois päältä, jotta uudelleenyritys ei vahingossa suorita sitä kahdesti.

**Käytä välimuistissa olevaa tulosta toistuvissa kutsuissa.** Kun tekoäly kutsuu funktiota uudelleen samoilla syötteillä (esimerkiksi asiakas kysyy saman kysymyksen kahdesti), aiempaa tulosta käytetään uudelleen sen sijaan, että päätepistettäsi kutsuttaisiin uudelleen. Välimuistissa olevia tuloksia säilytetään enintään 24 tuntia, ja kutsu *eri* syötteillä menee aina tuoreena päätepisteeseesi.

**Suoritusten enimmäismäärä keskustelua kohden.** Ehdoton yläraja sille, kuinka monta kertaa funktio voi suorittua yhden keskustelun aikana. Aseta arvoksi 1 funktioille, joiden tulisi suorittua vain kerran keskustelua kohden – kuten tarjouksen luominen, takaisinsoiton käynnistäminen tai automaation aloittaminen. Kun raja saavutetaan, tekoälylle kerrotaan, että funktio on jo suoritettu, ja sille annetaan viimeisin tulos, jotta se voi edelleen vastata asiakkaalle sen sijaan, että se vaikenisi.

**Suoritusten enimmäismäärä aikavälillä.** Aikarajoitus: esimerkiksi enintään 5 suoritusta 60 minuutin aikana. Hyödyllinen funktioille, jotka kutsuvat maksullisia kolmannen osapuolen palveluita tai käynnistävät raskaampia automaatioita. Molemmat kentät on täytettävä (suoritusten määrä ja aikaväli minuuteissa, enintään 7 päivää).

Muutama huomioitava asia:

- Rajoitukset laskevat vain **onnistuneet** suoritukset. Päätepisteessäsi epäonnistunut kutsu ei kuluta kiintiötä.
- Kun suoritus estetään rajoituksen vuoksi, asiakasta ei jätetä pulaan – tekoälylle kerrotaan syy, ja se toimii jo hallussaan olevien tietojen perusteella.
- Rajoitukset koskevat kaikkia paikkoja, joissa funktio suoritetaan: tavallisia keskusteluja kaikissa kanavissa sekä automaation hallinnoimia funktioita. Kokeilutilan (Try Out) testikeskusteluja ei lasketa eikä rajoiteta.

---

## Sisäänrakennetut bottityökalut

Itse luomiesi mukautettujen funktioiden lisäksi alusta sisältää kirjaston valmiita työkaluja, joita tekoälybotti voi käyttää keskustelun aikana. Nämä kattavat yleisimmät botin tarvitsemat toiminnot — tiimin jäsenelle hälyttäminen, ajanvaraus, yhteystiedon merkitseminen, verkkosivuston haku, jatkotoimenpiteiden ajoittaminen ja paljon muuta — joten sinun ei tarvitse rakentaa niitä alusta alkaen.

**Botti päättää, milloin kutakin työkalua käytetään**, perustuen keskustelun tapahtumiin ja siihen, miten agenttisi (ja siihen liitetty kampanja) on määritetty. Useimmat näistä työkaluista aktivoituvat automaattisesti, kun niihin liittyvä ominaisuus otetaan käyttöön (esimerkiksi varaustyökalut tulevat saataville vasta, kun yhdistät kalenterin ja otat varaukset käyttöön).

**Krediittikustannus:** Jokainen työkalukutsu laskutetaan Agenttisi tekoälyn laatutason mukaan, ja itse rakentamasi mukautetut funktiot laskutetaan samalla tavalla:

| Tekoälyn laatutaso | Krediittejä per työkalukutsu | Kun oma Anthropic-avain (BYOK) on yhdistetty |
|---|---|---|
| Pro | 1 krediitti | 0 krediittiä – suoritetaan omalla avaimellasi |
| Economy (vanhentunut) | 0,5 krediittiä | 0 krediittiä – suoritetaan omalla avaimellasi |
| Max | 0,25 krediittiä | edelleen 0,25 krediittiä, laskutetaan vaikka oma avain olisi yhdistetty, koska Max suoritetaan omalla mallillamme |
| Mini | 0,15 krediittiä | edelleen 0,15 krediittiä, laskutetaan vaikka oma avain olisi yhdistetty, koska Mini suoritetaan omalla mallillamme |

### Tiimi- ja tehtävätyökalut

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Hälytä tiimin jäsentä** | Keskeyttää botin tämän yhteyshenkilön kohdalla ja lähettää tiimillesi sähköpostin, että ihmistä tarvitaan. Keskustelu merkitään, jotta tiimin jäsen voi ottaa sen hoitaakseen. | Kun asiakas pyytää ihmistä, on turhautunut tai kysyy jotain, mihin botilla ei ole lupaa tai kykyä vastata. |
| **Luo tehtävä** | Luo uuden tehtävän tehtävälistallesi, joka on valinnaisesti linkitetty yhteyshenkilöön ja keskusteluun. Botti jatkaa vastaamista normaalisti – tehtävä on vain muistutus tiimillesi jatkotoimenpiteitä varten. | Ei-kiireellisiin asioihin, kuten ominaisuuspyyntöihin, lisämyyntimahdollisuuksiin tai takaisinsoittoon, joka tiimin tulisi hoitaa myöhemmin. |
| **Ehdota FAQ-päivitystä** | Kun botti kohtaa kysymyksen, johon se ei osaa vastata hyvin, se luo tehtävän, jossa pyydetään tiimiäsi lisäämään vastaus tietopankkiin. | Kun yhteyshenkilö kysyy jotain, mitä olemassa olevat FAQ-kysymykset eivät kata – jotta puute korjataan seuraavaa kertaa varten. |
| **Lisää kontekstia FAQ-ehdotukseen** | Jos toinen yhteyshenkilö kysyy myöhemmin samankaltaista kysymystä eri näkökulmasta, botti lisää kyseisen kontekstin olemassa olevaan FAQ-ehdotukseen sen sijaan, että loisi kaksoiskappaleen tehtävästä. | Automaattinen – pitää tehtävälistasi siistinä, kun useat ihmiset nostavat esiin saman tiedonpuutteen. |

### Yhteystietotyökalut

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Tunnisteet** | Suoritetaan automaattisesti jokaisen bottivastauksen jälkeen — se ei ole työkalu, jonka asiakasrajapinnassa oleva botti päättää kutsua. Järjestelmä tarkistaa viimeisimmän keskustelun ja lisää asiaankuuluvat tunnisteet, käyttäen mahdollisuuksien mukaan olemassa olevia tunnisteitasi (ja luoden uuden vain tarvittaessa). | Automaattisesti — aina kun keskustelu paljastaa jotain segmentoinnin arvoista, kuten kiinnostuksen, aikeen, liidin laadun tai kielen. |
| **Päivitä yhteystiedon nimi** | Tallentaa yhteystiedon etu- ja/tai sukunimen, kun he jakavat sen. | Kun asiakas esittelee itsensä tai korjaa nimensä. |
| **Päivitä yhteystiedon sähköposti** | Tallentaa yhteystiedon sähköpostiosoitteen, kun he jakavat sen. | Kun asiakas antaa sähköpostiosoitteen — uutiskirjeitä, kuitteja, tilien hakuja jne. varten. |

### Ajanvaraus- ja varaustyökalut

Nämä työkalut ovat käytettävissä vain, kun varaukset on otettu käyttöön agenttiisi linkitetyssä kampanjassa ja kalenteritapahtuman tyyppi on määritetty.

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Tarkista vapaat ajat** | Etsii yhdistetystä kalenteristasi vapaat ajat tietylle päivälle tai ajanjaksolle. | Kun asiakas haluaa tehdä varauksen ja botin on tarjottava todellista saatavuutta. |
| **Varaa aika** | Luo varauksen kalenteriisi ja vahvistaa varauksen asiakkaalle. | Kun asiakas on vahvistanut tietyn päivämäärän ja kellonajan. |
| **Siirrä varaus** | Siirtää olemassa olevan varauksen uudelle päivälle ja kellonajalle. | Kun asiakas pyytää varauksen siirtämistä. |
| **Peruuta varaus** | Peruuttaa olemassa olevan varauksen. | Kun asiakas pyytää peruutusta. |
| **Etsi varauksia** | Hakee yhteyshenkilön olemassa olevat varaukset, jotta botti tietää, mitä on jo varattu. | Kun asiakas kysyy "milloin varaukseni on?" tai ennen kuin botti tarjoaa varauksen siirtämistä. |

### Tietopankki- ja verkkotyökalut

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Etsi verkkosivustoltasi** | Skannaa kampanjan dynaamisten URL-osoitteiden luetteloon lisäämäsi URL-osoitteet löytääkseen tuotesivuja, artikkeleita tai muuta sisältöä, joka vastaa asiakkaan kysymykseen. Käytettävissä vain, kun **AI-verkkohaku** on päällä ja olet lisännyt vähintään yhden dynaamisen URL-osoitteen. Jos AI-verkkohaku on pois päältä, botti ei voi lukea sivuja tai linkkejä – edes niitä, jotka asiakas liittää chattiin. | Kun asiakas kysyy jotain, mikä löytyy todennäköisesti verkkosivustoltasi – tuotteet, hinnoittelu, sijainnit, käytännöt. |
| **Tarkista linkki** | Lukee tietyn URL-osoitteen sisällön, jotta botti voi vastata kyseistä sivua koskeviin kysymyksiin. Käytettävissä vain, kun **AI-verkkohaku** on päällä ja olet lisännyt vähintään yhden dynaamisen URL-osoitteen. Jos AI-verkkohaku on pois päältä, botti ei voi lukea sivuja tai linkkejä – edes niitä, jotka asiakas liittää chattiin. | Kun asiakas jakaa linkin tai kysyy tietystä sivustosi sivusta. |
| **Etsi verkosta** | Suorittaa julkisen Google-haun ja palauttaa parhaat tulokset, jotta botti voi vastata oman sisältösi ulkopuolisiin kysymyksiin. | Kun asiakas kysyy jotain yleistä (esim. reittiohjeita, julkista tietoa), jota ei ole tietokannassasi. Käytetään vain, jos verkkohaku on käytössä. |

### Seurantatyökalut

Nämä työkalut edellyttävät, että seurannat (follow-ups) on otettu käyttöön Agenttiisi linkitetyssä kampanjassa.

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Ajoita älykäs seuranta** | Ajoittaa älykkään seurantaviestin käyttäen seurantasarjaussekvenssiäsi – valitsee oikean mallin ja ajoituksen keskustelun perusteella. | Kun asiakas hiljenee tai pyytää bottia "palaamaan asiaan myöhemmin". |
| **Ajoita seuranta** | Ajoittaa perusseurannan tiettyyn aikaan. | Kun botin on edistettävä keskustelua määritettynä ajankohtana. |

### Mukautettujen toimintojen suoritin

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Suorita mukautettu toiminto** | Suorittaa yhden luomistasi ja Agentille määrittämistäsi mukautetuista toiminnoista (katso tämän sivun loppuosa). | Kun asiakkaan pyyntö vastaa jonkin mukautetun toimintosi tarkoitusta. |

### Ravintolavaraustyökalut (Zenchef ja Formitable)

Nämä työkalut ovat käytettävissä vain, kun Zenchef- tai Formitable-integraatio on yhdistetty. Niiden avulla botti voi hallita ravintolavarauksia alusta loppuun.

| Työkalu | Mitä se tekee | Milloin botti käyttää sitä |
|------|--------------|----------------------|
| **Tarkista ravintolan saatavuus** | Etsii vapaat varausajat tietylle päivälle, seurueen koolle ja (valinnaisesti) istuinalueelle. | Kun vieras pyytää pöytävarausta. |
| **Luo ravintolavaraus** | Luo uuden varauksen. | Kun vieras vahvistaa tietyn ajan. |
| **Päivitä ravintolavaraus** | Muuttaa olemassa olevan varauksen päivämäärää, aikaa, seurueen kokoa tai huomautuksia. | Kun vieras pyytää varauksensa muuttamista. |
| **Peruuta tai muuta varauksen tilaa** | Peruuttaa varauksen tai päivittää sen tilan (esim. vahvistettu, ei saapunut). | Kun vieras peruuttaa tai kun botin on merkittävä tilan muutos. |
| **Etsi varauksia** | Etsii olemassa olevia varauksia kriteerien, kuten nimen, sähköpostin tai päivämäärän, perusteella. | Kun palaava vieras kysyy olemassa olevasta varauksesta. |
| **Päivitä vierasprofiili** | Päivittää vieraan profiilin ravintolajärjestelmässä (mieltymykset, huomautukset, yhteystiedot). | Kun vieras kertoo ruokavaliotoiveistaan, uudesta puhelinnumerosta tai muista profiilitason tiedoista. |
| **Listaa ravintolatuotteet** | Hakee listan varattavissa olevista menuista, kiinteistä menuista tai lisäpalveluista. | Kun vieras kysyy "mitä kiinteitä menuja teillä on?" tai botin on liitettävä menu varaukseen. |

### Työkalujen kytkeminen päälle ja pois

Useimpia työkaluja hallitaan Agentin **AI-ominaisuudet**-välilehdellä (tai kampanjan **AI-ominaisuudet**-vaiheessa, jos työskentelet vielä klassisessa kampanjassa):

- **Varaustyökalut** aktivoituvat, kun otat varaukset käyttöön ja yhdistät kalenterin – tämä on toistaiseksi kampanjakohtainen asetus, ja Agentin omalta AI-ominaisuudet-välilehdeltä löytyy suora linkki kyseisen kampanjan vaiheeseen
- **Seurantatyökalut** aktivoituvat, kun otat seurannat käyttöön
- **Ravintolatyökalut** aktivoituvat, kun yhdistät Zenchef- tai Formitable-tilin
- **Verkkohaulla** on oma kytkin **UKK ja tietokanta** -välilehdellä
- **Tehtävätyökalut** voidaan kytkeä pois päältä Agenttikohtaisesti **Salli AI:n luoda tehtäviä** -kytkimellä (ne ovat oletuksena päällä; tilinlaajuinen Tehtävät-kytkin kohdassa **Asetukset → Profiili → Ominaisuudet** kytkee koko tehtäväjärjestelmän pois päältä kaikkialla)
- **Yhteystietojen päivitystyökaluja** hallitaan samalla **AI-ominaisuudet**-välilehdellä – ne määrittävät, saako tekoäly nimetä yhteystietoja uudelleen tai tallentaa niihin kerättyjä lisätietoja
- **Hälytystyökalut** ovat aina käytettävissä; **tunnisteiden lisääminen** tapahtuu automaattisesti jokaisen botin vastauksen jälkeen (se ei ole työkalu, jonka botti valitsee kutsua)

Jos haluat botin lopettavan tietyn sisäänrakennetun työkalun käytön, helpoin tapa on poistaa käytöstä taustalla oleva ominaisuus (esimerkiksi poista varaukset käytöstä kaikkien varaustyökalujen poistamiseksi).

---

## Automaation hallinnoimat funktiot

Jotkin Mukautetut funktiot -sivun merkinnät voivat sisältää **Hallinnoitu automaation kautta** -tunnisteen. Niitä ei ole luotu täällä, vaan ne ovat peräisin automaatiosta, jossa on **AI Agent Function** -käynnistin. Se antaa agentillesi kyvyn, jonka vaiheet rakennat visuaalisesti automaatiopohjalla sen sijaan, että osoittaisit ulkoiseen verkko-osoitteeseen.

Hallinnoitua funktiota ylläpidetään puolestasi: sen nimi, kuvaus ja kentät seuraavat aina automaation käynnistimelle asetettuja tietoja, joten sitä ei voi muokata tai poistaa tältä sivulta — käytä sen **Avaa automaatio** -linkkiä ja muuta itse automaatiota. Voit silti valita tavalliseen tapaan, millä agenteilla se on käytössä: agentin **AI-kyvyt**-välilehdellä se näkyy muiden kykyjen rinnalla tavallisella päälle/pois-kytkimellä (jos sen automaatio on keskeytetty, rivillä lukee niin — kyky aktivoituu, kun automaatio kytketään päälle). Kaikki muu siinä toimii kuten mikä tahansa muu mukautettu funktio: tekoäly päättää, milloin sitä kutsutaan, kerää määrittämäsi tiedot ja voi käyttää automaation vastausta samassa keskustelussa.

Jos valitset näiden kahden välillä: käytä tavallista mukautettua funktiota järjestelmään, jolla on jo osoite kutsuttavaksi; rakenna automaatio AI Agent Function -liipaisimella, kun työ on jotain, jonka haluat koota vaiheista – etsi jotain laskentataulukosta tai tietokannasta, haarauta ehdon perusteella, luo tietueita – ilman, että sinun tarvitsee ylläpitää omaa palvelinta. Katso [Automaatiot](../automations/automations.md#letting-your-ai-agent-call-an-automation).

---

## Tilauksia koskevat vaatimukset

Mukautetut funktiot ovat käytettävissä tilauksissa, jotka sisältävät mukautettujen funktioiden ominaisuuden. Tarkista tilauksesi varmistaaksesi saatavuuden.

---

## Seuraavat vaiheet

- [Yhdistä MCP-palvelimet bottiisi](mcp-servers.md) – valmis työkalupaketti yhden funktion sijaan.
- [Tekoälyagentit](../ai-agents/ai-agents.md) – pääsivu AI Studio -ryhmälle, jossa mukautetut funktiot sijaitsevat ja jossa mukautetut funktiot määritetään botille.
